[开发板与模块] 【ESK32-30519 + ESK32-21001测评】02.TIMER+BUZZER

[复制链接]
 楼主| xld0932 发表于 2022-10-10 13:47 | 显示全部楼层 |阅读模式
<
ESK32-21001扩展板上带有一个无源蜂鸣器,根据无源蜂鸣器的驱动原理我们需要使用MCU的PWM资源来控制,可以是通过GPTM定时器来实现硬件输出PWM,也可以通过GPTM定时器来控制GPIO的输出电平翻来实现软件输出PWM,从控制方式来说,硬件PWM更加节省软件资源,相比于软件PWM的实现方式,阻塞更少。


HT32F54253通用功能定时器GPTM

▆16-bit 向上 / 向下自动重载计数器▆ 定时器多达 4 个独立通道
▆ 16-bit 可编程预分频器,可以对其时钟源进行 1 ~ 65536 之间的任意数值的分频产生计数
器时钟频率
▆ 输入捕捉功能
▆ 比较匹配输出
▆ PWM 波形产生功能,具有边沿对齐和中心对齐两种计数模式
▆ 单脉冲输出模式
▆ 内建可处理编码器接口信号的带两个输入口的正交解码器
通用定时器包括一个 16-bit 向上 / 向下计数器,四个 16-bit 捕捉 / 比较寄存器 (CCR),一个 16-bit计数器重载寄存器 (CRR) 和多个控制 / 状态寄存器。它们可用于多种用途,包括通用计时、输入信号脉冲宽度测量、输出波形产生,如单脉冲波形产生或 PWM 输出。 GPTM 还内建可处理编码器接口信号的带两个输入口的正交解码器。




原理图
  • ESK32-30519

1.png


  • ESK32-21001

2.png




引脚复用
3.png


实现功能
参考官方例程,通过GPTM定时器的PWM输出引脚,实现对BUZZER的控制,让其输出声响。




