• 使用寄存器点亮LED(第2节)—寄存器映射代码讲解


           

           // 打开 GPIOB 端口的时钟
           *( unsigned int * )0x40021018|=  ( 1 << 4 );
        
           // 配置PC2 IO口为通用推挽输出,速度为10M

             *( unsigned int * )0x40011000 &=~ ( 0x0f << (4*2) );//GPIOC IO 4位清空
             *( unsigned int * )0x40011000 |= ( 1 << (4*2) );// 通用推挽输出,速度为10M

          // 控制 ODR 寄存器
           *( unsigned int * )0x4001 100c &= ~(1<<2);

           我们在使用内存地址点亮LED灯中使用内存地址点亮,但是这种可读性极差,外人根本不知道干什么的。下面我们介绍另外一种方法 给这些内存地址起别名。(称为寄存器映射)

    相当于我们在51单片机中头文件中的内容的定义。(我们之所以能用P0=....;这是因为我们在reg52.h中已经写好了映射 sfr P0=0x80)。

          现在我们打开STM32的中文参考手册   2 存储器和总线构架------>存储器映像可以看多所以外设对应的地址单元。

     

     

    这三张图呢我们先说:

                第一张为STM32的系统架构图,我们可以看见所有的外设(最外边的红线框)均挂在到AHB总线上,AHB总线再分四个,分别为SDIO RCC APB1 APB2.  

                第二张为挂载在AHB总线上的所有外设地址。其实AHB起地址为0x4000 0000(由底向上看,最开始的地址)。这样我们在设计寄存器映射是可以定义AHB为基地址。

                           (小技巧:我们在定义RCC的基址是可以定义为DMA1,而不是定义为SDIO,因为DMA1的地址特别整齐,这样好计算。只要将SDIO的地址单独定义即可。事实上官             方也是这样定义的。)

     

     

    小灯PC2的电路图:PC2含义GPIOC第二引脚

     

    代码:

    Stm32f10x.h的内容:

    // 用来存放STM32寄存器映射的代码
    
    // 外设  perirhral
    
    #define  PERIPH_BASE               ((unsigned int)0x40000000)  //AHB
    #define  APB1PERIPH_BASE           PERIPH_BASE
    #define  APB2PERIPH_BASE          (PERIPH_BASE + 0x10000)
    #define  AHBPERIPH_BASE           (PERIPH_BASE + 0x20000)//小技巧
    
    
    #define  RCC_BASE                (AHBPERIPH_BASE + 0x1000)
    #define  GPIOC_BASE              (APB2PERIPH_BASE + 0x1000)
    
    
    #define  RCC_APB2ENR            *(unsigned int*)(RCC_BASE + 0x18)
        
    #define  GPIOC_CRL              *(unsigned int*)(GPIOB_BASE + 0x00)
    #define  GPIOC_CRH              *(unsigned int*)(GPIOB_BASE + 0x04)
    #define  GPIOC_ODR              *(unsigned int*)(GPIOB_BASE + 0x0C)

    main中的内容:

           // 打开 GPIOB 端口的时钟
           RCC_APB2ENR|=  ( 1 << 4 );
          //配置PC2 IO口为通用推挽输出,速度为10M
           GPIOC_CRL&=~ ( 0x0f << (4*2) );//GPIOC IO 4位清空
           GPIOC_CRL|=  ( 1 << (4*2) );// 通用推挽输出,速度为10M
          // 控制 ODR 寄存器
           GPIOC_ODR&= ~(1<<2);//// GPIOC_ODR|= (1<<2);  //

     

     

     

  • 相关阅读:
    txt文本处理---行未添加逗号
    wav转txt格式的代码实现(c,python)
    程序员的健康--预防
    程序员的健康--病因
    朴素贝叶斯算法简介及python代码实现分析
    hdf 5文件格式及python中利用h5py模块读写h5文件
    C 语言restrict 关键字的概念及使用例子
    一个程序员卑微的目标
    【ES】学习4-结构化搜索
    【python】正则表达式中的转义问题
  • 原文地址:https://www.cnblogs.com/wenshinlee/p/8810115.html
Copyright © 2020-2023  润新知