STM32————通过固件库点亮LED灯
由于使用寄存器和使用固件库点亮流水灯的流程大同小异,在此我为了记录方便,采用固件库点亮LED灯的方式来进行记录。
使用寄存器点亮LED灯的方式不过就是需要到STM32的官方文档中去查询每个寄存器的地址。
创建项目
从零开始创建一个项目就需要明白一个完整的项目文件目录包含哪些内容,并且这些内容的作用。尽管繁琐,但有必要。
-
进入Keil软件,新建一个空的项目
-
选择好自己使用的芯片型号
-
点击魔术棒,进行必要的配置,编译代码后需要生成HEX文件,这是要刷到开发板中的程序
-
进入项目文件夹目录中,拷贝必要的开发板驱动文件和库文件,并新建一个main文件用来编写点亮LED灯的代码
由于本项目仅作测试,并未对库文件及用户文件分开存放。实际开发中须规范文件的存放位置
-
回到Keil软件中,将刚刚拷贝的文件添加到Keil项目的目录中
STM32固件库文件的分析我放到附录里。点我跳转到附录
完成以上步骤后编译项目,无报错。整个项目的开发环境才算搭建完成。
编写LED初始化函数
void LED_Config(){
GPIO_InitTypeDef GPIOInitStruct;//定义GPIOInit结构体
RCC_APB2PeriphClockCmd(RCC_APB2ENR_IOPBEN,ENABLE);//打开GPIOB使能时钟信号
GPIOInitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//配置结构体
GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;//配置结构体
GPIOInitStruct.GPIO_Speed = GPIO_Speed_50MHz;//配置结构体
GPIO_Init(GPIOB,&GPIOInitStruct);
}
Main函数编写
int main(void){
LED_Config();//调用LED灯初始化函数
// GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);//引脚置为低电平(默认为低)
return 0;
}
反思
虽然是调用固件库来点亮LED灯,写代码的过程中也出现了很多问题,包括配置环境时漏了一个固件库的头文件。
因为记得STM32中任何外设的使用之前都需要打开时钟使能信号。
所以我存在以下两个认识误区:
- 我在使用RCC外设时,感觉就应该打开AHB总线的使能信号。
- 尽管GPIOB外设是挂载在APB2总线上,但是APB2总线是挂载在AHB总线上的,所以我觉得在使用APB2总线上的外设时应该先打开AHB总线的使能时钟信号。
RCC是复位和时钟控制模块,它负责管理STM32内部的各种时钟源和时钟分频,以及为各个外设提供时钟使能。
AHB总线上只有挂载在AHB总线上外设的时钟使能信号,所以GPIOB只需要打开APB2的时钟使能信号就行了。
附录
汇编编写的启动文件
startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、对用C库函数_main最终去到C的世界
时钟配置文件
system_stm32f10x.c:把外部时钟HSE=8M,经过PLL倍频为72M
外设相关的
stm32f10x.h:实现了内核之外的外设的寄存器映射
stm32f10x_xx.c:外设的驱动函数库文件
stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,驱动外设固件库函数的声明
xxx:GPIO USART I2C SPI FSMC
内核相关的
CMSIS-Cortex 微控制器软件接口标准
core_cm3.h:实现了内核之内的外设的寄存器映射
core_cm3.c:
NVIC(嵌套向量中断控制器)、sysTick(系统滴答定时器)
misc.h
misc.c
头文件的配置文件
stm32f10x_conf.h
专门存放中断服务函数的C文件
stm32f10x_it.c
stm32f10x_it.h
中断服务函数你可以随意放在其他的地方,并不是一定要放在stm32f10x_it.c
#include “stm32f10x.h”
int main(void){
//来到这里的时候,系统时钟已经配置成72M
}