stm32核心板可以点亮灯吗_STM32寄存器操作点亮LED灯

点击上方“蓝字”关注我们

物联网协会终于把公众号密码记起来了???

7f808cb4c001ddefa9ca4b90b13b5f12.gif

在学习编程语言的时候,第一个程序

是"Hello World!"

学习51单片机的时候,第一个程序

是点亮LED灯

现在开始学习到STM32

第一个程序必须也得是点亮LED灯

因为“祖师爷”说过

当能够输出"Hello World!"或者点亮LED灯的时候,就掌握了90%的知识,可以出师了

3908e5601159b9af831d3ab5a34fb87b.gif

1

63e57ad40d62ae86f21e28a1f03840b5.gif

注:虽然现在趋势是使用STM32CubeMX生成HAL库来编写,但为了让大家理解下STM32的底层操作,本次将使用寄存器操作方式来实现点亮LED灯。小编使用STM32103RCT6芯片的开发板演示。

新建工程模板

使用Keil5就像使用51单片机一样创建一个工程项目,只不过将芯片选择为自己所使用的;加上main.c后编写main函数,编译一轮发现报错了

8e0a155936e50f911fd821745639902c.png

这主要是因为没有添加启动文件,其实在新建51单片机工程的时候自动添加了STARTUP.A51文件,而在STM32中就要手动添加。

添加启动文件

首先要选择适合自己芯片的启动文件,打开STM32F10X的固件库并且通过FLASH容量进行选择。

27e2acd869085b2246d49efa05c0a3a9.png

小编的是256k容量,选择的是"startup_stm32f10x_hd.s"

把启动文件添加放到工程目录下,打开工程添加刚刚的启动文件。并且main.c下添加一个函数 void SystemInit(void){   }

ca44253ac5a05685be9e262bdae5a568.png

配置相关寄存器

不管是使用库函数或者HAL库开发,其实都是对寄存器的操作。通过开发板原理图可以发现LED0的引脚为PA8、LED1的引脚为PD2,输出低电平时点亮LED灯。

b33b0ea48f87cf24ac01c51733891b7e.png

通过查看“STM32F10x参考手册”配置寄存器,发现控制IO口输出高电平还是低电平的有3个,但是只需要配置ODR寄存器就可以了。ODR寄存器的偏移地址是0x0C,若是点亮LED1即是将PD2置0。首先找到GPIOD的起始地址再加ODR寄存器的偏移地址就能够对PD2引脚进行清零操作了。

e42f7326550ab43b2cd44a624d923c4b.png

0d710c741569ce7270813555a234fbab.png

GPIOD起始地址:0x4001 1400

ODR的偏移地址:0x0C

两个地址相加后:0x4001 140C

PD2置0:0X4001 140C &= ~(1 << 2);

把程序下载到开发板发现LED并没有点亮。

842e42fda7e0a5d4c77fbd3626f5edbf.gif

b76395a4f84688585e412aa2c37334b6.png

这是因为STM32和51单片机不同,STM32的IO口为输入模式还是输出模式也是由寄存器控制的。看参考手册得知有“端口配置低寄存器(CRL)”配置0到7位“端口配置高寄存器(CRH)”配置8到15位

f86266d330f642f778320b372ad8fda3.png

5861fee4603020b595d8dc13b62f2fb0.png

GPIOD起始地址:0x4001 1400

CRL的偏移地址:0x00

两个地址相加后:0x4001 1400

PD2写1:0X4001 1400 |= (1 << (2 * 4));

再次下载开发板后,LED灯果然还是不亮的!!!

bb8055f32d2a2b5744d47c3413f65044.gif

b76395a4f84688585e412aa2c37334b6.png

这是因为STM32为了降低功耗,每个外设都有时钟控制的,默认是全部关闭的,要是使用外设就要打开时钟。时钟是由RCC寄存器控制的,且挂载在APB2总线上。

所以只要找到RCC寄存器的起始地址然后加上APB2的偏移地址就可以使能GPIO时钟了。

cd51ee2d7d2b9845954cfc66a6653bb2.png

f443de9271355a914d419ee542d63167.png

RCC起始地址:0x4002 1000

APB2的偏移地址:0x18

两个地址相加后:0x4002 1018

使能GPIOD:0x4002 1018 |= (1 << 5 );

b05de02f694c75d5e1b9bba667fbd659.png   

完整代码

53ef7f85ff53ee17bf0470f130be286f.png

下载到开发板后,LED灯神奇地点亮了!!!

总结操作步骤

  1. 在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】可以获取固件库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值