OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 194|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第十九章 通用定时器输入捕获实验

[复制链接]

1061

主题

1072

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4407
金钱
4407
注册时间
2019-5-8
在线时间
1196 小时
发表于 2024-4-8 16:05:47 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-4-7 16:56 编辑

第十九章 通用定时器输入捕获实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章将介绍使用STM32F103通用定时器的输入捕获功能。通过本章的学习,读者将学习到通用定时器输入捕获的使用。
本章分为如下几个小节:
19.1 硬件设计
19.2 程序设计
19.3 下载验证

19.1 硬件设计
19.1.1 例程功能
1. 按下并松开WKUP按键,串口输出WKUP被按下的时长
2. LED0闪烁,提示程序正在运行

19.1.2 硬件资源
1. LED
       LED0 - PB5
2. 按键
       WKUP - PA0
3. TIM5
       CH1 - PA0
4. USART1
       USART1_TX - PA9
       USART1_RX - PA10

19.1.3 原理图
本章实验使用的TIM5为STM32F103的片上资源,因此没有对应的连接原理图。

19.2 程序设计
19.2.1 HAL库的TIM驱动
本章实验将使用TIM5的通道1捕获WKUP按键被按下的高电平脉冲宽度,具体的步骤如下:
①:初始化定时器输入捕获
②:配置定时器输入捕获通道
③:开始定时器输入捕获
在HAL库中对应的驱动函数如下:
①:初始化定时器输入捕获
该函数用于初始化定时器输入捕获,其函数原型如下所示:
  1. HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240407165453.png
表19.2.1.1 函数HAL_TIM_IC_Init()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240407165513.png
表19.2.1.2 函数HAL_TIM_IC_Init()返回值描述
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.     TIM_HandleTypeDef tim_handle = {0};
  5.    
  6.     /* 初始化TIM5输入捕获 */
  7.     tim_handle.Instance = TIM5;
  8.     tim_handle.Init.Prescaler = 72 - 1;
  9.     tim_handle.Init.Period = 0xFFFF;
  10.     HAL_TIM_IC_Init(&tim_handle);
  11. }
复制代码
②:配置定时器输入捕获通道
该函数用于配置定时器的输入捕获通道,其函数原型如下所示:
  1. HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(    TIM_HandleTypeDef *htim,TIM_IC_InitTypeDef*sConfig, uint32_t Channel);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240407165523.png
表19.2.1.3 函数HAL_TIM_IC_ConfigChannel()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240407165531.png
表19.2.1.4 函数HAL_TIM_IC_ConfigChannel()返回值描述
该函数使用TIM_IC_InitTypeDef类型结构体指针传入了定时器输入捕获通道的配置参数,该结构体的定义如下所示:
  1. typedef struct
  2. {
  3.     uint32_t ICPolarity;    /* 输入捕获极性 */
  4.     uint32_t ICSelection;   /* 输入 */
  5.     uint32_t ICPrescaler;   /* 输入分频系数 */
  6.     uint32_t ICFilter;      /* 输入滤波 */
  7. } TIM_IC_InitTypeDef;
复制代码
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.     TIM_IC_InitTypeDeftim_ic_init_struct = {0};
  5.    
  6.     /* 配置定时器通道1输入捕获 */
  7.     tim_ic_init_struct.ICPolarity =TIM_ICPOLARITY_RISING;
  8.     tim_ic_init_struct.ICSelection =TIM_ICSELECTION_DIRECTTI;
  9.     tim_ic_init_struct.ICPrescaler = TIM_ICPSC_DIV1;
  10.     tim_ic_init_struct.ICFilter = 0;
  11.     HAL_TIM_IC_ConfigChannel(&tim_handle, &tim_ic_init_struct, TIM_CHANNEL_1);
  12. }
复制代码
③:开始定时器中断模式输入捕获
该函数用于开始定时器中断模式输入捕获,其函数原型如下所示:
  1. HAL_StatusTypeDef HAL_TIM_IC_Start_IT( TIM_HandleTypeDef *htim,uint32_t Channel);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240407165539.png
表19.2.1.5 函数HAL_TIM_IC_Start_IT()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240407165544.png
表19.2.1.6 函数HAL_TIM_IC_Start_IT()返回值描述
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.     /* 开启定时器通道1中断模式输入捕获 */
  5.     HAL_TIM_IC_Start_IT(&tim_handle, TIM_CHANNEL_1);
  6. }
