P33外设 ####################### 边沿唤醒 ----------------- p33的边沿唤醒模块支持选择普通io唤醒和模拟io唤醒(本芯片仅支持普通io唤醒)支持在低功耗模式下唤醒,支持配置上升沿/下降沿,如下图所示: - 普通io有8路,配置方式为wkup_param.port[x] .. image:: file/io_wkup.png :alt: "复位“ :align: center .. centered:: 复位 .. .. figure:: file/io_wkup.svg :width: 421 :height: 201 :align: center :alt: 复位 配置边沿唤醒 >>>>>>>>>>>>>>>>>>>>> .. code-block:: c #define MAX_WAKEUP_PORT 8 //最大同时支持数字io输入个数 typedef enum { RISING_EDGE = 0, FALLING_EDGE, BOTH_EDGE, } POWER_WKUP_EDGE; //filter typedef enum { PORT_FLT_NULL = 0, PORT_FLT_16us, PORT_FLT_128us, PORT_FLT_1ms, PORT_FLT_4ms, } POWER_WKUP_FLT; struct port_wkup { u8 pullup_down_enable; //上下拉是否使能 POWER_WKUP_EDGE edge; //唤醒边沿条件 POWER_WKUP_FLT filter; //滤波参数 u8 iomap; //唤醒io }; struct p33_io_wkup_config { u8 iomap; //唤醒io u8 pullup_down_enable; //上下拉是否使能 u8 filter_enable; //滤波使能,所有通道共用滤波参数 POWER_WKUP_EDGE edge; //唤醒边沿条件 }; struct p33_io_wkup_param { POWER_WKUP_FLT filter; //滤波参数,数字 const struct p33_io_wkup_config *port[MAX_WAKEUP_PORT]; }; void power_wakeup_init(const struct p33_io_wkup_param *param); 参数: ========== ============================= param 边沿唤醒相关参数配置 ========== ============================= 唤醒io参数配置 >>>>>>>>>>>>>>>>>>>>> 普通io边沿唤醒配置。 原型: .. code-block:: c void p33_io_wakeup_init(const struct p33_io_wkup_param *param); 参数: ========== ============================= param 边沿唤醒io相关参数配置 ========== ============================= .. code-block:: c void p33_io_wkup_index_init(u8 index, const struct p33_io_wkup_config *port); 参数: ========== ============================= index io唤醒通道号 port 边沿相关参数配置 ========== ============================= 边沿唤醒回调 >>>>>>>>>>>>>>>>>>>>> 配置gpio或模拟信号边沿唤醒回调,该接口只能被调用一次,会被覆盖。 原型: .. code-block:: c void p33_io_wakeup_set_callback(void (*callback)(u8 index)); :参数: =============== ============================= callback 回调函数 index 唤醒注册的通道 =============== ============================= 示例: >>>>>>>>>>>>>>>>>>>>> .. code-block:: c const struct p33_io_wkup_config port0 = { .pullup_down_enable = 1, //配置I/O 内部上下拉是否使能 .filter_enable = 1, .edge = RISING_EDGE, //唤醒方式选择,可选:上升沿\下降沿 .iomap = IO_PORTA_02, //唤醒口选择 }; const struct p33_io_wkup_param wkup_param = { .filter = PORT_FLT_4ms, .port[1] = &port0, } static void port_wakeup_callback(u8 index) { } void power_wkup_demo(void) { power_wakeup_init(&wk_param); p33_io_wakeup_set_callback(port_wakeup_callback); //获取io_wakeup的引脚信息 u8 wake_io = 0; for (int i = 0; i < 8; i++) { if (is_wakeup_source(PWR_WK_REASON_EDGE_INDEX0+i)) { wake_io = wk_param.port[i]->iomap; } } } 长按复位 ---------- 长按复位普通io和模拟信号(本芯片只有普通io长按复位),普通io的通道与边沿唤醒通道0共用,即通道0选择的io即使长按复位,又具有边沿唤醒功能,如下图所示: .. image:: file/long_press_reset.png :alt: "复位“ :align: center .. centered:: 复位 .. .. figure:: file/long_press_reset.svg :width: 400 :align: center :alt: 复位 配置长按复位0 >>>>>>>>>>>>>>>>>>> 配置普通io的长按复位。 原型: .. code-block:: c void gpio_longpress_pin0_reset_config(u32 pin, u32 level, u32 time, u8 release, u8 protect); 参数: =============== ==================================================== pin gpio序号 level 0:下降沿触发 1:上升沿触发 time 0:关闭长按复位,1、2、4、8、16:长按复位时间,单位为秒 release 0:等待电平翻转后复位,1:立即复位 protect 0:关闭写保护,1:打开写保护 =============== ==================================================== 长按复位的写保护机制: 1、打开了写保护,所有的长按复位相关的配置都会被写保护,软件无法修改,只有重新上电后才能写入; 2、如果想保护长按复位引脚的状态,只能把长按复位引脚配置为PA5;