找回密码
 立即注册

只需一步,快速开始

搜索

【FM33LG0系列开发板测评】04.PWM、RTC

0
回复
2241
查看
[复制链接]

177

主题

354

帖子

3121

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3121
QQ
2022-1-6 09:00:14 显示全部楼层 |阅读模式
【FM33LG0系列开发板测评】PWM、RTC

原帖地址:【FM33LG0系列开发板测评】04.PWM、RTC - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

1、简介

PWM(Pulse Width Modulation)是脉冲宽度调制缩写,我们可以使用GPIO加延时的方式来实现,也可以通过TIM定时器的PWM功能来实现;来达到不同周期、不同占空比的波形输出。

RTC(Real Time Clock)是实时时钟,在FM33LG0系列芯片中带有2个RTC外设,分别是RTCA和RTCB;RTCB只能使用外部时钟晶振,输出固定的1Hz频率,进行RTC计时;而RTCA则可以选择不同时的时钟源:XTLF或者是RCLP,可以配置产生不同频率的周期中断(1KHz、256Hz、64Hz、16Hz、4Hz、1Hz);但不管是RTCA还是RTCB,在数字调校后,精确度都能够达到+/-0.477ppm;并且是BCD时间,具有完整的万年历功能,使用相当方便。


2、功能实现

使用LPTIM16定时器的TIM_CH3通道,即PC13引脚来输出频率为1KHz,占空比为50%的波形;使用RTCB时间时间初始化配置,每间隔1秒钟打印出来当前RTCB的运行日期和时间;


3、代码实现

LPTIM16 PWM

  1. /*******************************************************************************
  2. * @brief * @param      
  3. * @retval      
  4. * @attention *******************************************************************************/
  5. void LPTIM16_Init(void)
  6. {
  7.     FL_GPIO_InitTypeDef       GPIO_InitStruct;
  8.     FL_LPTIM16_InitTypeDef    LPTIM16_InitStruct;
  9.     FL_LPTIM16_OC_InitTypeDef LPTIM16_OC_InitStruct;

  10.     FL_LPTIM16_StructInit(&LPTIM16_InitStruct);
  11.     LPTIM16_InitStruct.clockSource          = FL_CMU_LPTIM16_CLK_SOURCE_APBCLK;
  12.     LPTIM16_InitStruct.mode                 = FL_LPTIM16_OPERATION_MODE_NORMAL;
  13.     LPTIM16_InitStruct.prescalerClockSource = FL_LPTIM16_CLK_SOURCE_INTERNAL;
  14.     LPTIM16_InitStruct.prescaler            = FL_LPTIM16_PSC_DIV8;
  15.     LPTIM16_InitStruct.autoReload           = 1000 - 1;
  16.     LPTIM16_InitStruct.encoderMode          = FL_LPTIM16_ENCODER_MODE_DISABLE;
  17.     LPTIM16_InitStruct.onePulseMode         = FL_LPTIM16_ONE_PULSE_MODE_CONTINUOUS;
  18.     LPTIM16_InitStruct.triggerEdge          = FL_LPTIM16_ETR_TRIGGER_EDGE_RISING;
  19.     LPTIM16_InitStruct.countEdge            = FL_LPTIM16_ETR_COUNT_EDGE_RISING;
  20.     FL_LPTIM16_Init(LPTIM16, &LPTIM16_InitStruct);

  21.     FL_GPIO_StructInit(&GPIO_InitStruct);
  22.     GPIO_InitStruct.pin        = FL_GPIO_PIN_13;
  23.     GPIO_InitStruct.mode       = FL_GPIO_MODE_DIGITAL;
  24.     GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
  25.     GPIO_InitStruct.pull       = FL_DISABLE;
  26.     GPIO_InitStruct.remapPin   = FL_ENABLE;
  27.     FL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  28.     LPTIM16_OC_InitStruct.OCPolarity   = FL_LPTIM16_OC_POLARITY_NORMAL;
  29.     LPTIM16_OC_InitStruct.compareValue = 500 - 1;
  30.     FL_LPTIM16_OC_Init(LPTIM16, FL_LPTIM16_CHANNEL_1, &LPTIM16_OC_InitStruct);

  31.     FL_LPTIM16_Enable(LPTIM16);
  32. }
复制代码

RTCB:需要注意的是RTC配置和读取的值都是以BCD码形式表示的,所以在获取日期时间时,打印日期和时间需要将BCD码转换成16进制数;在设置日期和时间时,需要将其转换成BCD码再时行设置;

