点击上方“蓝字”关注我们
物联网协会终于把公众号密码记起来了???
在学习编程语言的时候,第一个程序
是"Hello World!"
学习51单片机的时候,第一个程序
是点亮LED灯
现在开始学习到STM32
第一个程序必须也得是点亮LED灯
因为“祖师爷”说过
当能够输出"Hello World!"或者点亮LED灯的时候,就掌握了90%的知识,可以出师了
1
注:虽然现在趋势是使用STM32CubeMX生成HAL库来编写,但为了让大家理解下STM32的底层操作,本次将使用寄存器操作方式来实现点亮LED灯。小编使用STM32103RCT6芯片的开发板演示。
新建工程模板
使用Keil5就像使用51单片机一样创建一个工程项目,只不过将芯片选择为自己所使用的;加上main.c后编写main函数,编译一轮发现报错了
这主要是因为没有添加启动文件,其实在新建51单片机工程的时候自动添加了STARTUP.A51文件,而在STM32中就要手动添加。
添加启动文件
首先要选择适合自己芯片的启动文件,打开STM32F10X的固件库并且通过FLASH容量进行选择。
小编的是256k容量,选择的是"startup_stm32f10x_hd.s"
把启动文件添加放到工程目录下,打开工程添加刚刚的启动文件。并且main.c下添加一个函数 void SystemInit(void){ }
配置相关寄存器
不管是使用库函数或者HAL库开发,其实都是对寄存器的操作。通过开发板原理图可以发现LED0的引脚为PA8、LED1的引脚为PD2,输出低电平时点亮LED灯。
通过查看“STM32F10x参考手册”配置寄存器,发现控制IO口输出高电平还是低电平的有3个,但是只需要配置ODR寄存器就可以了。ODR寄存器的偏移地址是0x0C,若是点亮LED1即是将PD2置0。首先找到GPIOD的起始地址再加ODR寄存器的偏移地址就能够对PD2引脚进行清零操作了。
GPIOD起始地址:0x4001 1400
ODR的偏移地址:0x0C
两个地址相加后:0x4001 140C
PD2置0:0X4001 140C &= ~(1 << 2);
把程序下载到开发板发现LED并没有点亮。
这是因为STM32和51单片机不同,STM32的IO口为输入模式还是输出模式也是由寄存器控制的。看参考手册得知有“端口配置低寄存器(CRL)”配置0到7位,“端口配置高寄存器(CRH)”配置8到15位
GPIOD起始地址:0x4001 1400
CRL的偏移地址:0x00
两个地址相加后:0x4001 1400
PD2写1:0X4001 1400 |= (1 << (2 * 4));
再次下载开发板后,LED灯果然还是不亮的!!!
这是因为STM32为了降低功耗,每个外设都有时钟控制的,默认是全部关闭的,要是使用外设就要打开时钟。时钟是由RCC寄存器控制的,且挂载在APB2总线上。
所以只要找到RCC寄存器的起始地址然后加上APB2的偏移地址就可以使能GPIO时钟了。
RCC起始地址:0x4002 1000
APB2的偏移地址:0x18
两个地址相加后:0x4002 1018
使能GPIOD:0x4002 1018 |= (1 << 5 );
完整代码
下载到开发板后,LED灯神奇地点亮了!!!
总结操作步骤
在main.c下添加一个void SystemInit(void){ } 函数
int main(void){ while(1) { }}void SystemInit(void){}
2.在确定LED的引脚和输出模式后,首先打开GPIO的时钟。即是RCC寄存器的起始地址加上APB2总线的偏移地址,然后根据IO口位置进行配置。比如使能GPIOA就是 1 << 2 ; 使能GPIOD就是 1 << 5。
//RCC寄存器的起始地址:0x40021000//APB2总线的偏移地址: 0x18//相加得到:0x40021018//要是想使能GPIOD就只对第5位进行写1操作// 0x40021018 |= (1 <//由于是对地址进行操作,那就需要指针变量了 *(unsigned int*)0x40021018 |= (1 <
3. 配置CRL寄存器,配置为通用推挽输出模式(前提是引脚在0到7位,若是8到15位如“PA8” 就是去配置CRH高寄存器了 )。要是将PD2配置为通用推挽输出模式(在CNFy[1:0]中选“00”),最大速度为10MHz(在MODEy[1:0]选择"01"代表输出模式,最大速度为10MHz)。由于是PD2即配置CNF2[1:0]和MODE2[1:0],即是将第8到第11位配置成“ 0001 ” 将第8位写1:1 << 8
// GPIOD的起始地址:0x40011400// CRL寄存器的偏移地址:0x00// 两者相加:0x40011400//配置为通用推挽输出模式和选择最大速度*(unsigned int*)0x40011400 |= (1 << 8);
4.配置ODR寄存器,选择是输出高电平还是低电平。然后对相应的引脚进行配置,高电平时是1,低电平时是0。
// GPIOD的起始地址: 0x40011400// ODR寄存器的偏移地址:0x0C// 两者相加:0x4001140C//若是配置PD2为低电平 点亮LED灯,即是对第2位清零操作*(unsigned int*)0x4001140c &= ~(1 << 2);//若是配置PD2为高电平 熄灭LED灯,即是对第2位写1操作*(unsigned int*)0x4001140c |= (1 <2);
本次分享就到这啦
欢迎大家和小编共同学习STM32
回复关键词【0412】可以获取固件库