1、定时器模块
定时器模块相对而言比较简单,主要分为三部分。
第一部分是整个系统的时基systick内核定时器,里面主要放置了LVGL,RTT,HAL库的时间基准函数。
第二部分就是屏幕的背光部分,使用的是TIM3_CH2通道。
第三部分是RTC时钟及其后备域。
第一部分由于比较简单,就不多说了。
2、PWM部分
下面是TIM3_CH2的初始化。
因为我这里使用的系统主频是84Mhz,PWM频率设定是1Khz,所以分频系数为83,计数值为999.正好是1KHZ的PWM。
2.1、定时器开始函数
整个PWM在HAL库里面的使用都很简单,在CUBEMX生成的定时器初始化函数后面调用HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 500);
这两个函数即可。
参数500的意思是TIM3->CCR2寄存器值为500,因为硬件初始化的时候已经将TIM3->CR1的值设置为999了。所以初始化占空比为500/(999+1) = %50.
2.2、设定背光函数
这里简单的对HAL库的库函数做了一个封装,因为是移植的UP的代码,所以基本和他的一模一样。
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
#define __LimitValue(x,min,max) ((x)=constrain((x),(min),(max)))
void backlight_set_value(int16_t _val)
{
__LimitValue(_val, 0, 1000);
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,_val);
}
这个宏的作用就是将参数
_val
参数的范围限定在0-1000
2.3、获取背光亮度
uint16_t backlight_get_value()
{
return __HAL_TIM_GetCompare(&htim3,TIM_CHANNEL_2);
}
3、RTC时钟部分
F411的RTC支持如下中断
- 闹钟中断
- 唤醒中断
- 时间戳中断
- 入侵检测中断
我使用了闹钟中断和唤醒中断,分别用于用户闹钟设定和设备低功耗。
目前这一部分还没完成,需要等到界面完成后才能具体做出实现代码。
暂时先空着,后面过来记录下来。
4、备注
计算TIMER生成PWM频率的时候切记注意定时器的时钟频率,不然得到的频率是错误的。
这里说一个小方法,使用CUBEMX生成工程后,会有一个系统生成TIMER的初始化函数,如下所示。
找到箭头指向的地方,会发现如下宏定义
#define __HAL_RCC_TIM3_CLK_ENABLE() do { \
__IO uint32_t tmpreg = 0x00U; \
SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\
/* Delay after an RCC peripheral clock enabling */ \
tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\
UNUSED(tmpreg); \
} while(0U)
这就能很清晰的看到TIM3时钟是挂载到APB1时钟总线上的。然后结合CUBEMX软件,如下
就能知道你使用的定时器时钟频率了。