APP下载

STM32CubeMX定时器中断回调函数的研究

2020-05-13李建波张永亮梁振华

电脑知识与技术 2020年8期

李建波 张永亮 梁振华

摘要:介绍了嵌入式芯片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);