李建波 张永亮 梁振华
摘要:介绍了嵌入式芯片STM32图形化配置软件STM32CubeMX,以定时器2为例,信号源为内部时钟,当计数溢出时产生定时器中断。通过分析STM32CubeMX定时器中断处理机制,并进行软件仿真和硬件实验,从技术上为开发者提供帮助。
关键词:定时器中断;中断回调函数;STM32CubeMX
中图分类号:TH85+1 文献标识码:A
文章编号:1009-3044(2020)08-0248-02
1 简介
STM32CubeMX是ST意法半导体近几年来大力推荐的STM32芯片图形化配置工具,允许用户使用图形化向导生成C初始化代码,可以大大减轻开发工作、时间和费用[1-2]。 聊城大学物理科学与信息工程学院罗清龙等对如何将STM32CubeMX引入本科嵌入式实验教学改革进行了实践[3],广东机电职业技术学院电子与通信学院李建波等分析了将STM32CubeMX引入高职嵌入式系统设计课程教学中[4],西安工程大学电子信息学院罗瑶等将STM32CubeMX用在高速USB通信模块设计中[5]。
目前没有发现文章对STM32CubeMX定时器中断进行分析,而定时器中断是处理器实时处理事件的一种内部机制,是很重要的一个环节。本文利用STM32CubeMx设置TIM4定时中断功能,追踪了定时中断矢量,在定时中断回调函数中编写了服务代码,并进行了软件仿真和硬件验证。
2 总体设计
利用STM32CubeMX软件进行定时器配置,生成代码。打开工程进入Keil开发环境,进行定时器中断代码编辑、编译,生成可执行文件。在仿真软件Proteus选择STM32芯片,并装载可执行文件,进行仿真观察。利用ST-Link或JLink,将代码下载到开发板,进行硬件调试。
3 STM32CubeMX软件
3.1选择控制器
打开STM32CubeMX,点击菜单栏File—New Project新建项目,输入STM32F103C6,选择STM32F103C6Tx芯片。在引脚配置界面,配置复位和时钟控制RCC;进行时钟配置,系统时钟为8MHz;配置系统模式SYS Mode and Configuration;将PB9配制成GPIO_Output输出模式。
3.2 配置TIM2
在引脚配置界面,类别Categories中选择TIM2,在TIM2I作模式Mode配置时钟源为内部时钟,在设置Configuration中参数设置Parameter Setting中,配置分配系数为7999,计数周期为999,如图l所示。
定时器中断频率:
ft2=fosc/((Prescaler+ l)*( Counter Pe riod+l))
f0。系统时钟为8MHz,Prescaler为7999,Counter Period为999,代入公式1,得到
f1=8000000/《7999+1)*(999+1))=1Hz
定时器中断周期:Tt2=1/ft2=ls,周期为1秒。
3.3设置定时器中断
在定时器模式和配置一Configuration配置窗口,选择嵌套向量中断控制器设置NVIC Settings,勾选TIM2 global inter-rupts。如果定时周期到,则进入定时器中断函数。
3.4生成代码
选择菜单栏Project,点击Generate Code,生成用户代码、复制库文件,点击Open Project即可进入Keil编辑环境。
4 Keil开发环境
4.1中断初始化
打开mam.c主文件,将鼠标移动到定时器初始化函数MX_TIM2_1nit0;点击右键,查看定义:
void MX_TIM2_1nit(void){
TIM_ClockConfigTypeDef sClockSourceConfig={0};
TIM_MasterConfigTypeDef sMasterConfig=(0};
htim2.1nstance= TIM2;
htim2.Init.Prescaler= 7999;
htim2.Init.CounterMode= TIM—COUNTERMODE_UP;
htim2.Init.Period= 999;
htim2.Init.ClockDivision=TIM—CLO CKDIVISION_DIV l;
htim2. Init. AutoReloadPreload=TIM- AUTORELOAD_PRE-LOAD_DISABLE;
HAL_TIM_Base_lnit(&htim2);...)
可以看到分頻系数Ptescaler为7999,计数周期999。
4.2 定时器中断函数
1)定时器2中断函数
如果定时周期到,则进入定时器2中断函数voidTIM2_IRQHandler(void).
2)定时器中断函数
在void TIM2_IRQHandler(void)中,调用了函数HAL_TIM_IRQHandler(&htim2);进入该函数定义。因为比较长,只分析相关部分。
if
(_HAL_TIM_ GET- IT_SOURCE(htim,
TIM_IT_UP-DATE)!= RESET){
一HAL-- TIM_CLEAR_IT(htim, TIM_IT_UPDATE);