stm32 學習 (設定TIM4輸出4路 pwm J-LINK模擬驗證)
阿新 • • 發佈:2018-11-10
使用微控制器: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