最近在做一个便携式储能的 BMS 项目,使用的主控芯片是晶丰明源的 LKS32MC45x 系列 MCU。由于要做一个 LED 的呼吸灯控制,涉及到的外设有 GPIO 和通用定时器 UTimer。以下是关于LED 呼吸灯控制的驱动说明。
一、模块初始化配置
PWM 的配置主要有:GPIO 的初始化配置、UTimer 模块的初始化配置。
1、GPIO 的初始化配置
以 P2_12(Timer4-CH1) 为例,LKS32MC45x 系列 MCU 要求将 IO 配置为输出(OUTPUT)。
|
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStruct.GPIO_PODEna = DISABLE; GPIO_InitStruct.GPIO_PFLT = DISABLE;
GPIO_Init(GPIO2,&GPIO_InitStruct); |
接着要把 P2_12(Timer4-CH1) 管脚配置成复用 TIMER4 模式。
|
GPIO_PinAFConfig(GPIO2, GPIO_PinSource_12, GPIO_AF_TIMER4); // P2.12复用为Timer4CH1的输出模式 |
2、UTimer 模块的初始化配置
UTimer4 模块的初始化配置如下。这些参数中要注意系统时钟频率为 192MHz。参数配置如下:
- 将系统时钟频率(CLK_DIV) 8 分频,得到 UTimer4 的工作频率为 24MHz。
- 将计数器门限(TH)设为 24000,即每 1ms 计数器清零,也就是 PWM 的频率是 1kHz。
- 将 Timer4 的通道 1 工作模式(CH1_MODE)设为比较模式,输出极性(CH1_POL)为 1。
- 开启 Timer4 的回零中断(UTIMER_IE_ZERO)。
|
TIM_InitStruct.EN = ENABLE; // Timer 模块整体使能,高有效 TIM_InitStruct.ETON = 0; // Timer 计数器计数使能配置 0:自动运行 1:等待外部事件触发计数 TIM_InitStruct.CLK_DIV = UTIMER_Clk_Div8; // Timer 计数器分频设置,192000 000/8=24000 000Hz; TIM_InitStruct.CLK_SRC = UTIMER_CLK_SRC_MCLK; // Timer 时钟源 TIM_InitStruct.CH1_POL = 1; // Timer通道1在比较模式下的输出极性控制,当计数器计数值回零时的输出值 TIM_InitStruct.CH1_MODE = UTIMER_MODE_CMP; // Timer通道1的工作模式选择,默认值为0 TIM_InitStruct.TH = 24000; // Timer 计数器计数门限。 TIM_InitStruct.CMP1 = 24000; // Timer 通道1工作在比较模式时,当计数器计数值等于CMP1时,发生比较事件。 TIM_InitStruct.FLT = 0; // 通道0/1信号滤波宽度选择。取值范围0~255 TIM_InitStruct.IE = UTIMER_IE_ZERO; // 开启Timer模块回零中断
UTIMER_Init(UTIMER4, &TIM_InitStruct); |
3、中断的初始化配置
由于需要用到中断功能,所以需要开启 UART 中断,并设置其中断优先级,比如:
|
NVIC_SetPriority(TIMER4_IRQn, 1); // 设置 UTimer4 中断优先级 NVIC_EnableIRQ(TIMER4_IRQn); // 使能 UTimer4 中断 |
二、呼吸灯的实现
1、开启呼吸灯
开启呼吸灯,需要打开 UTimer4,并把 IO 管脚配置为复用 TIMER 模式。
对 Timer4 的通道 1 来说,在计数器回零时,输出一个电平到 TIMER4_CH1,当计数到 UTIMER4_CMP1 即比较事件发生时,电平翻转,输出另一个电平到 IO 口 TIMER4_CH1。所以在UTimer4 的中断处理函数中,改变 CMP1 的值,即可改变 PWM 的占空比。
中断处理函数内容如下:
|
void TIMER4_IRQHandler(void) { static int Timer_flag = 0; if (UTIMER4_IF & BIT2) // 判断UTimer4是否发生回零中断 { UTIMER4_IF = BIT2; // 清除UTimer中断标志位 if(LED_PWM_UpDown) { LED_PWM_CMP += LED_PWM_Step; // 占空比增大 if(LED_PWM_CMP>LED_PWM_TH) // 当占空比达到 100%,则开始减小占空比 { LED_PWM_CMP=LED_PWM_TH; LED_PWM_UpDown=0; } } else { if(LED_PWM_CMP>LED_PWM_Low) { LED_PWM_CMP -= LED_PWM_Step; // 占空比减小 } else // 当占空比太小时,则开始增大占空比 { LED_PWM_UpDown=1; } } UTIMER4_CMP1 = LED_PWM_CMP; // 赋值 CMP1 } } |
2、关闭呼吸灯
关闭呼吸灯,需要关闭 UTimer4 的时钟,并且将 IO 管脚配置为普通 IO。最后将 IO 管脚设置为 LED 熄灭的电平。
|
UTIMER_Disable(UTIMER4); GPIO_PinAFConfig(GPIO2, GPIO_PinSource_12, GPIO_AF_GPIO); // P2.12设置为 GPIO 的模式 GPIO_ResetBits(GPIO2, GPIO_Pin_12); |
三、总结
以上是关于晶丰明源的 LKS32MC45x 的 UTimer 模块配置,控制一个呼吸灯的软件驱动的说明。如果想了解更多,可以在下方评论区留言,或者发邮件给我们:atu.sh@wpi-group.com。
四、参考资料
- LKS32M45x 用户手册:LKS32MC45x_UM_v1.52.pdf。
- LKS32M45x 外设示例工程:lks32mc45x_demo_prj_v2.9。
如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com 作者:五月小姐姐
更多资讯,请扫码关注我们!

