stm32点灯之路

1、最近初学了单片机,开发板用的是星火的指南者。

2、点灯程序没有直接使用官方的固件库,而是直接操作了寄存器的地址,这样比较直观的看到根源,毕竟库是封装过一层。

3、点灯一共分为3步:打开时钟、配置端口寄存器、配置ODR寄存器

4、下面直接上图:

这里三个灯都属于寄存器的低8位,所以配置端口寄存器的时候使用低端口寄存器CRL

5.开始查找手册,PB引脚属于GPIO_B,所以要电亮灯,要是的GPIO_B的ODR寄存器的0,1,5位,分别置低电平,使得3.3v下拉,电亮灯

6.GPIO_B基地址0x4001 0400,ODR偏移地址0,CRL偏移地址00,手册可查

7.从手册上看RTC时钟属于AHB总线,查找手册起始地址为0x4002 1000,偏移0x18

8.下面是代码

#include "stm32f10x.h"

void delay(int time)
{    
   int i=0;  
   while(time--)
   {
      i=12000;
      while(i--) ;    
   }
}


int main(void)
{

    //GPIO_B的时钟打开
    *(unsigned*)0x40021018 |= ((1)<< 3);
    
    while(1)
    {
    //绿:配置ODR寄存器最低位为低电平

    *(unsigned*)0x40010C00 |= ((1)<<(4*0));
    *(unsigned*)0x40010C0C &=~(1<<0);
    delay(50);
    *(unsigned*)0x40010C0C |=(1<<0);
    //红:配置ODR寄存器最低位为低电平
    //delay(100);
  *(unsigned*)0x40010C00 |= ((1)<<(4*5));
    *(unsigned*)0x40010C0C &=~(1<<5);
    delay(50);
    *(unsigned*)0x40010C0C |=(1<<5);
    //蓝:配置ODR寄存器最低位为低电平
    //delay(100);
    *(unsigned*)0x40010C00 |= ((1)<<(4*1));
    *(unsigned*)0x40010C0C &=~(1<<1);
    delay(50);
  *(unsigned*)0x40010C0C |=(1<<1);
    }
    
}

void SystemInit(void)
{


}

这里有两个坑的地方就是,开灯以后记得关闭,不然循环不起来,会导致最后一个灯常亮,还有个就是关闭之前加个延时,不然灯都不亮了

上一篇:c深刨关键字3——彻底搞明白整型在内存的存储!


下一篇:MySql中int 与 int unsigned 的区别