[STM32L5] 【STM32L562E-DK试用】3.时钟与定时器的使用

[复制链接]
1310|1
 楼主| yuyy1989 发表于 2025-1-21 19:22 | 显示全部楼层 |阅读模式
STM32L562的系统时钟有4种来源:HSE、HSI16、MSI、PLL
HSE:高速外部时钟,可选用4~48MHz的晶振使用,支持PLL
HSI16:高速内部时钟,16MHz的内部震荡器,支持PLL
MSI:多频率内部时钟,可产生从100KHz到48MHz的12种频率,支持PLL
PLL:通过与HSE、HSI16、MSI结合使用,可以配置最高110MHz的频率
微信截图_20250120182556.png
另外还有个HSI48,可以为USB、SDMMC、RNG外设提供48MHz的时钟
对于这块板子来说HSE的位置是留空的没法使用外部晶振,工程默认配置的是MSI
微信截图_20250120183658.png
MSI的频率可以在STM32CubeMX中通过这个下拉框进行修改
微信截图_20250120183726.png
低速时钟部分和其他的大部分芯片一样,可以由外部32.768KHz的晶振(LSE)或内部32KHz的低速振荡器(LSI)提供,用来支持RTC工作
微信截图_20250120184439.png
定时器是一个非常重要的功能模块,用于处理定时、计数和事件触发等任务。在单片机开发中,或多或少都会用到定时器,定时器可以在应用程序中产生周期性中断,常用于精确的时间延迟、事件计数等场合。STM32L562的定时器资源很丰富,拥有2个高级定时器、最多9个通用定时器、2个基础定时器和2个低功耗定时器
无标题.png
接下来使用Timer8实现一个触发周期为1s的定时器,在定时器的中断中翻转LED的状态,使2个LED交替闪烁
打开STM32CubeMX选中TIM8,时钟源选择内部时钟,配置好预分频系数和重载值
微信截图_20250120204459.png
切换到中断设置标签开启Update中断
微信截图_20250120204610.png
生成的代码并没有开启定时器和Update中断,需要手动添加以下代码
  1. LL_TIM_EnableIT_UPDATE(TIM8);
  2. LL_TIM_EnableCounter(TIM8);
微信截图_20250120204706.png
在中断函数中切换LED状态
  1. void Tim8UpdateInt(void)
  2. {
  3.     LL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
  4.     LL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);
  5. }
  6. void TIM8_UP_IRQHandler(void)
  7. {
  8.   /* USER CODE BEGIN TIM8_UP_IRQn 0 */
  9.     if(LL_TIM_IsActiveFlag_UPDATE(TIM8))
  10.     {
  11.         LL_TIM_ClearFlag_UPDATE(TIM8);
  12.         Tim8UpdateInt();
  13.     }
  14.   /* USER CODE END TIM8_UP_IRQn 0 */
  15.   /* USER CODE BEGIN TIM8_UP_IRQn 1 */

  16.   /* USER CODE END TIM8_UP_IRQn 1 */
  17. }
运行效果如图
WeChat_20250121190244 00_00_00-00_00_30.gif
除了运行普通的定时任务外,还可以通过定时器输出PWM,通过调节占空比可以控制输出的电流大小,接下来使用PWM控制这个RGB的LED模块实现彩色渐变效果
微信截图_20250121190552.png
使用PA0 PA1 PC6这三个还没有被使用的IO,可以通过背面的Arduino接口来连接
微信截图_20250121191310.png
三个IO对应的定时器通道如下
PA0——TIM2CH1
PA1——TIM2CH2
PC6——TIM3CH1
打开STM32CubeMX配置IO为定时器通道输出,并对定时器参数进行设置,这个LED模块是共阳极的所以设置有效电平为低电平
微信截图_20250121191527.png
和前面一样需要手动开启定时器和PWM输出
  1. LL_TIM_EnableCounter(TIM2);
  2. LL_TIM_CC_EnableChannel(TIM2,LL_TIM_CHANNEL_CH1);
  3. LL_TIM_CC_EnableChannel(TIM2,LL_TIM_CHANNEL_CH2);
  4. LL_TIM_EnableCounter(TIM3);
  5. LL_TIM_CC_EnableChannel(TIM3,LL_TIM_CHANNEL_CH1);
实现颜色渐变效果
  1. uint16_t led_r = 1000;
  2. uint16_t led_g = 0;
  3. uint16_t led_b = 0;
  4. uint8_t led_rgb_step = 0;
  5. void AppSetRGB(uint16_t r,uint16_t g,uint16_t b)
  6. {
  7.     if(r > 1000)
  8.         r = 1000;
  9.     if(g > 1000)
  10.         g = 1000;
  11.     if(b > 1000)
  12.         b = 1000;
  13.     LL_TIM_OC_SetCompareCH1(TIM2,r);
  14.     LL_TIM_OC_SetCompareCH2(TIM2,g);
  15.     LL_TIM_OC_SetCompareCH1(TIM3,b);
  16. }
  17. void AppLEDShowColors()
  18. {
  19.     switch(led_rgb_step)
  20.     {
  21.         case 0:
  22.             if(led_r > 0)
  23.             {
  24.                 led_g += 1;
  25.                 led_r -= 1;
  26.             }
  27.             if(led_r == 0)
  28.                 led_rgb_step = 1;
  29.             break;
  30.         case 1:
  31.             if(led_g > 0)
  32.             {
  33.                 led_b += 1;
  34.                 led_g -= 1;
  35.             }
  36.             if(led_g == 0)
  37.                 led_rgb_step = 2;
  38.             break;
  39.         case 2:
  40.             if(led_b > 0)
  41.             {
  42.                 led_r += 1;
  43.                 led_b -= 1;
  44.             }
  45.             if(led_b == 0)
  46.                 led_rgb_step = 0;
  47.             break;
  48.         default:
  49.             break;
  50.     }
  51.     AppSetRGB(led_r,led_g,led_b);
  52. }
  53. void AppUserLoop(void)
  54. {
  55.     AppLEDShowColors();
  56.     LL_mDelay(1);
  57. }
最终运行效果如下
WeChat_20250121190252 00_00_00-00_00_30.gif

SophiaOP 发表于 2025-1-22 21:03 来自手机 | 显示全部楼层
这个芯片这么多定时器啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

168

主题

826

帖子

10

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