【智能家居项目】RTOS初步(2)——中断嵌套

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函数为空,等待中断的发生即可,串口打印显示 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值