【FR801xH】富芮坤FR801xH之PMU GPIO
00. 目录
文章目录
- 00. 目录
- 01. FR801xH概述
- 02. FR801xH功能框图
- 03. IO MUX概述
- 04. 普通IO接口
- 4.1 system_port_t
- 4.2 system_port_bit_t
- 4.3 IO FUNC
- 4.4 system_set_port_mux
- 4.5 system_set_port_pull
- 05. 低功耗模式的IO接口
- 5.1 pmu_set_pin_to_PMU
- 5.2 pmu_set_pin_to_CPU
- 5.3 pmu_set_port_mux
- 5.4 pmu_set_pin_dir
- 5.5 pmu_set_pin_pull
- 5.6 pmu_port_wakeup_func_set
- 5.7 pmu_gpio_isr_ram
- 06. 程序示例
- 07. 附录
01. FR801xH概述
FR801xH 系列芯片是面向SOC(片上系统),易于快速开发的低功耗蓝牙芯片。基于 Freqchip 的蓝牙智能固件和协议栈的支持,完全兼容蓝牙 V5.3(LE 模式)协议。同时用户可以基于芯片内置的 ARM CorteM3 嵌入式 32 位高性能单片机开发各种应用程序。
蓝牙智能固件包括 L2CAP 服务层协议、安全管理器 (SM)、属性协议(ATT)、通用属性配置文件 (GATT)和通用访问配置文件(GAP)。此外,还 支持应用程序配置文件,例如接近度、健康温度计、 心率、血压、血糖、人机界面设备(HID)和 SDK (包括驱动程序、OS-API 等)。SDK 还集成了用于网络应用程序的 SIG Mesh 协议。
采用 Freqchip 的创新技术,将 PMU(锂电池充电 器+LDO)、带 XIP 模式的 QSPI FLASH ROM、 I2C、UART、GPIO、ADC、PWM 集成在一块芯片中,为客户提供:
- 竞争力的功耗
- 稳定的蓝牙连接
- 极低的 BOM 成本
02. FR801xH功能框图
03. IO MUX概述
FR801xH 系列芯片共有 4 组 IO,每组有 8 路,不同型号的芯片引出的 IO 数量有所不同。每个 IO 可配置为上拉模式,上拉电阻约为 50K 欧姆。IO 的工作状态和模式可选择由大数字(进入低功耗后断电)或者 PMU(进入低功耗模式后继续工作)控制。IO 的控制逻辑和功能配置如下图所示:
04. 普通IO接口
以下 API 位于 components\driver\include\driver_system.h
中。
4.1 system_port_t
enum system_port_t
{GPIO_PORT_A,GPIO_PORT_B,GPIO_PORT_C,GPIO_PORT_D,
};
4.2 system_port_bit_t
enum system_port_bit_t
{GPIO_BIT_0,GPIO_BIT_1,GPIO_BIT_2,GPIO_BIT_3,GPIO_BIT_4,GPIO_BIT_5,GPIO_BIT_6,GPIO_BIT_7,
};
4.3 IO FUNC
/**********************************************************************************************************************************
PX/MUX 4'h0 4'h1 4'h2 4'h3 4'h4 4'h5 4'h6 4'h7 4'h8 4'ha
PORTA0 gpio_a0 I2C0_CLK I2S_CLK PWM0 SSP0_CLK UART0_RXD UART1_RXD CLK_OUT PDM_CLK
PORTA1 gpio_a1 I2C0_DAT I2S_FRM PWM1 SSP0_CSN UART0_TXD UART1_TXD ant_ctl[0] PDM_DATA
PORTA2 gpio_a2 I2C1_CLK I2S_DOUT PWM2 SSP0_DOUT UART0_RXD UART1_RXD ant_ctl[0] PDM_CLK
PORTA3 gpio_a3 I2C1_DAT I2S_DIN PWM3 SSP0_DIN UART0_TXD UART1_TXD ant_ctl[1] PDM_DATA
PORTA4 gpio_a4 I2C0_CLK I2S_CLK PWM4 SSP0_CLK UART0_RXD UART1_RXD CLK_OUT PDM_CLK
PORTA5 gpio_a5 I2C0_DAT I2S_FRM PWM5 SSP0_CSN UART0_TXD UART1_TXD ant_ctl[1] PDM_DATA
PORTA6 gpio_a6 I2C1_CLK I2S_DOUT PWM0 SSP0_DOUT UART0_RXD UART1_RXD CLK_OUT PDM_CLK
PORTA7 gpio_a7 I2C1_DAT I2S_DIN PWM1 SSP0_DIN UART0_TXD UART1_TXD ant_ctl[0] PDM_DATA PORTB0 gpio_b0 I2C0_CLK I2S_CLK PWM0 SSP0_CLK UART0_RXD UART1_RXD ble_tx PDM_CLK
PORTB1 gpio_b1 I2C0_DAT I2S_FRM PWM1 SSP0_CSN UART0_TXD UART1_TXD ble_rx PDM_DATA
PORTB2 gpio_b2 I2C1_CLK I2S_DOUT PWM2 SSP0_DOUT UART0_RXD UART1_RXD wlan_tx/in PDM_CLK
PORTB3 gpio_b3 I2C1_DAT I2S_DIN PWM3 SSP0_DIN UART0_TXD UART1_TXD wlan_rx/in PDM_DATA
PORTB4 gpio_b4 I2C0_CLK I2S_CLK PWM4 SSP0_CLK UART0_RXD UART1_RXD CLK_OUT PDM_CLK
PORTB5 gpio_b5 I2C0_DAT I2S_FRM PWM5 SSP0_CSN UART0_TXD UART1_TXD ant_ctl[0] PDM_DATA
PORTB6 gpio_b6 I2C1_CLK I2S_DOUT PWM2 SSP0_DOUT UART0_RXD UART1_RXD ant_ctl[1] PDM_CLK
PORTB7 gpio_b7 I2C1_DAT I2S_DIN PWM3 SSP0_DIN UART0_TXD UART1_TXD CLK_OUT PDM_DATA PORTC0 gpio_c0 I2C0_CLK I2S_CLK PWM0 SSP0_CLK UART0_RXD UART1_RXD SWV PDM_CLK
PORTC1 gpio_c1 I2C0_DAT I2S_FRM PWM1 SSP0_CSN UART0_TXD UART1_TXD SWV PDM_DATA
PORTC2 gpio_c2 I2C1_CLK I2S_DOUT PWM2 SSP0_DOUT UART0_RXD UART1_RXD SWV PDM_CLK
PORTC3 gpio_c3 I2C1_DAT I2S_DIN PWM3 SSP0_DIN UART0_TXD UART1_TXD SWV PDM_DATA
PORTC4 gpio_c4 I2C0_CLK I2S_CLK PWM4 SSP0_CLK UART0_RXD UART1_RXD ant_ctl[1] PDM_CLK
PORTC5 gpio_c5 I2C0_DAT I2S_FRM PWM5 SSP0_CSN UART0_TXD UART1_TXD SWV PDM_DATA
PORTC6 gpio_c6 I2C1_CLK I2S_DOUT PWM4 SSP0_DOUT UART0_RXD UART1_RXD SW_TCK PDM_CLK
PORTC7 gpio_c7 I2C1_DAT I2S_DIN PWM5 SSP0_DIN UART0_TXD UART1_TXD SW_DIO PDM_DATA PORTD0 gpio_d0 I2C0_CLK I2S_CLK PWM0 SSP0_CLK UART0_RXD UART1_RXD ble_tx PDM_CLK
PORTD1 gpio_d1 I2C0_DAT I2S_FRM PWM1 SSP0_CSN UART0_TXD UART1_TXD ble_rx PDM_DATA
PORTD2 gpio_d2 I2C1_CLK I2S_DOUT PWM2 SSP0_DOUT UART0_RXD UART1_RXD wlan_tx/in PDM_CLK
PORTD3 gpio_d3 I2C1_DAT I2S_DIN PWM3 SSP0_DIN UART0_TXD UART1_TXD wlan_rx/in PDM_DATA
PORTD4 gpio_d4 I2C0_CLK I2S_CLK PWM4 SSP0_CLK UART0_RXD UART1_RXD ant_ctl[0] PDM_CLK ADC0
PORTD5 gpio_d5 I2C0_DAT I2S_FRM PWM5 SSP0_CSN UART0_TXD UART1_TXD ant_ctl[0] PDM_DATA ADC1
PORTD6 gpio_d6 I2C1_CLK I2S_DOUT PWM0 SSP0_DOUT UART0_RXD UART1_RXD CLK_OUT PDM_CLK ADC2
PORTD7 gpio_d7 I2C1_DAT I2S_DIN PWM1 SSP0_DIN UART0_TXD UART1_TXD ant_ctl[1] PDM_DATA ADC3*************************************************************************************************************************************/#define PORTA0_FUNC_A0 0x00
#define PORTA0_FUNC_I2C0_CLK 0x01
#define PORTA0_FUNC_I2S_CLK 0x02
#define PORTA0_FUNC_PWM0 0x03
#define PORTA0_FUNC_SSP0_CLK 0x04
#define PORTA0_FUNC_UART0_RXD 0x05
#define PORTA0_FUNC_UART1_RXD 0x06
#define PORTA0_FUNC_CLK_OUT 0x07
#define PORTA0_FUNC_PDM_CLK 0x08#define PORTA1_FUNC_A1 0x00
#define PORTA1_FUNC_I2C0_DAT 0x01
#define PORTA1_FUNC_I2S_FRM 0x02
#define PORTA1_FUNC_PWM1 0x03
#define PORTA1_FUNC_SSP0_CSN 0x04
#define PORTA1_FUNC_UART0_TXD 0x05
#define PORTA1_FUNC_UART1_TXD 0x06
#define PORTA1_FUNC_ANT_CTL0 0x07
#define PORTA1_FUNC_PDM_DAT 0x08#define PORTA2_FUNC_A2 0x00
#define PORTA2_FUNC_I2C1_CLK 0x01
#define PORTA2_FUNC_I2S_DOUT 0x02
#define PORTA2_FUNC_PWM2 0x03
#define PORTA2_FUNC_SSP0_DOUT 0x04
#define PORTA2_FUNC_UART0_RXD 0x05
#define PORTA2_FUNC_UART1_RXD 0x06
#define PORTA2_FUNC_ANT_CTL0 0x07
#define PORTA2_FUNC_PDM_CLK 0x08#define PORTA3_FUNC_A3 0x00
#define PORTA3_FUNC_I2C1_DAT 0x01
#define PORTA3_FUNC_I2S_DIN 0x02
#define PORTA3_FUNC_PWM3 0x03
#define PORTA3_FUNC_SSP0_DIN 0x04
#define PORTA3_FUNC_UART0_TXD 0x05
#define PORTA3_FUNC_UART1_TXD 0x06
#define PORTA3_FUNC_ANT_CTL1 0x07
#define PORTA3_FUNC_PDM_DAT 0x08#define PORTA4_FUNC_A4 0x00
#define PORTA4_FUNC_I2C0_CLK 0x01
#define PORTA4_FUNC_I2S_CLK 0x02
#define PORTA4_FUNC_PWM4 0x03
#define PORTA4_FUNC_SSP0_CLK 0x04
#define PORTA4_FUNC_UART0_RXD 0x05
#define PORTA4_FUNC_UART1_RXD 0x06
#define PORTA4_FUNC_CLK_OUT 0x07
#define PORTA4_FUNC_PDM_CLK 0x08#define PORTA5_FUNC_A5 0x00
#define PORTA5_FUNC_I2C0_DAT 0x01
#define PORTA5_FUNC_I2S_FRM 0x02
#define PORTA5_FUNC_PWM5 0x03
#define PORTA5_FUNC_SSP0_CSN 0x04
#define PORTA5_FUNC_UART0_TXD 0x05
#define PORTA5_FUNC_UART1_TXD 0x06
#define PORTA5_FUNC_ANT_CTL1 0x07
#define PORTA5_FUNC_PDM_DAT 0x08#define PORTA6_FUNC_A6 0x00
#define PORTA6_FUNC_I2C1_CLK 0x01
#define PORTA6_FUNC_I2S_DOUT 0x02
#define PORTA6_FUNC_PWM0 0x03
#define PORTA6_FUNC_SSP0_DOUT 0x04
#define PORTA6_FUNC_UART0_RXD 0x05
#define PORTA6_FUNC_UART1_RXD 0x06
#define PORTA6_FUNC_CLK_OUT 0x07
#define PORTA6_FUNC_PDM_CLK 0x08#define PORTA7_FUNC_A7 0x00
#define PORTA7_FUNC_I2C1_DAT 0x01
#define PORTA7_FUNC_I2S_DIN 0x02
#define PORTA7_FUNC_PWM1 0x03
#define PORTA7_FUNC_SSP0_DIN 0x04
#define PORTA7_FUNC_UART0_TXD 0x05
#define PORTA7_FUNC_UART1_TXD 0x06
#define PORTA7_FUNC_ANT_CTL0 0x07
#define PORTA7_FUNC_PDM_DAT 0x08#define PORTB0_FUNC_B0 0x00
#define PORTB0_FUNC_I2C0_CLK 0x01
#define PORTB0_FUNC_I2S_CLK 0x02
#define PORTB0_FUNC_PWM0 0x03
#define PORTB0_FUNC_SSP0_CLK 0x04
#define PORTB0_FUNC_UART0_RXD 0x05
#define PORTB0_FUNC_UART1_RXD 0x06
#define PORTB0_FUNC_BLE_TX 0x07
#define PORTB0_FUNC_PDM_CLK 0x08#define PORTB1_FUNC_B1 0x00
#define PORTB1_FUNC_I2C0_DAT 0x01
#define PORTB1_FUNC_PWM1 0x03
#define PORTB1_FUNC_SSP0_CSN 0x04
#define PORTB1_FUNC_UART0_TXD 0x05
#define PORTB1_FUNC_UART1_TXD 0x06
#define PORTB1_FUNC_BLE_RX 0x07
#define PORTB1_FUNC_PDM_DAT 0x08#define PORTB2_FUNC_B2 0x00
#define PORTB2_FUNC_I2C1_CLK 0x01
#define PORTB2_FUNC_I2S_DOUT 0x02
#define PORTB2_FUNC_PWM2 0x03
#define PORTB2_FUNC_SSP0_DOUT 0x04
#define PORTB2_FUNC_UART0_RXD 0x05
#define PORTB2_FUNC_UART1_RXD 0x06
#define PORTB2_FUNC_WLAN_TX 0x07
#define PORTB2_FUNC_PDM_CLK 0x08#define PORTB3_FUNC_B3 0x00
#define PORTB3_FUNC_I2C1_DAT 0x01
#define PORTB3_FUNC_I2S_DIN 0x02
#define PORTB3_FUNC_PWM3 0x03
#define PORTB3_FUNC_SSP0_DIN 0x04
#define PORTB3_FUNC_UART0_TXD 0x05
#define PORTB3_FUNC_UART1_TXD 0x06
#define PORTB3_FUNC_WLAN_RX 0x07
#define PORTB3_FUNC_PDM_DAT 0x08#define PORTB4_FUNC_B4 0x00
#define PORTB4_FUNC_I2C0_CLK 0x01
#define PORTB4_FUNC_I2S_CLK 0x02
#define PORTB4_FUNC_PWM4 0x03
#define PORTB4_FUNC_SSP0_CLK 0x04
#define PORTB4_FUNC_UART0_RXD 0x05
#define PORTB4_FUNC_UART1_RXD 0x06
#define PORTB4_FUNC_CLK_OUT 0x07
#define PORTB4_FUNC_PDM_CLK 0x08#define PORTB5_FUNC_B5 0x00
#define PORTB5_FUNC_I2C0_DAT 0x01
#define PORTB5_FUNC_I2S_FRM 0x02
#define PORTB5_FUNC_PWM5 0x03
#define PORTB5_FUNC_SSP0_CSN 0x04
#define PORTB5_FUNC_UART0_TXD 0x05
#define PORTB5_FUNC_UART1_TXD 0x06
#define PORTB5_FUNC_ANT_CTL0 0x07
#define PORTB5_FUNC_PDM_DAT 0x08#define PORTB6_FUNC_B6 0x00
#define PORTB6_FUNC_I2C1_CLK 0x01
#define PORTB6_FUNC_I2S_DOUT 0x02
#define PORTB6_FUNC_PWM2 0x03
#define PORTB6_FUNC_SSP0_DOUT 0x04
#define PORTB6_FUNC_UART0_RXD 0x05
#define PORTB6_FUNC_UART1_RXD 0x06
#define PORTB6_FUNC_ANT_CTL1 0x07
#define PORTB6_FUNC_PDM_CLK 0x08#define PORTB7_FUNC_B7 0x00
#define PORTB7_FUNC_I2C1_DAT 0x01
#define PORTB7_FUNC_I2S_DIN 0x02
#define PORTB7_FUNC_PWM3 0x03
#define PORTB7_FUNC_SSP0_DIN 0x04
#define PORTB7_FUNC_UART0_TXD 0x05
#define PORTB7_FUNC_UART1_TXD 0x06
#define PORTB7_FUNC_CLK_OUT 0x07
#define PORTB7_FUNC_PDM_DAT 0x08#define PORTC0_FUNC_C0 0x00
#define PORTC0_FUNC_I2C0_CLK 0x01
#define PORTC0_FUNC_I2S_CLK 0x02
#define PORTC0_FUNC_PWM0 0x03
#define PORTC0_FUNC_SSP0_CLK 0x04
#define PORTC0_FUNC_UART0_RXD 0x05
#define PORTC0_FUNC_UART1_RXD 0x06
#define PORTC0_FUNC_SWV 0x07
#define PORTC0_FUNC_PDM_CLK 0x08#define PORTC1_FUNC_C1 0x00
#define PORTC1_FUNC_I2C0_DAT 0x01
#define PORTC1_FUNC_PWM1 0x03
#define PORTC1_FUNC_SSP0_CSN 0x04
#define PORTC1_FUNC_UART0_TXD 0x05
#define PORTC1_FUNC_UART1_TXD 0x06
#define PORTC1_FUNC_SWV 0x07
#define PORTC1_FUNC_PDM_DAT 0x08#define PORTC2_FUNC_C2 0x00
#define PORTC2_FUNC_I2C1_CLK 0x01
#define PORTC2_FUNC_I2S_DOUT 0x02
#define PORTC2_FUNC_PWM2 0x03
#define PORTC2_FUNC_SSP0_DOUT 0x04
#define PORTC2_FUNC_UART0_RXD 0x05
#define PORTC2_FUNC_UART1_RXD 0x06
#define PORTC2_FUNC_SWV 0x07
#define PORTC2_FUNC_PDM_CLK 0x08#define PORTC3_FUNC_C3 0x00
#define PORTC3_FUNC_I2C1_DAT 0x01
#define PORTC3_FUNC_I2S_DIN 0x02
#define PORTC3_FUNC_PWM3 0x03
#define PORTC3_FUNC_SSP0_DIN 0x04
#define PORTC3_FUNC_UART0_TXD 0x05
#define PORTC3_FUNC_UART1_TXD 0x06
#define PORTC3_FUNC_SWV 0x07
#define PORTC3_FUNC_PDM_DAT 0x08#define PORTC4_FUNC_C4 0x00
#define PORTC4_FUNC_I2C0_CLK 0x01
#define PORTC4_FUNC_I2S_CLK 0x02
#define PORTC4_FUNC_PWM4 0x03
#define PORTC4_FUNC_SSP0_CLK 0x04
#define PORTC4_FUNC_UART0_RXD 0x05
#define PORTC4_FUNC_UART1_RXD 0x06
#define PORTC4_FUNC_ANT_CTL1 0x07
#define PORTC4_FUNC_PDM_CLK 0x08#define PORTC5_FUNC_C5 0x00
#define PORTC5_FUNC_I2C0_DAT 0x01
#define PORTC5_FUNC_I2S_FRM 0x02
#define PORTC5_FUNC_PWM5 0x03
#define PORTC5_FUNC_SSP0_CSN 0x04
#define PORTC5_FUNC_UART0_TXD 0x05
#define PORTC5_FUNC_UART1_TXD 0x06
#define PORTC5_FUNC_SWV 0x07
#define PORTC5_FUNC_PDM_DAT 0x08#define PORTC6_FUNC_C6 0x00
#define PORTC6_FUNC_I2C1_CLK 0x01
#define PORTC6_FUNC_I2S_DOUT 0x02
#define PORTC6_FUNC_PWM4 0x03
#define PORTC6_FUNC_SSP0_DOUT 0x04
#define PORTC6_FUNC_UART0_RXD 0x05
#define PORTC6_FUNC_UART1_RXD 0x06
#define PORTC6_FUNC_SW_TCK 0x07
#define PORTC6_FUNC_PDM_CLK 0x08#define PORTC7_FUNC_C7 0x00
#define PORTC7_FUNC_I2C1_DAT 0x01
#define PORTC7_FUNC_I2S_DIN 0x02
#define PORTC7_FUNC_PWM5 0x03
#define PORTC7_FUNC_SSP0_DIN 0x04
#define PORTC7_FUNC_UART0_TXD 0x05
#define PORTC7_FUNC_UART1_TXD 0x06
#define PORTC7_FUNC_SW_DIO 0x07
#define PORTC7_FUNC_PDM_DAT 0x08#define PORTD0_FUNC_D0 0x00
#define PORTD0_FUNC_I2C0_CLK 0x01
#define PORTD0_FUNC_I2S_CLK 0x02
#define PORTD0_FUNC_PWM0 0x03
#define PORTD0_FUNC_SSP0_CLK 0x04
#define PORTD0_FUNC_UART0_RXD 0x05
#define PORTD0_FUNC_UART1_RXD 0x06
#define PORTD0_FUNC_BLE_TX 0x07
#define PORTD0_FUNC_PDM_CLK 0x08#define PORTD1_FUNC_D1 0x00
#define PORTD1_FUNC_I2C0_DAT 0x01
#define PORTD1_FUNC_PWM1 0x03
#define PORTD1_FUNC_SSP0_CSN 0x04
#define PORTD1_FUNC_UART0_TXD 0x05
#define PORTD1_FUNC_UART1_TXD 0x06
#define PORTD1_FUNC_BLE_RX 0x07
#define PORTD1_FUNC_PDM_DAT 0x08#define PORTD2_FUNC_D2 0x00
#define PORTD2_FUNC_I2C1_CLK 0x01
#define PORTD2_FUNC_I2S_DOUT 0x02
#define PORTD2_FUNC_PWM2 0x03
#define PORTD2_FUNC_SSP0_DOUT 0x04
#define PORTD2_FUNC_UART0_RXD 0x05
#define PORTD2_FUNC_UART1_RXD 0x06
#define PORTD2_FUNC_WLAN_TX 0x07
#define PORTD2_FUNC_PDM_CLK 0x08#define PORTD3_FUNC_D3 0x00
#define PORTD3_FUNC_I2C1_DAT 0x01
#define PORTD3_FUNC_I2S_DIN 0x02
#define PORTD3_FUNC_PWM3 0x03
#define PORTD3_FUNC_SSP0_DIN 0x04
#define PORTD3_FUNC_UART0_TXD 0x05
#define PORTD3_FUNC_UART1_TXD 0x06
#define PORTD3_FUNC_WLAN_RX 0x07
#define PORTD3_FUNC_PDM_DAT 0x08#define PORTD4_FUNC_D4 0x00
#define PORTD4_FUNC_I2C0_CLK 0x01
#define PORTD4_FUNC_I2S_CLK 0x02
#define PORTD4_FUNC_PWM4 0x03
#define PORTD4_FUNC_SSP0_CLK 0x04
#define PORTD4_FUNC_UART0_RXD 0x05
#define PORTD4_FUNC_UART1_RXD 0x06
#define PORTD4_FUNC_ANT_CTL0 0x07
#define PORTD4_FUNC_PDM_CLK 0x08
#define PORTD4_FUNC_ADC0 0x0c#define PORTD5_FUNC_D5 0x00
#define PORTD5_FUNC_I2C0_DAT 0x01
#define PORTD5_FUNC_I2S_FRM 0x02
#define PORTD5_FUNC_PWM5 0x03
#define PORTD5_FUNC_SSP0_CSN 0x04
#define PORTD5_FUNC_UART0_TXD 0x05
#define PORTD5_FUNC_UART1_TXD 0x06
#define PORTD5_FUNC_ANT_CTL0 0x07
#define PORTD5_FUNC_PDM_DAT 0x08
#define PORTD5_FUNC_ADC1 0x0c#define PORTD6_FUNC_D6 0x00
#define PORTD6_FUNC_I2C1_CLK 0x01
#define PORTD6_FUNC_I2S_DOUT 0x02
#define PORTD6_FUNC_PWM0 0x03
#define PORTD6_FUNC_SSP0_DOUT 0x04
#define PORTD6_FUNC_UART0_RXD 0x05
#define PORTD6_FUNC_UART1_RXD 0x06
#define PORTD6_FUNC_CLK_OUT 0x07
#define PORTD6_FUNC_PDM_CLK 0x08
#define PORTD6_FUNC_ADC2 0x0c#define PORTD7_FUNC_D7 0x00
#define PORTD7_FUNC_I2C1_DAT 0x01
#define PORTD7_FUNC_I2S_DIN 0x02
#define PORTD7_FUNC_PWM1 0x03
#define PORTD7_FUNC_SSP0_DIN 0x04
#define PORTD7_FUNC_UART0_TXD 0x05
#define PORTD7_FUNC_UART1_TXD 0x06
#define PORTD7_FUNC_ANT_CTL1 0x07
#define PORTD7_FUNC_PDM_DAT 0x08
#define PORTD7_FUNC_ADC3 0x0c
4.4 system_set_port_mux
/********************************************************************** @fn system_set_port_mux** @brief set function of IO which is controlled by main digital core,* example usage:* system_set_port_mux(GPIO_PORT_A, GPIO_BIT_0, PMU_PORT_MUX_KEYSCAN)** @param port - which group the io belongs to, @ref system_port_t* bit - the channel number, @ref system_port_bit_t* func - such as PORTA0_FUNC_I2C0_CLK, PORTA3_FUNC_PDM_DAT** @return None.*/
void system_set_port_mux(enum system_port_t port, enum system_port_bit_t bit, uint8_t func);
功能:设置 IO 由大数字控制时的功能,单次设置一个 IO
参数:port IO 所属的端口组bit IO 的 channel 编号func 所要设置的功能
返回值:无
示例
system_set_port_mux(GPIO_PORT_A, GPIO_BIT_0, PORTA0_FUNC_UART0_RXD);
4.5 system_set_port_pull
/********************************************************************** @fn system_set_port_pull** @brief set pull-up of IOs which are controlled by main digital core,* only effect the pull state of IOs indicated by port parameter.* example usage:* system_set_port_pull((GPIO_PA0 | GPIO_PA1), true)** @param port - each bit represents one GPIO channel* flag - true: enable pull-up, false: disable pull-up.** @return None.*/
void system_set_port_pull(uint32_t port, uint8_t pull);
功能:设置 IO 由大数字控制时的上拉功能,可以一次设置多个IO
参数:port IO 所属的端口组pull 选择是否开启上拉
返回值:无
示例
system_set_port_pull((GPIO_PA0 | GPIO_PA1), true);
05. 低功耗模式的IO接口
以下 API 位于 driver_pmu.h 中,都是在低功耗模式下的 IO 操作。
5.1 pmu_set_pin_to_PMU
/********************************************************************** @fn pmu_set_pin_to_PMU** @brief Hand over the IO control from main digital core to PMU (always on),* this function can be used to set more than one IO belong* to the same port.* example usage: pmu_set_pin_to_PMU(GPIO_PORT_A, (1<<GPIO_BIT0)|((1<<GPIO_BIT1))** @param port - which group the io belongs to, @ref system_port_t* bits - io channel number** @return None.*/
void pmu_set_pin_to_PMU(enum system_port_t port, uint8_t bits);
功能:将某个 pin 脚配置给 pmu 控制。调用 pmu_pwm, pmu_qdec, pmu_gpio 函数前,需要首先调用该函数将对应管脚给 pmu 控制。
参数:port 选择 pin 脚对应的 port 口,一共有 4 个 port 口,PA,PB,PC,PD。参见 enum system_port_t 定义。bits 选择 pin 脚对应的 pin 号码,bit7~bit0 分别代表每个 port 口的 pin7~pin0。每个 bit 位表示该 pin 被选中。
返回值:无
示例
//Select PA0,PA1 to be controlled by PMU
pmu_set_pin_to_PMU(GPIO_PORT_A, GPIO_PA0 | GPIO_PA1);
5.2 pmu_set_pin_to_CPU
/********************************************************************** @fn pmu_set_pin_to_CPU** @brief Hand over the IO control from PMU to main digital core, this function* can be used to set more than one IO belong to the same port.* example usage: pmu_set_pin_to_CPU(GPIO_PORT_A, (1<<GPIO_BIT0)|((1<<GPIO_BIT1))** @param port - which group the io belongs to, @ref system_port_t* bits - the numbers of io** @return None.*/
void pmu_set_pin_to_CPU(enum system_port_t port, uint8_t bits);
功能:将某个 pin 脚配置给 CPU 控制。所有管脚默认是被 CPU 控制的。如果希望配置给 PMU 控制的管脚,被 CPU 的外设来控制,需要首先调用该函数将对应管脚给 CPU 控制。
参数:port 选择pin脚对应的 port 口,一共有 4 个 port 口,PA,PB,PC,PD。参见 enum system_port_t 定义。bits 选择pin脚对应的 pin 号码,bit7~bit0 分别代表每个 port 口的 pin7~pin0。每个 bit 位表示该 pin 被选中。
返回值:无
示例
//Select PA0,PA1 to be controlled by CPU
pmu_set_pin_to_CPU(GPIO_PORT_A, GPIO_PA0 | GPIO_PA1);
5.3 pmu_set_port_mux
/********************************************************************** @fn pmu_set_port_mux** @brief used to set the function of IO controlled by PMU.* example usage:* pmu_set_port_mux(GPIO_PORT_A, GPIO_BIT_0, PMU_PORT_MUX_KEYSCAN)** @param port - which group the io belongs to, @ref system_port_t* bit - the channel number, @ref system_port_bit_t* func - the function of gpio, @ref pmu_gpio_mux_t** @return None.*/
void pmu_set_port_mux(enum system_port_t port, enum system_port_bit_t bit, enum pmu_gpio_mux_t func);
功能:配置某个 pin 脚的 pmu 功能选择。pin 脚对应的 pmu 功能选择由 PMU_IO_MUX 表格决定。
参数:port 选择 pin 脚对应的 port 口,一共有 4 个 port 口,PA,PB,PC,PD。参见 enum system_port_t 定义。bit 选择 pin 脚对应的 pin 号码,参见 enum system_port_bit_t 定义func 选择 pin 脚对应的 pmu 的功能。参见 enum pmu_gpio_mux_t 定义
返回值:无
示例
// configure PB0~PB2 as PMU_PWM function
pmu_set_port_mux(GPIO_PORT_B,GPIO_BIT_0,PMU_PORT_MUX_PWM);
pmu_set_port_mux(GPIO_PORT_B,GPIO_BIT_1,PMU_PORT_MUX_PWM);
pmu_set_port_mux(GPIO_PORT_B,GPIO_BIT_2,PMU_PORT_MUX_PWM);
5.4 pmu_set_pin_dir
/********************************************************************** @fn pmu_set_pin_dir** @brief set the in-out of IOs which are controlled by PMU.* example usage:* pmu_set_pin_dir(GPIO_PORT_A, (1<<GPIO_BIT0)|((1<<GPIO_BIT1), GPIO_DIR_OUT)** @param port - which group the io belongs to, @ref system_port_t* bits - the numbers of io* dir - the direction of in-out, GPIO_DIR_OUT or GPIO_DIR_IN** @return None.*/
void pmu_set_pin_dir(enum system_port_t port, uint8_t bits, uint8_t dir);
功能:配置某个 pin 脚 pmu 控制时的输入输出选择。
参数:port 选择 pin 脚对应的 port 口,一共有 4 个 port 口,PA,PB,PC,PD。参见 enum system_port_t 定义。bits 选择 pin 脚对应的 pin 号码,bit7~bit0 分别代表每个 port 口的 pin7~pin0。每个 bit 位表示该 pin 被选中。dir 选择 pin 脚对应的输入/输出。只能填以下二值:GPIO_DIR_OUT,表示该 pin 为输出。GPIO_DIR_IN,表示该pin 为输入。
返回值:无
示例
// configure PA0~PA1 as output
pmu_set_pin_dir(GPIO_PORT_A,BIT(0)|BIT(1), GPIO_DIR_OUT);
5.5 pmu_set_pin_pull
/********************************************************************** @fn pmu_set_pin_pull** @brief set pull-up of IOs which are controlled by PMU.* example usage:* pmu_set_pin_pull(GPIO_PORT_A, (1<<GPIO_BIT0)|((1<<GPIO_BIT1), true)** @param port - which group the io belongs to, @ref system_port_t* bits - the numbers of io* flag - true: enable pull-up, false: disable pull-up.** @return None.*/
void pmu_set_pin_pull(enum system_port_t port, uint8_t bits, bool flag);
功能:配置某个 pin 脚 pmu 控制时是否内部上拉。
参数:port 选择 pin 脚对应的 port 口,一共有 4 个 port 口,PA,PB,PC,PD。参见 enum system_port_t 定义。bits 选择 pin 脚对应的 pin 号码,bit7~bit0 分别代表每个 port 口的 pin7~pin0。每个 bit 位表示该 pin 被选中。flag 选择 pin 脚是否内部上拉。True,表示该 pin 内部上拉。False,表示该 pin 没有内部上拉。
返回值:无
示例
// configure PA0~PA1 has inner pull
pmu_set_pin_pull(GPIO_PORT_A, GPIO_PA0 | GPIO_PA1, true);
5.6 pmu_port_wakeup_func_set
/********************************************************************** @fn pmu_port_wakeup_func_set** @brief indicate which ports should be checked by PMU GPIO monitor module.* once the state of corresponding GPIO changes, an PMU interrupt* will be generated.** @param gpios - 32bit value, bit num corresponding to pin num.* sample: 0x08080808 means PA3, PB3, PC3, PD3 will be* checked.** @return None.*/
void pmu_port_wakeup_func_set(uint32_t gpios);
功能:设置 PMU 中对 IO 的状态监控功能,该函数内部完成了选择 PMU 控制、IO MUX 选择、设置为输入模式。可以一次设置多个IO。当被监测的 IO 高低电平发生变化时就可产生 pmu gpio monitor 中断,如果在睡眠状态下发生变化则先产生唤醒信号,同时产生中断。
参数:gpios IO 对应的编号
返回值:无
示例
pmu_port_wakeup_func_set(GPIO_PA0|GPIO_PA1);
5.7 pmu_gpio_isr_ram
__attribute__((weak)) __attribute__((section("ram_code"))) void pmu_gpio_isr_ram(void)
功能:IO低功耗模式中断入口 pmu_gpio 中断 weak 函数。用于需要重定义来获取中断的入口
参数:无
返回值:无
示例
void pmu_gpio_isr_ram(void)
{uint32_t pmu_int_pin_setting = ool_read32(PMU_REG_PORTA_TRIG_MASK);uint32_t gpio_value = ool_read32(PMU_REG_GPIOA_V);ool_write32(PMU_REG_PORTA_LAST, gpio_value);uint32_t tmp = gpio_value & pmu_int_pin_setting;uint32_t pressed_key = tmp^pmu_int_pin_setting;co_printf("K:0x%08x\r\n", (pressed_key);
}void user_entry_after_ble_init(void)
{pmu_port_wakeup_func_set(GPIO_PD5|GPIO_PD4|GPIO_PD3);
}
06. 程序示例
程序示例
// PMU GPIO示例
void peripheral_demo(void)
{co_printf("pmu gpio demo\r\n");// pmu gpio outputpmu_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PMU_PORT_MUX_GPIO);pmu_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PMU_PORT_MUX_GPIO);pmu_set_pin_to_PMU(GPIO_PORT_D, BIT(4) | BIT(5));pmu_set_pin_dir(GPIO_PORT_D, BIT(4) | BIT(5), GPIO_DIR_OUT);// plus pull may cost more 50ma during sleep.pmu_set_pin_pull(GPIO_PORT_D, BIT(4) | BIT(5), false);pmu_set_gpio_value(GPIO_PORT_D, BIT(4) | BIT(5), 1);co_delay_100us(100000);pmu_set_gpio_value(GPIO_PORT_D, BIT(4) | BIT(5), 0);// pmu gpio inputsystem_set_port_mux(GPIO_PORT_D, GPIO_BIT_7, PORTD7_FUNC_D7);system_set_port_mux(GPIO_PORT_D, GPIO_BIT_6, PORTD6_FUNC_D6);pmu_set_pin_to_PMU(GPIO_PORT_D, BIT(6) | BIT(7));pmu_set_pin_dir(GPIO_PORT_D, BIT(6) | BIT(7), GPIO_DIR_IN);pmu_set_pin_pull(GPIO_PORT_D, BIT(6) | BIT(7), true);co_printf("PA6:%d\r\n", pmu_get_gpio_value(GPIO_PORT_D, GPIO_BIT_6));co_printf("PA7:%d\r\n", pmu_get_gpio_value(GPIO_PORT_D, GPIO_BIT_7));
}
运行结果
******Connected************Start Auto Burn******
****************************************************
******CRC Success************Burn Success******
?pmu gpio demo
PA6:1
PA7:1