STM32——定时器中断
一、STM32 通用定时器是什么STM32F103 内部的TIM2、TIM3、TIM4、TIM5都属于通用定时器。它们的核心功能定时中断PWM 输出输入捕获输出比较本篇我们使用最基础、最常用的定时中断功能。二、通用定时器中断工作原理定时器有一个计数器从 0 开始向上数系统时钟 72MHz 太快需要分频Prescaler降速计数器数到自动重装载值Period时产生溢出溢出后触发更新中断Update InterruptCPU 立刻响应进入中断服务函数执行任务执行完后计数器自动清零重新开始计数一句话总结分频 重装载值 → 决定多少秒进一次中断。三、定时时间计算公式定时时间秒 [( 分频系数 1 ) × ( 自动重装载值 1 )] / 定时器时钟STM32F103 定时器时钟 72MHz四、tim.c定时器核心文件#include tim.h #include stm32f10x.h void Base_TIM_Init(void) {1. 定义结构体TIM_TimeBaseInitTypeDef TIM_TimeInitStruct; NVIC_InitTypeDef NVIC_InitStruct;TIM_TimeBaseInitTypeDef定时器基本配置结构体NVIC_InitTypeDef中断优先级配置结构体2. 开定时器时钟必须第一步RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM2 挂载在 APB1 总线上任何外设必须先开时钟才能工作不开时钟 → 定时器完全不工作3. 配置定时器基本参数TIM_TimeInitStruct.TIM_ClockDivision TIM_CKD_DIV1;时钟分频不分频一般默认写TIM_CKD_DIV1即可TIM_TimeInitStruct.TIM_CounterMode TIM_CounterMode_Up;计数器模式向上计数模式从 0 → Period 往上数数满溢出TIM_TimeInitStruct.TIM_Prescaler 10000;分频系数把 72MHz 时钟进行 10001 分频分频后计数器时钟 72MHz / 10001 ≈ 7199HzTIM_TimeInitStruct.TIM_Period 7200;自动重装载值计数器从 0 数到 7200 溢出溢出触发中断TIM_TimeInitStruct.TIM_RepetitionCounter 0;高级定时器用通用定时器写 0⭐ 本代码的定时时间计算(10000 1) × (7200 1) / 72000000 ≈ 1 秒结论每 1 秒进入一次定时器中断。4. 初始化定时器TIM_TimeBaseInit(TIM2, TIM_TimeInitStruct);把参数写入 TIM2 寄存器。5. 开启更新中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);开启定时器溢出中断计数器数满 → 触发中断6. 启动定时器TIM_Cmd(TIM2, ENABLE);启动后定时器才真正开始计数不写这句定时器永远不工作7. NVIC 中断优先级配置NVIC_InitStruct.NVIC_IRQChannel TIM2_IRQn;指定中断通道为 TIM2 中断。NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE;使能中断。NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority 0;设置优先级抢占优先级 0子优先级 0NVIC_Init(NVIC_InitStruct);将优先级配置写入寄存器。四、逐行详细讲解main.cint main() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);✅中断分组必须放在最前面整个芯片中断规则只能设置一次LED_Init(); Base_TIM_Init();初始化 LED 和定时器。while(1) { } }主循环什么都不做完全交给中断控制。五、中断服务函数详细讲解void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET) {判断是否为定时器更新中断防止进错中断标准写法GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)));翻转 LED 电平原来 0 → 变 1原来 1 → 变 0实现闪烁效果TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }清除中断标志位必须写不清除 → 程序卡死在中断里六、最终总结你的定时器配置每 1 秒进一次中断中断里只做一件事翻转 LED快进快出代码现在 100% 正确烧录直接亮灯闪烁七、你现在烧录进去会看到的现象LED (PA1) 亮 1 秒 → 灭 1 秒 → 亮 1 秒 → 灭 1 秒…… 无限循环
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2586391.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!