OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3838|回复: 3

ucosiii使用外部中断,使用MDK进行软件仿真模拟外部中断触发时,中断进不去不知道具体原因是什么

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2021-4-30
在线时间
9 小时
发表于 2022-2-15 08:53:49 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

如图所示,我想要在软件仿真模拟一次外部中断,是不是可以操作右边的GPIOA的ODR寄存器控制ODR0为高即可? 中断服务函数就是从库函数版本的外部终端实验里边移植过来的 void EXTI0_IRQHandler(void) { OS_ERR err; #ifdef SYSTEM_SUPPORT_OS //如果时钟节拍数定义了,说明要使用ucosII了. OSIntEnter(); #endif delay_ms(10); //消抖 if(WK_UP==1) { WK_UP_EXTIO_num++; //统计进入中断 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2021-4-30
在线时间
9 小时
 楼主| 发表于 2022-2-15 08:53:50 | 显示全部楼层
9G`$RR_YG11@$@CDI@{BCBB.png
如图所示,我想要在软件仿真模拟一次外部中断,是不是可以操作右边的GPIOA的ODR寄存器控制ODR0为高即可?
中断服务函数就是从库函数版本的外部终端实验里边移植过来的
void EXTI0_IRQHandler(void)
{
        OS_ERR err;
       
#ifdef SYSTEM_SUPPORT_OS                 //如果时钟节拍数定义了,说明要使用ucosII了.
        OSIntEnter();   
#endif       
  delay_ms(10);    //消抖
        if(WK_UP==1)
        {          
          WK_UP_EXTIO_num++;       //统计进入中断的次数,使用消息邮箱发送出去。
        //发送消息
                        OSQPost((OS_Q*                )&WK_UP_Msg,               
                                        (void*                )&WK_UP_EXTIO_num,
                                        (OS_MSG_SIZE)1,
                                        (OS_OPT                )OS_OPT_POST_FIFO,
                                        (OS_ERR*        )&err);
        }
        EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位       
#ifdef SYSTEM_SUPPORT_OS                 //如果时钟节拍数定义了,说明要使用ucosII了.
        OSIntExit();                                                                                           
#endif
}

中断服务函数这样写的,
初始化是这样的
void EXTIX_Init(void)
{

          EXTI_InitTypeDef EXTI_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

          RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟

          KEY_Init();//初始化按键对应io模式

    //GPIOC.5 中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);

          EXTI_InitStructure.EXTI_Line=EXTI_Line5;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

    //GPIOA.15          中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

          EXTI_InitStructure.EXTI_Line=EXTI_Line15;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

    //GPIOA.0          中断线以及中断初始化配置
          GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

           EXTI_InitStructure.EXTI_Line=EXTI_Line0;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器



          NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
               
                NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);


           NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级1
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
          NVIC_Init(&NVIC_InitStructure);

}


回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
发表于 2022-2-15 10:07:04 | 显示全部楼层
中断进不去不就这么几个原因啊
1.总中断没开,
2.外设分管的中断没开
3.有更高优先级的中断在处理
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2034
金钱
2034
注册时间
2021-7-17
在线时间
635 小时
发表于 2022-2-15 10:22:28 | 显示全部楼层
中断处理函数的名字不对也无法触发的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表