stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)

使用单片机:stm32f103c8t6  资源

RAM: 20K; flash: 64K;CPU频率: 72M;通用I/O: 32个;UART: 3个;SPI:2个;USB:1个;CAN: 1个;IIC: 2个

12 位同步 ADC: 2 组 10 通道 ;                工作电压: 2.0 至 3.6V

原理图:

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第1张图片

 

PWM输出过程:

1. 脉冲计数器  TIMx_CNT  为向上计数。

2. 重载计数器  TIMx_ARR  配置为N。(TIM_Period值)

3. TIMx_CNT的当前计数值 X 在TIMxCLK时钟源驱动下不断累加; 脉冲计数器 TIMx_CNT  数值 X 大于 重载计数器 TIMx_ARR 值 N 时,会重置  TIMx_CNT  值为0,重新计数。

4. TIMx_CNT计数同时,TIMx_CNT的计数值 X 会与比较寄存器(TIMx_CRR) 的值A 进行比较 ( TIM_Pulse ) ,脉冲计数器(TIMx_CNT)数值 X  小于 比较寄存器 (TIMx_CCR)的值 A 时输出高/低电平。

5. X >= A 时输出低电平(高电平) ; PWM占空比:A/(N+1)

 

stm32的pwm输出只要设置好在主循环前调用一次即可, 对用的IO就可以持续的输出PWM

TIM4配置PWM过程程序:

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第2张图片

 

J-LINK仿真配置

1. 选择“ Options for Target” 选项

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第3张图片

 

2. 在“ Debug” 中选择“Use Simulator" 注意下面的配置

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第4张图片

3. 配置好编译下

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第5张图片

4.  选择Debug模式调试

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第6张图片

5. 进入Debug模式后选择

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第7张图片

6. 配置pwm输出引脚

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第8张图片

7.

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第9张图片

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第10张图片

配置好输出引脚直接”close“掉

8. 开始仿真运行

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第11张图片

stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)_第12张图片

 

 

贴一下程序记录下:

/*
//TIM4 CH1 PWM 输出设置
//PWM 输出初始化
//arr:自动重装值
//psc:时钟预分频数
STM32F103C8T6
PB6 - TIM4_CH1
PB7 - TIM4_CH2
PB8 - TIM4_CH3
PB9 - TIM4_CH4
*/
void Tim4_PWM_Init(u16 arr,u16 psc)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能 TIMx 外设
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能 PB 时钟
	TIM_DeInit(TIM4);

  //设置该引脚为复用输出功能,输出 TIM4 CH1 的 PWM 脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //TIM4_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化 GPIO

	TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载周期值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值 不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化 TIMx
	
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2 模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
	
	
	TIM_OCInitStructure.TIM_Pulse = 200; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效
	TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH1 预装载使能
	
	
	TIM_OCInitStructure.TIM_Pulse = 400; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC2 高电平有效
	TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH2 预装载使能
	
	
	TIM_OCInitStructure.TIM_Pulse = 600; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效
	TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
	TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH3 预装载使能
	
	
	TIM_OCInitStructure.TIM_Pulse = 800; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效
	TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //CH4 预装载使能
	
	
	TIM_ARRPreloadConfig(TIM4, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器
//	TIM_CtrlPWMOutputs(TIM4,ENABLE);  //MOE 主输出使能,高级定时器必须开启
	TIM_Cmd(TIM4, ENABLE); //使能 TIMx
}

参考链接:http://www.openedv.com/posts/list/56473.htm

https://blog.csdn.net/wwt18811707971/article/details/74906149

https://blog.csdn.net/kevin_iot/article/details/61650516

你可能感兴趣的:(stm32学习)