0.设定基础分频和溢出值(why?)
定时器TIM基础知识及基本配置(F4书)
一、实验目的
1.实现内部时钟中断+外部按键中断,并进行中断嵌套
2.定时器TIM2先触发(0,1),外部按键中断后触发(1,1)
3.观察实验现象,在定时器中断执行时,按下按键是否有反应
二、CubeMx配置
1.对于TIM2定时器:配置为内部时钟,设定基础分频和溢出值(why?),记得使能NVIC中断
2.GPIO外部中断:上升沿触发,不拉上拉下,使能中断
3.NVIC配置中断优先级
4.串口配置
5.检查系统时钟配置
三、函数编写
1.HAL库配置的函数
main.c开启初始化
在tim.c、gpio.c初始化,在it.c内有中断服务函数
注意,TIM2调用的中断回调函数是(用 next reference 找到)
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);//周期已完成
2.main初始化编写
/*HAL库自动配置*/
HAL_Init();
SystemClock_Config();//系统时钟初始化
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
/* USER手动配置*/
HAL_TIM_Base_Start_IT(&htim2);//启动基本定时器的中断模式
3.GPIO和TIM的中断服务函数编写,
TIM的中断对SysTick有影响:每隔1ms,SysTick和TIM均会产生中断,但SysTick的中断优先级为7,所以一直都只执行TIM2的中断,不执行SysTick的中断;而且TIM2有长时间函数,更加没有机会处理SysTick的中断。
改进方法:降低TIM的频率,改为10ms产生一次中断,但无论如何,仍存在bug
/* USER CODE BEGIN 0 */
//extern TIM_HandleTypeDef htim2;//方便外部函数调用,可有可无?
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t cnt = 0;
if(htim->Instance == TIM2)
{
printf("TIM[2] start [%d] data process...\r\n", cnt);
for(uint32_t i=0; i<10000000; i++)//手写软件延时,防止HAL_Delay导致SysTick不运行
{
;
}
printf("TIM[2] [%d] data process finished\r\n", cnt++);
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
printf("Entry IRQ is [GPIO_PIN_0], IRQn=%d.\r\n", EXTI0_IRQn);
}
}
/* USER CODE END 0 */
4.while函数为空,等待中断的发生即可,串口打印显示