复制代码
19.2.2通用定时器驱动
本章实验的通用定时器驱动主要负责向应用层提供通用定时器的初始化函数,并实现通用定时器的中断回调函数。本章实验中,通用定时器的驱动代码包括gtim.c和gtim.h两个文件。
通用定时器驱动中,对TIM、GPIO的相关宏定义,如下所示:
  1. #define GTIM_TIMX_CAP              TIM5
  2. #define GTIM_TIMX_CAP_IRQn         TIM5_IRQn
  3. #define GTIM_TIMX_CAP_IRQHandler   TIM5_IRQHandler
  4. #define GTIM_TIMX_CAP_CLK_ENABLE()     \
  5.     do {                                \
  6.          __HAL_RCC_TIM5_CLK_ENABLE();   \
  7.     }while (0)
  8. #define GTIM_TIMX_CAP_CHY              TIM_CHANNEL_1
  9. #define GTIM_TIMX_CAP_CHY_GPIO_PORT    GPIOA
  10. #define GTIM_TIMX_CAP_CHY_GPIO_PIN     GPIO_PIN_0
  11. #define GTIM_TIMX_CAP_CHY_GPIO_CLK_ENABLE()    \
  12.     do {                                        \
  13.          __HAL_RCC_GPIOA_CLK_ENABLE();          \
  14.     }while (0)
复制代码
通用定时器驱动中TIM5的初始化函数,如下所示:
  1. /**
  2. *@brief   初始化通用定时器输入捕获
  3. *@param   arr: 自动重装载值
  4. *@param   psc: 预分频系数
  5. *@retval  无
  6. */
  7. voidgtim_timx_cap_chy_init(uint16_t arr, uint16_t psc)
  8. {
  9.    TIM_IC_InitTypeDef timx_ic_cap_struct = {0};
  10.    
  11.     /* 初始化定时器输入捕获 */
  12.    g_timx_cap_handle.Instance = GTIM_TIMX_CAP;
  13.    g_timx_cap_handle.Init.Prescaler = psc;
  14.    g_timx_cap_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
  15.    g_timx_cap_handle.Init.Period = arr;
  16.    HAL_TIM_IC_Init(&g_timx_cap_handle);
  17.     /* 配置定时器输入捕获通道 */
  18.    timx_ic_cap_struct.ICPolarity = TIM_ICPOLARITY_RISING;
  19.    timx_ic_cap_struct.ICSelection = TIM_ICSELECTION_DIRECTTI;
  20.    timx_ic_cap_struct.ICPrescaler = TIM_ICPSC_DIV1;
  21.    timx_ic_cap_struct.ICFilter = 0;
  22.    HAL_TIM_IC_ConfigChannel(   &g_timx_cap_handle,
  23.                                  &timx_ic_cap_struct,
  24.                                  GTIM_TIMX_CAP_CHY);
  25.     /* 开始定时器中断模式输入捕获 */
  26.    __HAL_TIM_ENABLE_IT(&g_timx_cap_handle, TIM_IT_UPDATE);
  27.    HAL_TIM_IC_Start_IT(&g_timx_cap_handle, GTIM_TIMX_CAP_CHY);
  28. }
复制代码
从TIM5的初始化代码中可以看到,初始化函数中初始化了TIM5的输入捕获并配置了TIM5的输入捕获通道1,最后开始TIM5的中断模式输入捕获。

19.2.3 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint32_t total = 0;
  4.     uint8_t t = 0;
  5.    
  6.    HAL_Init();                             /* 初始化HAL库 */
  7.    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 配置时钟,72MHz */
  8.    delay_init(72);                         /* 初始化延时 */
  9.    usart_init(115200);                     /* 初始化串口 */
  10.    led_init();                             /* 初始化LED */
  11.    gtim_timx_cap_chy_init(0xFFFF, 72 - 1); /* 初始化通用定时器输入捕获 */
  12.    
  13.     while (1)
  14.     {
  15.          /* 捕获完成 */
  16.          if ((g_timx_chy_cap_sta & 0x80) != 0)
  17.          {
  18.              /* 计算总捕获到的计数值 */
  19.              total = g_timx_chy_cap_sta & 0x3F;
  20.              total *= 0xFFFF;
  21.              total += g_timx_chy_cap_val;
  22.              printf("High: %dus\r\n", total);
  23.             
  24.              /* 开启下一次输入捕获 */
  25.              g_timx_chy_cap_sta = 0;
  26.          }
  27.          if (++t == 20)
  28.          {
  29.              t = 0;
  30.              LED0_TOGGLE();
  31.          }
  32.          
  33.          delay_ms(10);
  34.     }
  35. }
复制代码
从上面的代码中可以看到,TIM5的预分频系数被配置为(72-1),同时因为TIM5的时钟频率为72MHz,因此TIM5的计数频率为1MHz,因此在TIM5成功捕获到外部输入信号的高电平后,可以直接计算出捕获到高电平的脉宽时间。

19.3 下载验证
在完成编译和烧录操作后,短暂按下并抬起WKUP按键,可以通过串口调试助手观察到捕获到的WKUP按键被按下的时间。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 14:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表