STM32 LL TIM中断与PWM输出

基本定时器(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 */
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车观察侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值