2.4. P33外设

2.4.1. 边沿唤醒

p33的边沿唤醒模块支持选择普通io唤醒和模拟io唤醒(本芯片仅支持普通io唤醒)支持在低功耗模式下唤醒,支持配置上升沿/下降沿,如下图所示:

  • 普通io有8路,配置方式为wkup_param.port[x]

    "复位“

    复位

2.4.1.1. 配置边沿唤醒

#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

边沿唤醒相关参数配置

2.4.1.2. 唤醒io参数配置

普通io边沿唤醒配置。

原型:

void p33_io_wakeup_init(const struct p33_io_wkup_param *param);

参数:

param

边沿唤醒io相关参数配置

void p33_io_wkup_index_init(u8 index, const struct p33_io_wkup_config *port);

参数:

index

io唤醒通道号

port

边沿相关参数配置

2.4.1.3. 边沿唤醒回调

配置gpio或模拟信号边沿唤醒回调,该接口只能被调用一次,会被覆盖。

原型:

void p33_io_wakeup_set_callback(void (*callback)(u8 index));
参数:

callback

回调函数

index

唤醒注册的通道

2.4.1.4. 示例:

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;
        }
    }
}

2.4.2. 长按复位

长按复位普通io和模拟信号(本芯片只有普通io长按复位),普通io的通道与边沿唤醒通道0共用,即通道0选择的io即使长按复位,又具有边沿唤醒功能,如下图所示:

"复位“

复位

2.4.2.1. 配置长按复位0

配置普通io的长按复位。

原型:

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;