IO_CTRL

在Apollo系统中,IO的控制由内部的pin_share逻辑控制,若某IO被映射为外设的管脚,则该IO动作受外设模块逻辑控制;若未被映射为外设管脚,则IO动作受GPIO模块控制,关系如下图所示。

../_images/io_ctrl.png

该文档讲解作为GPIO时的IO使用。

使用

  1. IO初始化

    #include "io_ctrl.h"
    io_init();
    

    Apollo系统已经自动执行过上述初始化,用户无需再次初始化。

  2. 设置IO输入、输出方向

    void io_dir_write_all(uint32_t dir);
    void io_dir_output_set(uint32_t output_mask);
    void io_dir_input_set(uint32_t input_mask);
    void io_cfg_output(uint8_t pin_num);
    void io_cfg_input(uint8_t pin_num);
    void io_pin_dir_set(uint8_t pin_num,uint8_t dir);
    

    注解

    读取输入电平或设置输出电平前,务必先设置IO输入输出方向,否则IO处于无效状态,无法得到正确的结果。

    建议仅仅配置必须使用的IO方向,不建议使用io_dir_write_all()函数。io_dir_write_all()函数会将所有IO均设为有效状态,若未使用到的IO处在浮空状态,会增大芯片漏电。

  3. 输出:设置输出电平、读取输出电平

    void io_write_all(uint32_t val);
    uint32_t io_out_read_all(void);
    void io_pin_write(uint8_t pin_num,uint8_t val);
    uint8_t io_pin_out_read(uint8_t pin_num);
    void io_pin_set(uint8_t pin_num);
    void io_pin_clear(uint8_t pin_num);
    void io_pin_toggle(uint8_t pin_num);
    
  4. 输入:读取输入电平

    uint32_t io_read_all(void);
    uint8_t io_pin_read(uint8_t pin_num);
    
  5. IO上、下拉

    typedef enum
    {
        IO_PULL_DISABLE,
        IO_PULL_UP,
        IO_PULL_DOWN,
    }io_pull_type_t;
    void io_pin_pull_write(uint8_t pin_num,io_pull_type_t pull);
    io_pull_type_t io_pin_pull_read(uint8_t pin_num);
    
  6. IO外部中断配置、使能

    typedef enum
    {
        EXT_INT_TRIGGER_HIGH_LEVEL,
        EXT_INT_TRIGGER_LOW_LEVEL,
        EXT_INT_TRIGGER_POS_EDGE,
        EXT_INT_TRIGGER_NEG_EDGE,
    }ext_int_mode_t;
    void io_ext_int_cfg(uint8_t pin_num,ext_int_mode_t mode,void (*callback)());
    void io_ext_int_en(uint8_t pin_num,bool enable);
    

    注解

    只有GPIO15、GPIO16、GPIO17、GPIO22、GPIO23支持外部中断,即pin_num只可以是15、16、17、22、23。

详细API介绍参见SDK目录plf/Apollo_00/src/sys_integration/sysctrl/io_ctrl.h