1. 程式人生 > >stm32 學習 (設定TIM4輸出4路 pwm J-LINK模擬驗證)

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的pwm輸出只要設定好在主迴圈前呼叫一次即可, 對用的IO就可以持續的輸出PWM

TIM4配置PWM過程程式:

 

J-LINK模擬配置

1. 選擇“ Options for Target” 選項

 

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

3. 配置好編譯下

4.  選擇Debug模式除錯

5. 進入Debug模式後選擇

6. 配置pwm輸出引腳

7.

配置好輸出引腳直接”close“掉

8. 開始模擬執行

 

 

貼一下程式記錄下:

/*
//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