文章目录
- 前言
- 一、cubeMX定时器介绍
- 二、 通用寄存器
- 三、 PWM模式
- 四、LL库 PWM模式(定时器14为例)
- 1.结构体说明
- 2.LL库代码
前言
一、cubeMX定时器介绍
Slave Mode 模式用于两个定时器相互控制:当主定时器的信号出现上升沿或者下降沿时,会触发从定时器的相应动作
复位模式:
主定时器出现信号后-从定时器计数器复位并产生一个中断
门控模式:
主定时器出现信号后-从定时器计数器开始工作
主定时器信号结束后-从定时器计数器停止工作并产生中断
触发模式
主定时器出现信号后-从定时器计数器开始工作,并且不会停止
触发模式主定时器只是提供了一个启动从定时器开始时间的控制,并不会有其他效果
二、 通用寄存器
配置通用寄存器即可实现最基本的定时功能
void LL_TIM_StructInit(LL_TIM_InitTypeDef *TIM_InitStruct)
{
/* Set the default configuration */
TIM_InitStruct->Prescaler = (uint16_t)0x0000;//预分频系数,寄存器PSC
TIM_InitStruct->CounterMode = LL_TIM_COUNTERMODE_UP;//计数模式,寄存器CR1
TIM_InitStruct->Autoreload = 0xFFFFFFFFU;//自动重载值,寄存器ARR
TIM_InitStruct->ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;//时钟分频
}
时间计算
arr:自动重装值。
psc:时钟预分频数
定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
Ft=定时器工作频率,单位:Mhz
举例:
TIM3_Int_Init(5000-1,8400-1); //定时器时钟84M,分频系数8400,所以84M/8400=10Khz(0.1ms)的计数频率,10Khz/5000=2Hz(500ms)计数5000次为500ms
三、 PWM模式
四、LL库 PWM模式(定时器14为例)
1.结构体说明
代码如下(示例):
void LL_TIM_OC_StructInit(LL_TIM_OC_InitTypeDef *TIM_OC_InitStruct)
{
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;//输出比较模式1,寄存器CCMR1
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;//捕获/比较1输出使能,寄存器CCER
TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.CompareValue = 0;//捕获/比较寄存器 1值
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_LOW;//捕获/比较1输出极性,寄存器CCER
LL_TIM_OC_Init(TIM14, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
}
注意:输出比较模式1代表1通道,其他通道为对应值
TIM_OC_InitStruct->OCMode-模式说明
TIM_OC_InitStruct->OCState-捕获/比较1输出使能,寄存器CCER
TIM_OC_InitStruct.OCPolarity-捕获/比较1输出极性,寄存器CCER
TIM_OC_InitStruct.CompareValue-捕获/比较寄存器值
2.LL库代码
cubeMX配置后代码不能直接运行,需要添加一定的代码
代码如下(示例):
oid MX_TIM14_Init(void)
{
LL_TIM_InitTypeDef TIM_InitStruct = {0};
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM14);
/* USER CODE BEGIN TIM14_Init 1 */
/* USER CODE END TIM14_Init 1 */
TIM_InitStruct.Prescaler = 83;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 499;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIM14, &TIM_InitStruct);
LL_TIM_EnableARRPreload(TIM14);
LL_TIM_OC_EnablePreload(TIM14, LL_TIM_CHANNEL_CH1);
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.CompareValue = 0;
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_LOW;
LL_TIM_OC_Init(TIM14, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
LL_TIM_OC_EnableFast(TIM14, LL_TIM_CHANNEL_CH1);
LL_TIM_OC_DisablePreload(TIM14, LL_TIM_CHANNEL_CH1);
/* USER CODE BEGIN TIM14_Init 2 */
//加入代码,使能计数器
LL_TIM_EnableCounter(TIM14);
/* USER CODE END TIM14_Init 2 */
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOF);
/**TIM14 GPIO Configuration
PF9 ------> TIM14_CH1
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_9;
LL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
PWM频率:
TIM14_PWM_Init(500-1,84-1); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz(0.5ms).