[技术问答]

HC32F460 Pin number一样,端口不一样,怎么配置不一样的中断

[复制链接]
447|4
手机看帖
扫描二维码
随时随地手机跟帖
zengxing3624|  楼主 | 2024-1-24 11:14 | 显示全部楼层 |阅读模式
项目中需要多个中断,画的时候没注意,都使用了Pin00,但一个是PortB,一个是PortD,先初始化了PortB的Pin00,再初始化的PortD Pin00结果初始化后只有PortB的响应,PortD的不响应。哪位大神帮我改改,谢谢!


void Key1_callback()
{

        NVIC_ClearPendingIRQ(Int010_IRQn);


        }
void Init_intruppt1()
{
       
    stc_exint_config_t stcExtiConfig;        /* 外部中断配置结构体 */
    stc_irq_regi_conf_t stcIrqRegiConf; /*irq配置结构体 */
    stc_port_init_t stcPortInit;        /*管脚配置结构体 */

     /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcExtiConfig);
    MEM_ZERO_STRUCT(stcIrqRegiConf);
    MEM_ZERO_STRUCT(stcPortInit);

    /* Set PD06 as External Int Ch.6 input */
        stcPortInit.enExInt = Enable;
                stcPortInit.enPinMode = Pin_Mode_In;
                stcPortInit.enInvert=Enable;
        PORT_Init(PortB, Pin00, &stcPortInit);


    stcExtiConfig.enExitCh = ExtiCh00;
    stcExtiConfig.enFilterEn = Enable;
    stcExtiConfig.enFltClk = Pclk3Div8;
    stcExtiConfig.enExtiLvl = ExIntRisingEdge;
    EXINT_Init(&stcExtiConfig);
    stcIrqRegiConf.enIntSrc = INT_PORT_EIRQ0;
    stcIrqRegiConf.enIRQn = Int010_IRQn;
    stcIrqRegiConf.pfnCallback = &Key1_callback;
    enIrqRegistration(&stcIrqRegiConf);

    /* Clear Pending */
    NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);

    /* 配置优先级 */
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15);

    /* 使能 NVIC */
        NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);

}

void Fan_speedcount()
{
        Fan_Speed[0]++;
        NVIC_ClearPendingIRQ(Int020_IRQn);
}
void Init_FanSpeed1()
{
       
    stc_exint_config_t stcExtiConfig;        /* 外部中断配置结构体 */
    stc_irq_regi_conf_t stcIrqRegiConf; /*irq配置结构体 */
    stc_port_init_t stcPortInit;        /*管脚配置结构体 */

     /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcExtiConfig);
    MEM_ZERO_STRUCT(stcIrqRegiConf);
    MEM_ZERO_STRUCT(stcPortInit);
        stcPortInit.enExInt = Enable;
                stcPortInit.enPinMode = Pin_Mode_In;
                stcPortInit.enInvert=Enable;
        PORT_Init(PortD, Pin00, &stcPortInit);


    stcExtiConfig.enExitCh = ExtiCh00;
    stcExtiConfig.enFilterEn = Enable;
    stcExtiConfig.enFltClk = Pclk3Div8;
    stcExtiConfig.enExtiLvl = ExIntRisingEdge;
    EXINT_Init(&stcExtiConfig);
    stcIrqRegiConf.enIntSrc = INT_PORT_EIRQ0;
    stcIrqRegiConf.enIRQn = Int020_IRQn;
    stcIrqRegiConf.pfnCallback = &Fan_speedcount;
    enIrqRegistration(&stcIrqRegiConf);

    /* Clear Pending */
    NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);

    /* 配置优先级 */
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15);

    /* 使能 NVIC */
        NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);

}

使用特权

评论回复
aozima| | 2024-1-24 12:18 | 显示全部楼层
改板子吧,或看看这2个IO上面,哪个IO有输入捕获功能,这也能当中断用。

类似的问题 https://club.rt-thread.org/ask/question/54c7798ff53ce735.html

使用特权

评论回复
wubangmi| | 2024-1-24 13:29 | 显示全部楼层
这算同一组中断源,只会响应靠前的那个中断也就是PB00。
想要全部用中断只能改板子,如果将就用不想浪费PCB板的话,那PD00就只能用查询了。

使用特权

评论回复
elephant00| | 2024-1-31 09:56 | 显示全部楼层
确定不同端口的Pin number对应的外部中断引脚。根据硬件原理,每个Pin number都可以配置为外部中断引脚。因此,需要查阅HC32F460的数据手册或参考手册,了解每个端口对应的Pin number和中断引脚配置。
根据不同的中断引脚配置,编写相应的中断服务程序(ISR)。每个中断源都需要编写相应的ISR,以处理对应的中断事件。在ISR中,可以实现特定的功能或操作,例如按键按下、串口接收数据等。
在主程序中,根据不同的中断源和端口,调用相应的中断服务程序。在调用ISR之前,需要先配置相应的中断触发方式和优先级。根据HC32F460的硬件原理,可以通过设置寄存器的特定位来配置中断触发方式(上升沿触发、下降沿触发等)和优先级。

使用特权

评论回复
elephant00| | 2024-1-31 09:57 | 显示全部楼层
需要注意的是,由于不同端口的Pin number对应的外部中断引脚不同,因此ISR的实现方式和处理逻辑也需要根据具体情况进行调整。此外,在使用中断时需要注意避免嵌套中断和优先级冲突等问题,以确保程序的正确性和稳定性。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

16

帖子

2

粉丝