• HC32M0+ GPIO


     GPIO输入:

    1. stc_gpio_cfg_t stcGpioCfg;//配置
    2. ///< 打开GPIO外设时钟门控
    3. Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);//首先打开GPIO的时钟。
    4. ///< 端口方向配置->输入
    5. stcGpioCfg.enDir = GpioDirIn;//配置为输出
    6. ///< 端口驱动能力配置->高驱动能力
    7. stcGpioCfg.enDrv = GpioDrvL;//配置驱动能力
    8. ///< 端口上下拉配置->
    9. stcGpioCfg.enPu = GpioPuDisable;//上下拉关闭
    10. stcGpioCfg.enPd = GpioPdDisable;//上下拉关闭
    11. ///< 端口开漏输出配置->开漏输出关闭
    12. stcGpioCfg.enOD = GpioOdDisable;//开漏输出关闭
    13. ///< 端口输入/输出值寄存器总线控制模式配置->AHB
    14. stcGpioCfg.enCtrlMode = GpioAHB;//总线控制模式是AHB
    15. ///< GPIO IO USER KEY初始化
    16. Gpio_Init(STK_USER_PORT, STK_USER_PIN, &stcGpioCfg); //初始化

    输入:

    1.设置时钟

    2.设置输入输出

    3.设置驱动能力

    4.上下拉关闭

    5.开漏输出关闭

    6.AHB模式

    7.初始化

    GPIO输出 

    1. stc_gpio_cfg_t stcGpioCfg;//配置IO引脚
    2. Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);//设置GPIO的外设时钟
    3. ///< 端口方向配置->输出(其它参数与以上(输入)配置参数一致)
    4. stcGpioCfg.enDir = GpioDirOut;//配置为输出
    5. < 端口上下拉配置->无
    6. stcGpioCfg.enPu = GpioPuDisable;
    7. stcGpioCfg.enPd = GpioPdDisable;

     stc_gpio_cfg_t

    typedef struct
    {
        en_gpio_dir_t       enDir;           ///< 端口方向配置//端口方向
        en_gpio_drv_t       enDrv;           ///< 端口驱动能力配置//驱动能力//电流相关的
        en_gpio_pu_t        enPu;            ///< 端口上拉配置
        en_gpio_pd_t        enPd;            ///< 端口下拉配置
        en_gpio_od_t        enOD;            ///< 端口开漏输出配置
        en_gpio_ctrl_mode_t enCtrlMode;      ///< 端口输入/输出值寄存器总线控制模式配置//配置模式
    }stc_gpio_cfg_t;

    GPIO_IRQ

    先配置为输入。

    1. stc_gpio_cfg_t stcGpioCfg;
    2. ///< 打开GPIO外设时钟门控
    3. Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    4. ///< 端口方向配置->输入
    5. stcGpioCfg.enDir = GpioDirIn;
    6. ///< 端口驱动能力配置->高驱动能力
    7. stcGpioCfg.enDrv = GpioDrvL;
    8. ///< 端口上下拉配置->无
    9. stcGpioCfg.enPu = GpioPuDisable;
    10. stcGpioCfg.enPd = GpioPdDisable;
    11. ///< 端口开漏输出配置->开漏输出关闭
    12. stcGpioCfg.enOD = GpioOdDisable;
    13. ///< 端口输入/输出值寄存器总线控制模式配置->AHB
    14. stcGpioCfg.enCtrlMode = GpioAHB;
    15. ///< GPIO IO USER KEY初始化
    16. Gpio_Init(STK_USER_PORT, STK_USER_PIN, &stcGpioCfg);

     配置下降沿/实能中断号以及中断优先级

    1. ///< 打开并配置USER KEY为下降沿中断
    2. Gpio_EnableIrq(STK_USER_PORT, STK_USER_PIN, GpioIrqFalling);//下降沿
    3. ///< 使能端口PORTA系统中断
    4. EnableNvic(PORTA_IRQn, IrqLevel3, TRUE);//中断号//中断优先级//这个怎么确认

    中断服务函数

    1. ///< PortA中断服务函数
    2. void PortA_IRQHandler(void)
    3. {
    4. if(TRUE == Gpio_GetIrqStatus(STK_USER_PORT, STK_USER_PIN))
    5. {
    6. ///< LED点亮
    7. Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
    8. delay1ms(2000);
    9. ///< LED关闭
    10. Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
    11. Gpio_ClearIrq(STK_USER_PORT, STK_USER_PIN);
    12. }
    13. }

     简单总结一下:

    1.进行端口设置

    2.端口下降沿的使能

    3.配置中断向量号以及中断优先级

    4.配置中断服务函数

     插入

     中断响应过程

    1. 中断源发出中断请求
    2. 判断处理器是否允许中断,以及该中断源是否被屏蔽
    3. 中断优先级排队
    4. 处理器暂停当前程序,保护断点地址和处理器的当前状态,根据中断类型号,查找中断向量表,转到对应的中断服务程序
    5. 执行中断服务程序
    6. 恢复被保护的状态,执行中断返回指令,回到被中断的程序
    • 多个中断同时出现时,处理器先响应高优先级的中断
    • 低优先级中断的ISR执行时,可以被高优先级中断再次打断
    • ISR比App Code拥有更高的执行优先级

    其他        

    1. typedef struct
    2. {
    3. boolean_t bOutputVal; ///< 默认端口输出电平
    4. en_gpio_dir_t enDir; ///< 端口方向配置
    5. en_gpio_drv_t enDrv; ///< 端口驱动能力配置
    6. en_gpio_pu_t enPu; ///< 端口上拉配置
    7. en_gpio_pd_t enPd; ///< 端口下拉配置
    8. en_gpio_od_t enOD; ///< 端口开漏输出配置
    9. en_gpio_ctrl_mode_t enCtrlMode; ///< 端口输入/输出值寄存器总线控制模式配置
    10. }stc_gpio_cfg_t;

  • 相关阅读:
    物流“独角兽”官微声讨 CEO:拖欠工资,云鸟真的“飞”跑了
    Cesium加载3D Tiles模型
    ROC曲线
    springboot+vue美容院美妆化妆品商城管理系统nodejs
    JavaScript - 将特定格式的字符串保存为 CSV 文件
    园子的商业化努力-阿里云云市场合作-第1季第1集
    Vue的学习笔记四:组件
    【Boost C++ 库】共享内存详解
    nvidia-1080服务器上离线安装mmdetection2.23步骤
    Python列表操作指南:索引、切片、遍历与综合应用
  • 原文地址:https://blog.csdn.net/weixin_39657978/article/details/125503191