目录
1 Tim定时器的时钟源
2 Tim定时器的配置
2.1 中断配置
3 生成代码
4 测试结果
结尾
1 Tim定时器的时钟源
TIM1的时钟来源自APB1 Timer clocks,时钟树上所有总线频率均设置为了STM32F0能达到的最高频率,此时APB1 Timer clocks = 48MHz。
2 Tim定时器的配置
依次选择Pinout&Configuration -- > Timers -- > TIM1,参数配置如下:
Clock Source:选择Internal Clock内部时钟源。TIM的Internal Clock来自APB1 Timer clock(MHz);
Prescaler(PSC – 16 bits value):时钟源分频系数(TIMx_PSC的PSC位),一个计数的时间长度为48/48MHz = 1微妙;
Counter Mode:(TIMx_CR1中的DIR位)Up向上计数,Down向下计数,Center Aligned mode1/2/3;
Counter Period(AutoReload Register – 16 bits value):(TIMx_ARR中的ARR位)一个定时周期的时间,1000 * 1微妙 = 1毫秒;
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 中断配置
在NVIC Settings中,选择合适的中断优先级并勾选TIM1的中断使能。
3 生成代码
单击GENERATE CODE,生成代码:通过HAL_TIM_Base_Start(&htim1) 启动TIM1,TIM1_BRK_UP_TRG_COM_IRQHandler中断函数间隔500ms被周期调用一次。
Main.c:
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();
/* 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:
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_BRK_UP_TRG_COM_IRQn 0 */
/** 1ms timed interrupt **/
demo_main();
/* USER CODE END TIM1_BRK_UP_TRG_COM_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_BRK_UP_TRG_COM_IRQn 1 */
/* USER CODE END TIM1_BRK_UP_TRG_COM_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);
}
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 测试结果
LED间隔500ms周期拉高拉低。
结尾
获取更多“汽车电子资讯”和“工具链使用”,
请关注CSDN博客“汽车电子助手”,做您的好助手。