开发环境:
Ubuntu16.04 + SW4STM32 + STM32CubeMX + STM32F103C8T6
首先在STM32CubeMX中配置定时器。
修改IO速度为high,试了下不修改,好像也没啥影响。
tim.c中修改如下。
主要涉及3个参数,
Prescaler:预分频器,用来将系统始终分频后提供给定时器。定时器时钟 = 系统时钟 / (Prescaler + 1)
Period:PWM的周期,其为定时器时钟周期个数,而非具体时间
pulse: PWM的占空比,范围为0~100
+#define TIMER_FREQ 2000000
+
+ // the period is 1000 time clock, when Prescaler is 35, that is 2K Hz
+ uint32_t period = 100; // 100:20K Hz
+ uint32_t pulse = 0;
void MX_TIM2_Init(void)
{
......
+ /* Compute the prescaler value to have TIM2 counter clock equal to 2000000 Hz */
+ uint32_t uhPrescalerValue = (uint32_t)(SystemCoreClock / TIMER_FREQ) - 1;
htim2.Instance = TIM2;
- htim2.Init.Prescaler = 0;
+ htim2.Init.Prescaler = uhPrescalerValue;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
- htim2.Init.Period = 0;
+ htim2.Init.Period = period;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = 0;
+ sConfigOC.Pulse = pulse;
+void PWM_Start(uint32_t freq, uint32_t duty)
+{
+ period = TIMER_FREQ / freq;
+ pulse = period * duty / 100;
+
+ MX_TIM2_Init();
+
+ if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
+ {
+ /* PWM Generation Error */
+ Error_Handler();
+ }
+}
tim.h中添加PWM_Start的声明。
+ void PWM_Start(uint32_t freq, uint32_t duty);
然后调用PWM_Start()并传入频率和占空比就可以了。