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)
{
}
这里有两个坑的地方就是,开灯以后记得关闭,不然循环不起来,会导致最后一个灯常亮,还有个就是关闭之前加个延时,不然灯都不亮了