目录
1 Tim定时器的时钟源
TIM3的时钟来源自APB1 Timer clocks,时钟树上所有总线频率均设置为了STM32F0能达到的最高频率,此时APB1 Timer clocks = 48MHz。
2 Tim定时器的配置
依次选择Pinout&Configuration -- > Timers -- > TIM3,参数配置如下:
Clock Source:选择Internal Clock内部时钟源。TIM的Internal Clock来自APB1 Timer clock(MHz);
Prescaler(PSC – 16 bits value):时钟源分频系数(TIMx_PSC的PSC位),一个计数的时间长度为480/48MHz = 10微妙;
Counter Mode:(TIMx_CR1中的DIR位)Up向上计数,Down向下计数,Center Aligned mode1/2/3;
Counter Period(AutoReload Register – 16 bits value):(TIMx_ARR中的ARR位)一个定时周期的时间,10000 * 10微妙 = 100毫秒;
Internal Clock Division:(TIMx_CR1中的CKD位)时钟分频因子。定义在定时器时钟频率与数字滤波器使用的采样频率之间的分频比例;
RepetitionCounter:配置重复计数器的值,这里设置为0,表示不使用重复计数功能;
auto-reload preload:(TIMx_CR1中的ARPE位)自动重装载预装载允许位。定义在TIMx_ARR和实际的自动重装载寄存器之间是否设置缓冲器;
Trigger Output (TRGO) Parameters :一般是用来设置用作其他外设的触发源的。比如将Trigger Event Selection选择为Update Event,然后在其他外设比如ADC中配置外部触发源时选择该定时器的触发事件(如果可以的话),这样在定时器产生Update Event时就可以启动外设,实现用定时器来控制外设启动的功能;
2.1 PWM配置
在Channel 1中,选择PWM Generation CH1,会自动将MCU的PA6配置为TIM3_CH1,通过该PIN输出PWM信号。
PWM的一个周期的时间等于Counter Period的时间100ms,
PWM的Mode选择:
- PWM mode 1:在向上计数中,当计数值小于CCR值时输出高电平,计数值大于CCR值时输出低电平;在向下计数中,当计数值小于CCR值时输出低电平,计数值大于CCR值时输出高电平;
- PWM mode 2:在向上计数中,当计数值小于CCR值时输出低电平,计数值大于CCR值时输出高电平;在向下计数中,当计数值小于CCR值时输出高电平,计数值大于CCR值时输出低电平。
Pulse(16 bits value)表示CH Polarity电平的持续时间,这里高电平持续30ms,低电平持续70ms;
Fast Mode:如果频率太高可以使能快速模式。可以大大提高PWM反应时间;同时将IO口输出速度调高。
2.2 中断配置
在NVIC Settings中,选择合适的中断优先级并勾选TIM3 global interrupt的中断使能。
3 生成代码
单击GENERATE CODE,生成代码:通过HAL_TIM_Base_Start(&htim3) 启动TIM3,TIM3_IRQHandler中断函数间隔100ms被周期调用一次。通过HAL_TIM_PWM_Start启动PWM信号的输出。过程中可通过调用__HAL_TIM_SET_COMPARE来改变占空比。
Main.c:
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
demo_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
stm32f0xx_it.c:
/**
* @brief This function handles TIM3 global interrupt.
*/
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
/* USER CODE END TIM3_IRQn 1 */
}
demo.c:
#include "main.h"
#include "demo.h"
#include "tim.h"
#define LED_SWITCH_TIMER 500 // Unit:ms
#define FUNCTION_CALL_CYCLE 1 // Unit:ms
void demo_init(void)
{
/********************************Start timer TIM1**********************************/
HAL_TIM_Base_Start_IT(&htim1);
/********************************Start timer TIM3**********************************/
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);/* PWM generation Error */
}
void demo_main(void)
{
static uint16_t led_timer = 0;
static uint8_t led_flg = 0;
if(led_timer <= (LED_SWITCH_TIMER / FUNCTION_CALL_CYCLE))
{
led_timer += FUNCTION_CALL_CYCLE;
}
else
{
led_timer = 0;
if(led_flg == 0)
{
led_flg = 1;
HAL_GPIO_WritePin(GPIOB,LED_DO_Pin,GPIO_PIN_RESET); // ON LED
}
else
{
led_flg = 0;
HAL_GPIO_WritePin(GPIOB,LED_DO_Pin,GPIO_PIN_SET); // OFF LED
}
}
}
4 测试结果
PWM信号占空比30%,一个周期100ms。
结尾
获取更多“汽车电子资讯”和“工具链使用”,
请关注CSDN博客“汽车电子助手”,做您的好助手。