你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX系列 | 定时器中断

[复制链接]
STMCU 发布时间:2020-11-27 13:19
STM32CubeMX系列 | 定时器中断
1.定时器中断

STM32的定时器功能十分强大,有高级定时器(TIM1和TIM8)、通用定时器(TIM2~TIM5)和基本定时器(TIM6和TIM7);本实验主要介绍难度适中的通用定时器,通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。
通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:


可编程的自由运行递减计算器


条件复位:当递减计数器的值小于0x40,则产生复位;当递减计数器在窗口外被重新装载,则产生复位


如果启动了看门狗并且允许中断,当递减计数器等于0x40时产生早期唤醒中断(EWI),它可用于重新装载计数器以避免WWDG复位


16位向上、向下、向上/向下自动装载计数器


16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值


4个独立通道:输入捕获;输出比较;PWM生成(边缘或中间对齐模式);单脉冲模式输出


使用外部信号控制定时器和定时器互连的同步电路


如下事件发生时产生中断/DMA:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发);触发事件(计数器启动、停止、初始化或者由内部/外部触发计数);输入捕获;输出比较


支持针对定位的增量(正交)编码器和霍尔传感器电路


触发输入作为外部时钟或者按周期的电流管理


通用定时器框图
1.png
定时器时基部分
2.png
2.硬件设计

本实验通过TIM3的中断来控制D1的亮灭,需要用到的硬件资源有:


指示灯D1和D2
定时器TIM3
3.png
3.软件设计


3.1 STM32CubeMX设置


➡️ RCC设置外接HSE,时钟设置为72M;TIM3的时钟挂载在APB1 Time Clocks上为72MHz


➡️ PC0和PC1设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平


➡️ 激活TIM3定时器,时钟源选择为内部时钟,PSC预分频设置为7200-1,向上计数,自动重装载值(ARR)设置为10000-1,在NVIC设置中激活TIM3定时器中断;根据公式可算出:计数器时钟CK_CNT = 72M/7200 = 10000Hz,计时器中断时间为 ARR/10000 = 1s
4.png
➡️输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码


3.2 MDK-ARM软件编程


➡️ 在tim.c文件中可以看到定时器的初始化函数
  1. void MX_TIM3_Init(void){
  2.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  3.   TIM_MasterConfigTypeDef sMasterConfig = {0};

  4.   htim3.Instance = TIM3;
  5.   htim3.Init.Prescaler = 7200-1;
  6.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  7.   htim3.Init.Period = 10000-1;
  8.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  9.   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  10.   if (HAL_TIM_Base_Init(&htim3) != HAL_OK){
  11.     Error_Handler();
  12.   }
  13.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  14.   if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){
  15.     Error_Handler();
  16.   }
  17.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  18.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  19.   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){
  20.     Error_Handler();
  21.   }
  22. }
复制代码
找到弱符号周期运行回调函数原型,并在tim.c中自定义该回调函数
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
  2.   if(htim == &htim3){
  3.     //LED1状态每1s翻转一次
  4.     HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);       
  5.   }
  6. }
复制代码
➡️ 在main函数中编写相关代码,在while中使LED2每500ms翻转一次
  1. int main(void){
  2.   HAL_Init();
  3.   SystemClock_Config();
  4.   MX_GPIO_Init();
  5.   MX_TIM3_Init();
  6.   //启动定时器中断模式计数
  7.   HAL_TIM_Base_Start_IT(&htim3);               
  8.   while (1){
  9.     //LED2状态每500ms翻转一次
  10.     HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);       
  11.     HAL_Delay(500);
  12.   }
  13. }
复制代码
4.下载验证
编译无误后下载到开发板,可以看到LED1每1s状态翻转一次,LED2每500ms状态翻转一次






收藏 1 评论0 发布时间:2020-11-27 13:19

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版