基本定时器(TIM6/TIM7)功能包括:
1.16位自动重新加载上端计数器
2.16位可编程的分频器,用于按1和65535之间的任何因子划分(也“在运行中”)计数器时钟频率
3.触发DAC的同步电路
4.在更新事件上的中断/DMA生成:计数器溢出
时基单位包括:(可以用软件读写,在运行中也可以读写数据)
•计数器寄存器(TIMx_CNT)//
•预压寄存器(TIMx_PSC)//TIM_InitStruct.Prescaler = 0;
•自动重新加载寄存器(TIMx_ARR)//TIM_InitStruct.Autoreload = period-1;
寄存器:
TIMx->ARR=period-1;//预装载寄存器
TIMx->CCR1=period/2;//输出通道的比较值
占空比:1/2;
1、初始化定时器与PWM输出的IO口
void MX_TIM16_Init(uint32_t value)
{
LL_TIM_InitTypeDef TIM_InitStruct = {0};
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
LL_TIM_BDTR_InitTypeDef TIM_BDTRInitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM16);
//初始化TIM16中断
/* TIM16 interrupt Init */
NVIC_SetPriority(TIM1_UP_TIM16_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),IRQ_PRIO_PWM, 0));
NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn);
//初始化定时器,配置TIMx时间基础单元
uint16_t period = SystemCoreClock / value;//
//TIM = (Prescaler +1)*(Autoreload +1)/SystemCoreClock ;
TIM_InitStruct.Prescaler = 0;//指定用于划分时钟的分频器值。
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = period-1;//指定要加载到活动中的自动重新加载值
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
TIM_InitStruct.RepetitionCounter = 0;
LL_TIM_Init(TIM16, &TIM_InitStruct);
LL_TIM_DisableARRPreload(TIM16);//初始化定时器的PWM,配置TIMx输出通道
LL_TIM_OC_EnablePreload(TIM16, 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 = period/2;//占空比
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_LOW;
TIM_OC_InitStruct.OCNPolarity = LL_TIM_OCPOLARITY_HIGH;
TIM_OC_InitStruct.OCIdleState = LL_TIM_OCIDLESTATE_LOW;
TIM_OC_InitStruct.OCNIdleState = LL_TIM_OCIDLESTATE_LOW;
LL_TIM_OC_Init(TIM16, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
LL_TIM_OC_DisableFast(TIM16, LL_TIM_CHANNEL_CH1);
//初始化定时器,配置计时器的中断和死时间特性
TIM_BDTRInitStruct.OSSRState = LL_TIM_OSSR_DISABLE;
TIM_BDTRInitStruct.OSSIState = LL_TIM_OSSI_DISABLE;
TIM_BDTRInitStruct.LockLevel = LL_TIM_LOCKLEVEL_OFF;
TIM_BDTRInitStruct.DeadTime = 0;
TIM_BDTRInitStruct.BreakState = LL_TIM_BREAK_DISABLE;
TIM_BDTRInitStruct.BreakPolarity = LL_TIM_BREAK_POLARITY_HIGH;
TIM_BDTRInitStruct.AutomaticOutput = LL_TIM_AUTOMATICOUTPUT_DISABLE;
LL_TIM_BDTR_Init(TIM16, &TIM_BDTRInitStruct);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
/**TIM16 GPIO Configuration
PB8 ------> TIM16_CH1
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_8;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_14;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*下面为添加程序*/
/*后期可以更改重新加载值,输出PWM并且产生定时器中断*/
LL_TIM_EnableARRPreload(TIM16);//启用自动加载(ARR)预加载
LL_TIM_OC_EnableFast(TIM16, LL_TIM_CHANNEL_CH1);//为输出通道启用快速模式
LL_TIM_CC_EnableChannel(TIM16,LL_TIM_CHANNEL_CH1); //启用捕获/比较通道
LL_TIM_EnableIT_UPDATE(TIM16);//使能中断
LL_TIM_EnableAllOutputs(TIM16);//使能PWM输出
LL_TIM_EnableCounter(TIM16);//启用定时器
}
只打开定时器中断计时:
LL_TIM_EnableIT_UPDATE(TIM16);//使能中断
LL_TIM_EnableCounter(TIM16);//启用定时器
只打开PWM输出:
LL_TIM_OC_EnableFast(TIM16, LL_TIM_CHANNEL_CH1);//为输出通道启用快速模式
LL_TIM_CC_EnableChannel(TIM16,LL_TIM_CHANNEL_CH1); //启用捕获/比较通道
LL_TIM_EnableAllOutputs(TIM16);//使能PWM输出
LL_TIM_EnableCounter(TIM16);//启用定时器
后期更改自动加载器
LL_TIM_EnableARRPreload(TIM16);//启用自动加载(ARR)预加载
2、定时器中断
TIMx_ARR = 0x36.每次在0X36处产生一次中断触发;
产生TIM_SR_UIF为高电平,使用后需要清除中断标志;// LL_TIM_ClearFlag_UPDATE(TIM16)
/*定时器中断*/
//LL_TIM_EnableIT_UPDATE(TIM16);
//LL_TIM_EnableCounter(TIM16)
//打开定时器中断
void TIM1_UP_TIM16_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */
/* USER CODE END TIM1_UP_TIM16_IRQn 0 */
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */
if(LL_TIM_IsActiveFlag_UPDATE(TIM16))
{
//清除更新中断标志
LL_TIM_ClearFlag_UPDATE(TIM16);
}
/* USER CODE END TIM1_UP_TIM16_IRQn 1 */
}