实现代码
  1. /*******************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]    BUZZER.c
  3. * [url=home.php?mod=space&uid=187600]@author[/url]  King
  4. * [url=home.php?mod=space&uid=895143]@version[/url] V1.00
  5. * [url=home.php?mod=space&uid=212281]@date[/url]    07-Oct-2022
  6. * [url=home.php?mod=space&uid=247401]@brief[/url]   ......
  7. *******************************************************************************/


  8. /* Define to prevent recursive inclusion -------------------------------------*/
  9. #define __BUZZER_C__


  10. /* Includes ------------------------------------------------------------------*/
  11. #include "BUZZER.h"


  12. /* Private typedef -----------------------------------------------------------*/


  13. /* Private define ------------------------------------------------------------*/
  14. #define BEE_TM_PRE              (4)
  15. #define BEE_SYS_CLK             (LIBCFG_MAX_SPEED)  // Calculate with fix value (#define)
  16. #define BEE_DUTY                (40)                // 40%


  17. /* Private macro -------------------------------------------------------------*/
  18. #define BEE_TIME_MS(t, f)       ((f) * (t) / 1000)


  19. /* Private variables ---------------------------------------------------------*/
  20. volatile uint16_t BUZZER_Times;
  21. volatile uint16_t BUZZER_Active;
  22. volatile uint16_t BUZZER_InActive;
  23. volatile uint32_t BUZZER_Count;


  24. /* Private function prototypes -----------------------------------------------*/
  25. /* Private functions ---------------------------------------------------------*/


  26. /* Exported variables --------------------------------------------------------*/
  27. /* Exported function prototypes ----------------------------------------------*/


  28. /*******************************************************************************
  29. * @brief      
  30. * @param      
  31. * @retval      
  32. * [url=home.php?mod=space&uid=93590]@Attention[/url]   
  33. *******************************************************************************/
  34. void BUZZER_Init(uint32_t uFrequency)
  35. {
  36.     /* Enable peripheral clock */
  37.     CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};

  38.     CKCUClock.Bit.AFIO  = 1;
  39.     CKCUClock.Bit.GPTM0 = 1;
  40.     CKCU_PeripClockConfig(CKCUClock, ENABLE);

  41.     /* Configure AFIO mode as TM function */
  42.     AFIO_GPxConfig(GPIO_PC, AFIO_PIN_12, AFIO_FUN_GPTM0);

  43.     uint32_t Reload = (BEE_SYS_CLK / BEE_TM_PRE / uFrequency) - 1;

  44.     /* Time base configuration */
  45.     TM_TimeBaseInitTypeDef TimeBaseInit;

  46.     TimeBaseInit.Prescaler         = BEE_TM_PRE - 1;
  47.     TimeBaseInit.CounterReload     = Reload;
  48.     TimeBaseInit.RepetitionCounter = 0;
  49.     TimeBaseInit.CounterMode       = TM_CNT_MODE_UP;
  50.     TimeBaseInit.PSCReloadTime     = TM_PSC_RLD_IMMEDIATE;
  51.     TM_TimeBaseInit(HT_GPTM0, &TimeBaseInit);

  52.     TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV);

  53.     /* Channel n output configuration */
  54.     TM_OutputInitTypeDef OutputInit;

  55.     OutputInit.Channel    = TM_CH_2;
  56.     OutputInit.OutputMode = TM_OM_PWM2;
  57.     OutputInit.Control    = TM_CHCTL_DISABLE;
  58.     OutputInit.ControlN   = TM_CHCTL_DISABLE;
  59.     OutputInit.Polarity   = TM_CHP_NONINVERTED;
  60.     OutputInit.PolarityN  = TM_CHP_NONINVERTED;
  61.     OutputInit.IdleState  = MCTM_OIS_LOW;
  62.     OutputInit.IdleStateN = MCTM_OIS_HIGH;
  63.     OutputInit.Compare    = ((Reload + 1) * (100 - BEE_DUTY)) / 100;
  64.     OutputInit.AsymmetricCompare = 0;
  65.     TM_OutputInit(HT_GPTM0, &OutputInit);

  66.     /* Enable TM interrupt */
  67.     NVIC_EnableIRQ(GPTM0_IRQn);
  68. }


  69. /*******************************************************************************
  70. * @brief      
  71. * @param      
  72. * @retval      
  73. * @attention   
  74. *******************************************************************************/
  75. void BUZZER_Start(uint16_t Times, uint16_t Frequency, uint16_t Active_ms, uint16_t InActive_ms)
  76. {
  77.     uint32_t Reload  = (BEE_SYS_CLK / BEE_TM_PRE / Frequency) - 1;
  78.     uint32_t Compare = ((Reload + 1) *  (100 - BEE_DUTY))  /  100;

  79.     BUZZER_Times    = Times;
  80.     BUZZER_Active   = BEE_TIME_MS(Active_ms,   Frequency);
  81.     BUZZER_InActive = BEE_TIME_MS(InActive_ms, Frequency);
  82.     BUZZER_Count    = BUZZER_Active + BUZZER_InActive;

  83.     TM_SetCounterReload(HT_GPTM0, Reload);
  84.     TM_SetCaptureCompare(HT_GPTM0, TM_CH_2, Compare);

  85.     TM_IntConfig(HT_GPTM0, TM_INT_UEV, ENABLE);
  86.     TM_ChannelConfig(HT_GPTM0, TM_CH_2, TM_CHCTL_ENABLE);
  87.     TM_Cmd(HT_GPTM0, ENABLE);
  88. }


  89. /*******************************************************************************
  90. * @brief      
  91. * @param      
  92. * @retval      
  93. * @attention   
  94. *******************************************************************************/
  95. uint32_t BUZZER_IsFinish(void)
  96. {
  97.     return (BUZZER_Times ? FALSE : TRUE);
  98. }


  99. /*******************************************************************************
  100. * @brief      
  101. * @param      
  102. * @retval      
  103. * @attention   
  104. *******************************************************************************/
  105. void GPTM0_IRQHandler(void)
  106. {
  107.     TM_ClearFlag(HT_GPTM0, TM_INT_UEV);

  108.     if(BUZZER_Count)
  109.     {
  110.         BUZZER_Count--;

  111.         if(BUZZER_Count == BUZZER_InActive)
  112.         {
  113.             TM_ChannelConfig(HT_GPTM0, TM_CH_2, TM_CHCTL_DISABLE);
  114.         }

  115.         if(BUZZER_Count == 0)
  116.         {
  117.             BUZZER_Count = BUZZER_Active + BUZZER_InActive;

  118.             TM_ChannelConfig(HT_GPTM0, TM_CH_2, TM_CHCTL_ENABLE);

  119.             if(BUZZER_Times)
  120.             {
  121.                 BUZZER_Times--;
  122.             }

  123.             if(BUZZER_Times == 0)
  124.             {
  125.                 TM_Cmd(HT_GPTM0, DISABLE);
  126.             }
  127.         }
  128.     }
  129. }


  130. /*******************************************************************************
  131. * @brief      
  132. * @param      
  133. * @retval      
  134. * @attention   
  135. *******************************************************************************/
  136. void BUZZER_Demo(void)
  137. {
  138.     /* BUZZER 4 times, 3 kHz, active 50 ms, inactive 50 ms */
  139.     BUZZER_Init(0);
  140.     BUZZER_Start(4, 3000, 50, 50);
  141.     while(BUZZER_IsFinish() == FALSE);

  142.     /* BUZZER 2 times, 800 Hz, active 1000 ms, inactive 500 ms */
  143.     BUZZER_Init(0);
  144.     BUZZER_Start(2, 800, 1000, 500);
  145.     while(BUZZER_IsFinish() == FALSE);
  146. }




运行结果
上电后,蜂鸣器先是以3kHz的频率间隔50ms快速响4声音,然后再以800Hz的频率响1秒停顿0.5秒的节奏循环响2个周期。




软件工程源代码
Project.zip (845.42 KB, 下载次数: 10)
海滨消消 发表于 2022-10-10 14:53 来自手机 | 显示全部楼层
这是什么时候的测评活动啊
 楼主| xld0932 发表于 2022-10-10 15:00 | 显示全部楼层
海滨消消 发表于 2022-10-10 14:53
这是什么时候的测评活动啊

HT32F54253触控开发板 免费申请评测福利活动
https://bbs.21ic.com/icview-3243964-1-1.html?fromuser=xld0932
(出处: 21ic电子技术开**坛)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:King.Xu

77

主题

3023

帖子

38

粉丝
快速回复 在线客服 返回列表 返回顶部