[开发工具]

【华大测评】二、GPIO_INTC

[复制链接]
1151|8
手机看帖
扫描二维码
随时随地手机跟帖
lisingch|  楼主 | 2020-6-24 21:47 | 显示全部楼层 |阅读模式
      第一个实验内容从了解HC32F460PETB的通用输入输出(GPIO)端口开始,本次实验内容为利用开发板上的四个独立按键(SW2、SW3、SW4、SW5)控制四个LED(D23、D26、D27、D30)的亮、灭,并且使用了按键所在端口的外部中断功能。

一、实验资源
1、HC32F460-EVB;
2、Keil V5.28;
3、ST-LINK调试器

二、资源简介
1、GPIO
      HC32F460PETB最多有83个GPIO引脚,其中的81个端口都具有5V电压容限,方便应用。每个端口都可配置为具有中断功能,具备多种工作模式,同一个端口最多支持64个可选的复用功能,还有一个比较特色的功能是同一个端口可以配置为同时支持两种功能。
2020-06-24_194208.png
2020-06-24_200438.png
2020-06-24_201228.png

      手册中“通用控制”章节部分下图中高亮文字描述存在文本错误,首先是没有“PFRSxy”寄存器,但是有个“PFSRxy”功能选择寄存器;再有就是相应的控制位在“PCRxy”通用控制寄存器。
2020-06-24_202358.png
2020-06-24_202430.png
2020-06-24_203203.png

2、INTC
2020-06-23_180615.png
2020-06-23_180747.png
      HC32F460中断控制器(INTC)看上去也是非常复杂,功能亦是非常强大,合理有效的利用中断可提升系统运行效率。本次实验中只是使用了其中的外部管脚中断。如:
2020-06-23_180153.png
2020-06-24_210245.png
2020-06-24_210557.png

外部管脚的中断源支持多种非触发方式,包括上升沿、下降沿、双边沿、低电平等,使用非常灵活。
2020-06-23_182029.png
2020-06-24_185205.png
2020-06-24_191105.png
      从配置中断到使能中断,直到最终中断响应、处理中断期间有很多的步骤,要做的事也比较多,要在大量的应用中去体会,《ARM Cortex™-M4F技术参考手册》这本书还是要好好琢磨的。好在这次实验中有官方的DEMO可以做参考,对提升理解能力非常有帮助。

三、代码实现
      根据原理图确定GPIO端口及中断配置:
2020-06-23_143907.png
2020-06-24_213250.png

功能实现的代码部分参考了官方DEMO,下面是部分片断:
void Sw2_Init(void)//KEY0
{
    stc_exint_config_t stcExtiConfig;                //外部中断配置
    stc_irq_regi_conf_t stcIrqRegiConf;                //中断请求
    stc_port_init_t stcPortInit;                        //GPIO初始化

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

    /**************************************************************************/
    /* External Int Ch.3                                                      */
    /**************************************************************************/
    stcExtiConfig.enExitCh = ExtiCh03;        //外部中断通道3

    /* Filter setting */
    stcExtiConfig.enFilterEn = Enable;        //启用过滤功能
    stcExtiConfig.enFltClk = Pclk3Div8;
    /* Both edge */
//    stcExtiConfig.enExtiLvl = ExIntBothEdge;        //检测方式下降或上升边缘检测
        stcExtiConfig.enExtiLvl = ExIntFallingEdge;        //下降沿
//        stcExtiConfig.enExtiLvl = ExIntRisingEdge;        //上升沿
//        stcExtiConfig.enExtiLvl = ExIntLowLevel;        //低电平
    EXINT_Init(&stcExtiConfig);//外部中断初始化

    /* Set PD03 as External Int Ch.3 input 将PD03设置为外部中断 Ch.3输入*/
    MEM_ZERO_STRUCT(stcPortInit);
    stcPortInit.enExInt = Enable;//使能外部中断
    PORT_Init(SW2_PORT, SW2_PIN, &stcPortInit);//PD3中断

    /* Select External Int Ch.3 */
    stcIrqRegiConf.enIntSrc = INT_PORT_EIRQ3;//PD3

    /* Register External Int to Vect.No.000 */
    stcIrqRegiConf.enIRQn = Int000_IRQn;//定义中断号为000

    /* Callback function */
    stcIrqRegiConf.pfnCallback = &KEY_ExtInt_Callback;
       
    /* Registration IRQ */
    enIrqRegistration(&stcIrqRegiConf);

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

    /* Set priority */
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15);//中断优先级别15

    /* Enable NVIC */
    NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
}


中断回调函数:
void KEY_ExtInt_Callback(void)
{
        if (Set == EXINT_Irq**Get(ExtiCh03))//SW2
        {
                LED0_TOGGLE();        //D23
                EXINT_Irq**Clr(ExtiCh03);
        }
       
        if (Set == EXINT_Irq**Get(ExtiCh04))
        {       
                LED1_TOGGLE();        //D26
                EXINT_Irq**Clr(ExtiCh04);
        }
       
        if (Set == EXINT_Irq**Get(ExtiCh05))//SW4
        {                       
                LED2_TOGGLE();        //D27
                EXINT_Irq**Clr(ExtiCh05);
        }
       
        if (Set == EXINT_Irq**Get(ExtiCh06))//SW5
        {
                LED3_TOGGLE();        //D30
                EXINT_Irq**Clr(ExtiCh06);
        }
}


四、实验总结
      实验结果符合预期,对HC32F460的GPIO及INTC的使用配置有了初步的了解和认识。实验中应该体现出按键产生不同类型“边沿”触发中断的不同反应,可是代码中还没有实践,后面要进一步进行完善。

使用特权

评论回复
zeshoufx| | 2020-6-26 10:27 | 显示全部楼层
谢谢分享,,,,,,,,,,,,

使用特权

评论回复
guojunhope| | 2020-7-1 22:14 | 显示全部楼层
请问你的代码块是怎么输入的?

使用特权

评论回复
lisingch|  楼主 | 2020-7-1 22:35 | 显示全部楼层
guojunhope 发表于 2020-7-1 22:14
请问你的代码块是怎么输入的?

键盘和鼠标啊

使用特权

评论回复
guojunhope| | 2020-7-2 07:46 | 显示全部楼层

可能我没表达清楚,我想问的是,怎样把代码输入到帖子中,才能有你现在这样的效果

使用特权

评论回复
lisingch|  楼主 | 2020-7-2 10:28 | 显示全部楼层
guojunhope 发表于 2020-7-2 07:46
可能我没表达清楚,我想问的是,怎样把代码输入到帖子中,才能有你现在这样的效果 ...

发帖时,在编辑页面中点击如下图中符号即可将代码插入。 2020-07-02_102024.png

使用特权

评论回复
guojunhope| | 2020-7-2 11:21 | 显示全部楼层
lisingch 发表于 2020-7-2 10:28
发帖时,在编辑页面中点击如下图中符号即可将代码插入。

多谢!

使用特权

评论回复
学习中

使用特权

评论回复
stormwind123| | 2021-4-2 11:56 | 显示全部楼层
学习中

使用特权

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

本版积分规则

99

主题

14978

帖子

17

粉丝