本周学习了利用寄存器操作点亮LED灯,学习教程和素材均来自海创电子工作室。以下分成几点叙述学习内容:
一、启动文件添加
本次学习用到的是STM32f103c8t6单片机。
打开keil5,新建project,选择型号为f103c8
选择好保存路径后,双击Source Group根据FLASH选择合适的启动文件,如下图所示,我选用的是startup_stm32f10x_hd.s
二、相关寄存器配置
根据原理图可以看出,想要点亮LED,则需要PC13为低电平。stm32的引脚复杂,不仅要配置低电平还要配置是输入还是输出,如果是输出的话还要配置输出速度。
在官方提供的STM32F10x系列编程手册中我们可以得到寄存器的基地址、偏移地址和复位值,我们可以看到GPIOC中的第0位需要CNF0和MODE0这4各位来控制,GPIOC中的第1位需要CNF1和MODE1这4各位来控制。我们常用的七个寄存器在内存中依次排列,每个寄存器占四个字节,也就是说每四位确定一个引脚功能。
根据上表可写出以下代码实现通用推挽输出模式:
GPIOC_CRH &= ~(0x0F<<(4*5));
GPIOC_CRH |= (1<<(4*5));
再根据手册可知ORD配置输出,IRD配置输入,我们现在看输出:
GPIOC_ODR &= ~(1<<13);//配置输出低电平
GPIOC_ODR |= (1<<13);//配置输出高电平
还需要根据手册内容打开GPIOC时钟:
RCC_APB2ENR |=(1<<4);//打开GPIOC时钟
那么我们就可以得出点亮LED的代码:
int main(void)
{
*(unsigned int*)0x4002 1018 |=(1<<4);//打开时钟
*(unsigned int*)0x40011004 &= ~(0x0F<<(4*5));//配置输出模式
*(unsigned int*)0x40011004 |= (1<<20);
*(unsigned int*)0x4001 100C&=~(1<<13)//配置输出低电平
}
三、思路总结
根据对寄存器操作的了解我们可以得出点亮LED灯编写代码的基本思路:
1.打开PC13对应的时钟;
2.配置输出,确定输出的模式;
3.输出低电平。
四、增加可读性
上一步的代码虽然简单、有利于单片机的编译,但对于编写代码的人来说缺少可读性,并且编写也非常困难,那么我们就需要创建一个头文件来对这些代码进行定义,方便对它们的使用。
先在文件中新建一个文件"stm32f10x.h":
那么在运行代码中我们只需要利用这些变量的名字就可以了,不需要将每一位数字都打出来。