在配置星期时,如果不确定是星期几,你可以随便设置一个值;在获取日期时间后,会自动返回正确的星期几,NICE!!!

  1. /*******************************************************************************
  2. * @file    RTC.c
  3. * @author  King
  4. * @version V1.00
  5. * @date 27-Nov-2021
  6. * @brief   ......
  7. *******************************************************************************/


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


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


  12. #if RTC_ENABLE


  13. /* Private typedef -----------------------------------------------------------*/
  14. /* Private define ------------------------------------------------------------*/
  15. /* Private macro -------------------------------------------------------------*/
  16. /* Private variables ---------------------------------------------------------*/
  17. /* Private function prototypes -----------------------------------------------*/
  18. /* Private functions ---------------------------------------------------------*/


  19. /* Exported variables --------------------------------------------------------*/
  20. /* Exported function prototypes ----------------------------------------------*/


  21. /*******************************************************************************
  22. * @brief      
  23. * @param      
  24. * @retval      
  25. * @attention   
  26. *******************************************************************************/
  27. uint8_t RTC_HEXToBCD(uint8_t Data)
  28. {
  29.     return (Data / 10) * 16 + (Data % 10);
  30. }


  31. /*******************************************************************************
  32. * @brief      
  33. * @param      
  34. * @retval      
  35. * @attention   
  36. *******************************************************************************/
  37. uint8_t RTC_BCDToHEX(uint8_t Data)
  38. {
  39.     return (Data / 16) * 10 + (Data % 16);
  40. }


  41. /*******************************************************************************
  42. * @brief      
  43. * @param      
  44. * @retval      
  45. * @attention   
  46. *******************************************************************************/
  47. void RTCB_Configure(void)
  48. {
  49.     FL_RTCB_InitTypeDef RTCB_InitStruct = {0x21, 0x12, 0x12, 0x00, 0x19, 0x18, 0x25};

  50.     FL_RTCB_Init(RTCB, &RTCB_InitStruct);

  51.     FL_RTCB_Enable(RTCB);

  52.     NVIC_DisableIRQ(RTCx_IRQn);
  53. }


  54. /*******************************************************************************
  55. * @brief      
  56. * @param      
  57. * @retval      
  58. * @attention   
  59. *******************************************************************************/
  60. void RTC_Configure(void)
  61. {
  62.     RTCB_Configure();

  63.     TASK_Append(TASK_ID_RTC, RTC_Handler, 1000);
  64. }


  65. /*******************************************************************************
  66. * @brief      
  67. * @param      
  68. * @retval      
  69. * @attention   
  70. *******************************************************************************/
  71. void RTC_Handler(void)
  72. {
  73.     FL_RTCB_InitTypeDef RTCB_InitStruct;

  74.     FL_RTCB_GetTime(RTCB, &RTCB_InitStruct);

  75.     printf("\r\n20%02d-%02d-%02d",
  76.            RTC_BCDToHEX(RTCB_InitStruct.year ),
  77.            RTC_BCDToHEX(RTCB_InitStruct.month),
  78.            RTC_BCDToHEX(RTCB_InitStruct.day  ));

  79.     switch(RTCB_InitStruct.week)
  80.     {
  81.         case 0 : printf(" SUN "); break;
  82.         case 1 : printf(" MON "); break;
  83.         case 2 : printf(" TUE "); break;
  84.         case 3 : printf(" WED "); break;
  85.         case 4 : printf(" THU "); break;
  86.         case 5 : printf(" FRI "); break;
  87.         case 6 : printf(" SAT "); break;
  88.         default:break;
  89.     }

  90.     printf("%02d:%02d:%02d",
  91.            RTC_BCDToHEX(RTCB_InitStruct.hour  ),
  92.            RTC_BCDToHEX(RTCB_InitStruct.minute),
  93.            RTC_BCDToHEX(RTCB_InitStruct.second));
  94. }


  95. #endif


  96. /******************* (C) COPYRIGHT 2021 *************************END OF FILE***/

复制代码

4、运行结果

在做RTC功能验证时,需要将开发板上的VBAT与VCC进行短接,给MCU的RTC外设进行供电;使用逻辑分析仪,连接开发板上的PC13排针引脚和GND,对PWM输出波形的频率和占空比进行测量,运行结果如下图所示:



5、工程源码

Project_PWM_RTCB.zip (359.1 KB, 下载次数: 168)

回复

使用道具 举报

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

返回顶部