【FR801xH】富芮坤FR801xH之PMU GPIO

00. 目录

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 output
    pmu_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 input
    system_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

07. 附录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧海一笑-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值