本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考;
本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过定时器3 每秒中断控制 PB9 引脚输出高低电平,从而实现 LED 灯的亮灭。
原理:通过配置定时器3每1mS进入中断一次,每进入中断服务程序一次,增加一次计数,计数到达500,控制PB9引脚输出高或低电平,从而实现1S钟周期闪烁。。
涉及到的知识:配置UART引脚,定时器中断,STM32CubeMX的使用
文章目录
- 1 新建工程
- 2 配置SWD下载引脚
- 3 配置GPIO输出
- 4 配置RCC
- 5 设置系统主频
- 6 定时器配置
- 6.1 错误配置记录
- 6.2 正确配置
- 7 生成工程
- 8 增加代码实现每1S 控制PB9 引脚输出高或者低电平
1 新建工程
点击File 菜单下的New Project
选择芯片型号,如下图所示先输入芯片型号,目前这边输入STM32G030C8,
双击选择,就确定了芯片型号,界面会变成如下图所示
2 配置SWD下载引脚
如下图所示,在Pinout&Configuration 栏目的System Core 下,先点击SYS,再勾选Serial Wire 框,
配置好SWD 下载引脚设置:
3 配置GPIO输出
按下图 的1,2,3 步骤完成PB9 引脚配置成GPIO 输出设置:
配置成功后如下图所示:
4 配置RCC
如下图,先点击RCC,在HSE 配置中选择Crystal/Ceramic Resonator 外部晶振设
5 设置系统主频
如下图, 先点击Clock Configuration 栏目,按下图的1,2,3,4 步骤完成系统64MHZ 主频设置:
6 定时器配置
6.1 错误配置记录
如下图的1,2,3,4 步骤完成定时器1ms 计时:
(注意,这里我踩了一个坑,误以为Clock source中的Internal Clock为内部时钟,而我是使用的外部晶振,所以我一直选择了第二个选项ETR2。其实第二个选项是ETR2 外部触发输入(ETR)(仅适用TIM2,3,4),意思外接界的其他信号源;正确的应该是:外部晶振也是internal clock ,相当于使用外部时钟分频来的时钟,只要你rcc配置的是外部晶振就没事),所以下面的示例是错误的,正确过程请参考6.2
ETR2 外部触发输入(ETR)(仅适用TIM2,3,4),意思外接界的其他信号源。
如下图所示完成TIM3 中断使能:
6.2 正确配置
如下图的1,2,3,4 步骤完成定时器1ms 计时:
因为我们选择的是64MHz的外部时钟,64分频,1000计数时,1ms产生一次中断。
上图中各个参数的计数以及计数器周期计算方法如下:
Clock Source(时钟来源) :本文中使用的64MHz外部晶振也要使用Internal Clock
计数器设置:
Prtscaler (定时器预分频系数) : 63
Counter Mode(计数模式) : Up(向上计数模式)
Counter Period(自动重装载值) : 999
CKD(时钟分频因子) : No Division 不分频 (可以选择二分频和四分频 )
auto-reload-preload(自动重装载) : Disable 不使能
定时器的定时周期计算方法:T = (psc+1)(arr+1)/Tclk
其中psc 为定时器预分频系数 arr为自动重装载值 Tclk为系统时钟频率
通过计算 T = (psc+1)(arr+1)/Tclk=(63+1)(999+1)/64us=1000us=1ms
因此实现了1ms中断。
如下图所示完成TIM3 中断使能:
7 生成工程
按照下图的步骤,进行项目配置,项目名称和路径设置等,生成项目的类型选择STM32CubeIDE(我这里以STM32CubeIDE为例,如果你要试用keil5,那就选择MDK-RAM,如果要使用makefile,就选择Makefile),注意项目名称和路径不要有中文名;
最后全部设置完毕后点击create code,生成项目代码:
生成的工程如下图所示:
8 增加代码实现每1S 控制PB9 引脚输出高或者低电平
如下图,如箭头所示实现1ms 中断回调函数中实现计数到500ms 后PB9 翻转输出,
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//1ms中断回调函数
{
TimeCounter++;
if(TimeCounter>=500)//500ms时间到
{
TimeCounter=0;
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);//LED反转输出
}
}