使用内存地址点亮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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值