打印
[STM32L5]

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

[复制链接]
51|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32L562的系统时钟有4种来源:HSE、HSI16、MSI、PLL
HSE:高速外部时钟,可选用4~48MHz的晶振使用,支持PLL
HSI16:高速内部时钟,16MHz的内部震荡器,支持PLL
MSI:多频率内部时钟,可产生从100KHz到48MHz的12种频率,支持PLL
PLL:通过与HSE、HSI16、MSI结合使用,可以配置最高110MHz的频率

另外还有个HSI48,可以为USB、SDMMC、RNG外设提供48MHz的时钟
对于这块板子来说HSE的位置是留空的没法使用外部晶振,工程默认配置的是MSI

MSI的频率可以在STM32CubeMX中通过这个下拉框进行修改

低速时钟部分和其他的大部分芯片一样,可以由外部32.768KHz的晶振(LSE)或内部32KHz的低速振荡器(LSI)提供,用来支持RTC工作

定时器是一个非常重要的功能模块,用于处理定时、计数和事件触发等任务。在单片机开发中,或多或少都会用到定时器,定时器可以在应用程序中产生周期性中断,常用于精确的时间延迟、事件计数等场合。STM32L562的定时器资源很丰富,拥有2个高级定时器、最多9个通用定时器、2个基础定时器和2个低功耗定时器

接下来使用Timer8实现一个触发周期为1s的定时器,在定时器的中断中翻转LED的状态,使2个LED交替闪烁
打开STM32CubeMX选中TIM8,时钟源选择内部时钟,配置好预分频系数和重载值

切换到中断设置标签开启Update中断

生成的代码并没有开启定时器和Update中断,需要手动添加以下代码
LL_TIM_EnableIT_UPDATE(TIM8);
LL_TIM_EnableCounter(TIM8);

在中断函数中切换LED状态
void Tim8UpdateInt(void)
{
    LL_GPIO_TogglePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin);
    LL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);
}
void TIM8_UP_IRQHandler(void)
{
  /* USER CODE BEGIN TIM8_UP_IRQn 0 */
    if(LL_TIM_IsActiveFlag_UPDATE(TIM8))
    {
        LL_TIM_ClearFlag_UPDATE(TIM8);
        Tim8UpdateInt();
    }
  /* USER CODE END TIM8_UP_IRQn 0 */
  /* USER CODE BEGIN TIM8_UP_IRQn 1 */

  /* USER CODE END TIM8_UP_IRQn 1 */
}
运行效果如图

除了运行普通的定时任务外,还可以通过定时器输出PWM,通过调节占空比可以控制输出的电流大小,接下来使用PWM控制这个RGB的LED模块实现彩色渐变效果

使用PA0 PA1 PC6这三个还没有被使用的IO,可以通过背面的Arduino接口来连接

三个IO对应的定时器通道如下
PA0——TIM2CH1
PA1——TIM2CH2
PC6——TIM3CH1
打开STM32CubeMX配置IO为定时器通道输出,并对定时器参数进行设置,这个LED模块是共阳极的所以设置有效电平为低电平

和前面一样需要手动开启定时器和PWM输出
LL_TIM_EnableCounter(TIM2);
LL_TIM_CC_EnableChannel(TIM2,LL_TIM_CHANNEL_CH1);
LL_TIM_CC_EnableChannel(TIM2,LL_TIM_CHANNEL_CH2);
LL_TIM_EnableCounter(TIM3);
LL_TIM_CC_EnableChannel(TIM3,LL_TIM_CHANNEL_CH1);
实现颜色渐变效果
uint16_t led_r = 1000;
uint16_t led_g = 0;
uint16_t led_b = 0;
uint8_t led_rgb_step = 0;
void AppSetRGB(uint16_t r,uint16_t g,uint16_t b)
{
    if(r > 1000)
        r = 1000;
    if(g > 1000)
        g = 1000;
    if(b > 1000)
        b = 1000;
    LL_TIM_OC_SetCompareCH1(TIM2,r);
    LL_TIM_OC_SetCompareCH2(TIM2,g);
    LL_TIM_OC_SetCompareCH1(TIM3,b);
}
void AppLEDShowColors()
{
    switch(led_rgb_step)
    {
        case 0:
            if(led_r > 0)
            {
                led_g += 1;
                led_r -= 1;
            }
            if(led_r == 0)
                led_rgb_step = 1;
            break;
        case 1:
            if(led_g > 0)
            {
                led_b += 1;
                led_g -= 1;
            }
            if(led_g == 0)
                led_rgb_step = 2;
            break;
        case 2:
            if(led_b > 0)
            {
                led_r += 1;
                led_b -= 1;
            }
            if(led_b == 0)
                led_rgb_step = 0;
            break;
        default:
            break;
    }
    AppSetRGB(led_r,led_g,led_b);
}
void AppUserLoop(void)
{
    AppLEDShowColors();
    LL_mDelay(1);
}
最终运行效果如下


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

154

主题

754

帖子

7

粉丝