使用内存地址点亮LED—跟51单片机一样写代码教学(初步入门)

51单片机点亮一个小灯

          #include <rge52.h>

           sbit LED = P0^0

          void main(void)
         {
           P0 = 0XFE; // 总线操作 sfr P0 0X80

            LED = 0; // 位操作
         }

STM32中

     

STM32通过一个寄存器控制电平的输出ODR  ;CRL CRH实现在端口的配置(用绝地地址,目前我们没有寄存器映射,上篇文章有写。)

           配置PC2使LED点亮  下图为GPIOX_CRL的配置说明

         (四位控制一个GPIOx的端口我们要控制PC2也就是GBIOC的第二个引脚,故要配置CNF2和MODE2  配置为00 01 (00推挽输出)(01速度10MHZ))

                               

                                         

                                         

                                                               (对于GPIOC的时钟,只要打开4位置即可)

                                                    

下面我们来算一下GPIOC_CRL和GPIOC_ODR以及所对应时钟(RCC_APB2ENR)的内存地址(STM32中文参考手册) 

1.在存储器和总线架构中我们找到存储器映像 0x4001 1000 - 0x4001 13FF  GPIO端口C    0x4002 1000 - 0x4002 13FF   复位和时钟控制(RCC)

2.在RCC寄存器描述中-> APB2外设时钟使能寄存器(RCC_APB2ENR) 可知道他相对于RCC的偏移地址位 0x18

3.在通用和复用功能I/O(GPIO/AFIO)中,端口配置低寄存器(GPIOx_CRL) (x=A..E) 的偏移地址为0x00 端口输出数据寄存器(GPIOx_ODR) (x=A..E) 的偏移地址为0x0C
4.这样我们可以算出

GPIOC_CRL 的地址为:0x4001 1000+0x00=0x4001 1000;

GPIOC_ODR的地址为:0x4001 1000+ 0x0C=0x4001 100c ;

RCC_APB2ENR的地址为:0x4002 1000+0x18 =0x4002 1018;



项目目录:

main函数内容为:

       // 打开 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 * )0x4001100c &= ~(1<<2);//点亮
//*( unsigned int * )0x4001100c |= (1<<2);//熄灭
原文地址:https://www.cnblogs.com/wenshinlee/p/8805173.html