STM32CUBEMX通用/高级定时器LL库函数互补PWM

项目需求玩了CUBEMX,闲来无事配配PWM,已用示波器验证输出波形

一、通用定时器

1、基本配置

31+1=32预分频,向上计数,重装载值1000(输出频率为1KHz);
使能自动重装载,通道一输出极性(CH Polarity)高电平并初始化比较值为0,通道二输出极性低电平并初始化比较值为1000。如下
在这里插入图片描述

2、时钟树(32MHz)

在这里插入图片描述

3、生成代码
void MX_TIM22_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_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM22);

  TIM_InitStruct.Prescaler = 3199;
  TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
  TIM_InitStruct.Autoreload = 1000;
  TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
  LL_TIM_Init(TIM22, &TIM_InitStruct);
  LL_TIM_EnableARRPreload(TIM22);
  LL_TIM_SetClockSource(TIM22, LL_TIM_CLOCKSOURCE_INTERNAL);
  LL_TIM_OC_EnablePreload(TIM22, LL_TIM_CHANNEL_CH1);
  TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
  TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  TIM_OC_InitStruct.CompareValue = 0;
  TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
  LL_TIM_OC_Init(TIM22, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
  LL_TIM_OC_DisableFast(TIM22, LL_TIM_CHANNEL_CH1);
  LL_TIM_OC_EnablePreload(TIM22, LL_TIM_CHANNEL_CH2);
  TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  TIM_OC_InitStruct.CompareValue = 1000;
  TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_LOW;
  LL_TIM_OC_Init(TIM22, LL_TIM_CHANNEL_CH2, &TIM_OC_InitStruct);
  LL_TIM_OC_DisableFast(TIM22, LL_TIM_CHANNEL_CH2);
  LL_TIM_SetTriggerOutput(TIM22, LL_TIM_TRGO_RESET);
  LL_TIM_DisableMasterSlaveMode(TIM22);
  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOC);
    /**TIM22 GPIO Configuration
    PC6     ------> TIM22_CH1
    PC7     ------> TIM22_CH2
    */
  GPIO_InitStruct.Pin = K_Load1_Pin;
  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_0;
  LL_GPIO_Init(K_Load1_GPIO_Port, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = K_Load2_Pin;
  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_0;
  LL_GPIO_Init(K_Load2_GPIO_Port, &GPIO_InitStruct);

}
4、用户代码

除了调用生成的初始化函数,还需要以下一系列操作:

//LL_TIM_EnableIT_UPDATE(TIM22);//TIM22更新使能(初始化函数已配置)
LL_TIM_EnableCounter(TIM22);//TIM22计数使能	
LL_TIM_CC_EnableChannel(TIM22, LL_TIM_CHANNEL_CH1); //通道一使能
LL_TIM_CC_EnableChannel(TIM22, LL_TIM_CHANNEL_CH2); //通道二使能

//比较值-占空比
LL_TIM_OC_SetCompareCH1(TIM22 ,100); //输出极性为高,10%高电平占空比
LL_TIM_OC_SetCompareCH2(TIM22 ,100); //输出极性为低,10%低电平占空比

二、高级定时器

1、高级定时器的配置与通用定时器的配置基本一样,如下

在这里插入图片描述

2、高级定时器用户代码

除了调用生成的初始化函数,还需以下代码

//LL_TIM_EnableIT_UPDATE(TIM1);//TIM1更新使能(初始化函数已配置)
LL_TIM_EnableCounter(TIM1) ; //TIM1计数使能	
LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH4) ; //通道4使能
LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH3) ; //通道3使能

/* 高级定时器 */
LL_TIM_EnableAllOutputs(TIM1); //全输出使能
//或者:
//  SET_BIT(TIM1->BDTR, TIM_BDTR_AOE); //自动输出使能


while (1) //无聊? 双路互补波形,占空比:0->1000->0循环
{
	LL_TIM_OC_SetCompareCH3(TIM1 ,pwm); //设置比较值
	LL_TIM_OC_SetCompareCH4(TIM1 ,pwm);
	
	if(pwmflag==0)	pwm++;
	else if(pwmflag==1)	pwm--;
	
	if(pwm<=0) pwmflag=0;
	else if(pwm>=1000)	pwmflag=1;
	
	LL_mDelay(10); //延时10ms
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32通用I/O口的库函数编程方法一般包括以下几个步骤: 1. 初始化GPIO口:在使用GPIO口之前,需要先对其进行初始化设置。可以使用库函数GPIO_Init()函数进行初始化。 2. 配置GPIO口的工作模式:根据实际需求,选择GPIO口的输入/输出模式、推挽/开漏输出、上拉/下拉等工作模式。可以使用库函数GPIO_InitStructure结构体的成员变量进行设置。 3. 配置GPIO口的输出值:如果GPIO口设置为输出模式,需要设置其输出的值。可以使用库函数GPIO_WriteBit()函数进行设置。 4. 读取GPIO口的输入值:如果GPIO口设置为输入模式,需要读取其输入的值。可以使用库函数GPIO_ReadInputDataBit()函数进行读取。 示例代码如下: ```c #include "stm32f10x.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置PA5为推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //配置PA0为上拉输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } int main(void) { GPIO_Configuration(); //设置PA5输出高电平 GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET); //读取PA0输入状态 if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET) { //执行某些操作 } while(1) { //程序循环体 } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值