0 Preface/Foreword
1 宏定义和数据结构
1.1 gpio_t
typedef struct {
psfr_t sfr; //GPIO SFR ADDR
u8 num;
u8 type; //type = 1,高压IO,没有300R的强上下拉电阻。 type = 0, 普通IO, 有内部300R上下拉电阻。
} gpio_t;
1.2 SFR枚举
enum {
GPIOxSET = 0,
GPIOxCLR,
GPIOx,
GPIOxDIR,
GPIOxDE,
GPIOxFEN,
GPIOxDRV,
GPIOxPU,
GPIOxPD,
GPIOxPU200K,
GPIOxPD200K,
GPIOxPU300,
GPIOxPD300,
};
1.3 pfsr_t
typedef volatile unsigned long *psfr_t;
2 API
2.1 gpio_cfg_init
代码案例:根据配置文件初始化指定GPIO口
void loudspeaker_mute_init(void)
{
if (!xcfg_cb.spk_mute_en) {
xcfg_cb.loudspeaker_unmute_delay = 0;
return;
}
u8 io_num = xcfg_cb.spk_mute_io_sel;
gpio_t *p = &mute_gpio;
bsp_gpio_cfg_init(p, io_num);
if (p->sfr == NULL) {
return;
}
p->sfr[GPIOxDE] |= BIT(p->num);
p->sfr[GPIOxDIR] &= ~BIT(p->num);
if (xcfg_cb.high_mute) {
p->sfr[GPIOxSET] = BIT(p->num);
} else {
p->sfr[GPIOxCLR] = BIT(p->num);
}
}