STM32通用定时器中断编程实验指南
创作时间:
作者:
@小白创作中心
STM32通用定时器中断编程实验指南
引用
CSDN
1.
https://blog.csdn.net/qq_59757948/article/details/139695497
在单片机开发中,当需要产生严格时序的场景(如DAC输出特定模拟信号或GPIO口控制模拟开关)时,简单的延时函数往往无法满足要求。本文通过一个具体的实验,详细介绍了如何使用STM32的通用定时器中断来实现精确的时序控制。实验中,我们将控制开发板上的LED0和LED1,使其按照LED0亮500ms后熄灭、随后LED1亮100ms后熄灭的循环时序工作。
实验步骤
设定时钟总线频率
本实验使用默认的16MHz时钟总线频率。配置定时器参数
需要设置定时器的预分频系数和自动重装载计数器的值。使能中断并设置优先级
配置定时器中断并调整其优先级。代码实现
(1)在定时器初始化函数中开启定时器7中断
/* TIM7 init function */ void MX_TIM7_Init(void) { /* USER CODE BEGIN TIM7_Init 0 */ /* USER CODE END TIM7_Init 0 */ TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM7_Init 1 */ /* USER CODE END TIM7_Init 1 */ htim7.Instance = TIM7; htim7.Init.Prescaler = 3999; htim7.Init.CounterMode = TIM_COUNTERMODE_UP; htim7.Init.Period = 199; htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim7) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM7_Init 2 */ HAL_TIM_Base_Start_IT(&htim7);//开启定时器7中断 /* USER CODE END TIM7_Init 2 */ }
(2)在
stm32f4xx_it.c
中找到中断处理函数(3)查看中断回调函数的底层逻辑
(4)重写虚函数并定义所需全局变量
/* USER CODE BEGIN EV */ uint8_t g_timTick=0; //定时器中断节拍 uint8_t g_timSwitch=0; //定时器中断“门票” /* USER CODE END EV */
/* USER CODE BEGIN 1 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM7){ //涉及到多个定时器中断的时候检查就很有必要了 const uint8_t increment=1; //计数步长为常量1 g_timTick = (g_timTick + increment) % 5; //5:1的GPIO口时序 } g_timSwitch++; //回调函数发放门票 } /* USER CODE END 1 */
(5)在
stm32f4xx_it.c
中声明全局变量/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "main.h" //防止uint8_t无法被编译器识别 /* USER CODE END Includes */ /* Exported types ------------------------------------------------------------*/ /* USER CODE BEGIN ET */ /* USER CODE END ET */ /* Exported constants --------------------------------------------------------*/ /* USER CODE BEGIN EC */ extern uint8_t g_timTick; extern uint8_t g_timSwitch; /* USER CODE END EC */
(6)主函数中编写功能函数
if(g_timSwitch){ g_timSwitch--; //进入主循环则收回门票,防止CPU重复判断 if(g_timTick==0){ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); }else{ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); } }
(7)下载验证
观察到单片机开发板的LED灯进行频闪,试验成功。不过从波形上来看会有较大的误差,因为只有500ms的时序是用中断严格实现的。想要精准控制原理就是上述的那些,感兴趣的同学可以自己试一试。
补充说明:高级定时器的内部时钟计时操作
从模式选择触发模式(Reset Mode),触发源选择内部触发(ITRx即Internal Trigger Input),时钟源选择内部时钟,其他和通用定时器基本相同。最后请大家注意每一个操作的timer挂载的始终总线(APB1之类的)。
热门推荐
防雷器的正确接线方法步骤和选型方案
MOSFET的主要参数(选型)
办卡用哪个套餐更合适?
山梨酸钾和苯甲酸钠哪个好:比较与选择
儿童床垫的要求有哪些 儿童床垫国家标准
抚养关系如何认定
证明存在事实抚养关系的途径与方法
黄酒加什么食材好喝
大数据视野下的彩礼价格变动态势、地区差异与治理策略
全国第一!山东这些美丽海岸缘何上榜?
姑娘们的大粗腿,是“地母系”审美的反击
马拉色菌会传染别人吗
点阵激光和光子嫩肤的区别在哪?技术原理、治疗结果、适用人群和价格等都存在差异!
科普:在岸人民币和离岸人民币
银行的信用卡年费可以通过参与活动减免吗?
夏季要做的事情| 30 多项不容错过的活动,享受无尽乐趣
企业如何有效防范团队诈骗?十四项关键措施全解析
公司辟谣周杰伦豪赌输数十亿,平台AI曾判断相关传闻存疑,专家解析AI辟谣应用可能
怎么锻炼手部的灵活度
如何使用谷歌浏览器快速定位信息
姜夔《扬州慢》:词中的音乐与情思
银行账户分类标准:为您解读多样化的账户选择
人类有机理论:AI为何难以超越人类的独特能力
十二星座恋爱指南:发挥优点,克服不足,让爱情更美好
家庭病床——让群众在家也有“医”靠
实名羡慕!这所高校公布接收调剂研究生信息,不收学费,还有补助
看了关系图解,原来柯南是真的“万恶之源”
权力斗争下的牺牲品:秦桧与岳飞的悲剧冲突
逆流交易的定义、影响及会计处理方法
茶叶抗氧化的奥秘:探究茶叶的抗氧化成分、功效及其健康益处