当前位置: 首页 > news >正文

【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

07. 附录

http://www.dtcms.com/a/263273.html

相关文章:

  • OpenCV CUDA模块设备层----- 正切(tangent)运算函数tan()
  • Python 数据分析与机器学习入门 (五):Matplotlib 数据可视化基础
  • R1-Searcher使用强化学习增强语言模型解决问题的搜索能力
  • WebSocket 的核心原理和工作流程
  • 前端Vue面试八股常考题(一)
  • 企业流程知识:《超越再造:以流程为中心的组织如何改变我们的工作和生活》读书笔记
  • 力扣面试150(7/150)
  • 【c/c++2】多线程,动静态库,信号,socket
  • 如何让宿主机完全看不到Wi-Fi?虚拟机独立联网隐匿上网实战!
  • 【知识图谱构建系列7】:结果评价(1)
  • 可编辑39页PPT | 数字化工厂蓝图整体框架建设举措建设路径实施路线规划建设方案
  • 从入门到精通:npm、npx、nvm 包管理工具详解及常用命令
  • Microsoft Edge 打开无反应、打开后显示兼容性问题、卸载重装 解决方案。一键卸载Microsoft Edge 。
  • 卫朋:华为流程体系拆解系列——IPD流程L1-L6分级导入实战演练
  • android BottomSheet及AlertDialog的几种material3 常见ui的用法
  • vue上传各种文件,并预览组件,(预览,下载),下载resources目录下文件
  • vmware 17 安装win11 24h2
  • 【解析】 微服务测试工具Parasoft SOAtest如何为响应式架构助力?
  • MongoDB 常见查询语法与命令详解
  • 设计模式精讲 Day 19:观察者模式(Observer Pattern)
  • 自由学习记录(64)
  • 傅里叶变换理解
  • Instruct-GPT奖励模型的损失函数与反向传播机制解析
  • opencv入门(1)环境变量配置
  • FOC中V/F启动和I/F启动的区别
  • 零成本接入+企业级部署:2025年AI大模型实战指南
  • 企业自建云概念解读|私有云、专有云、混合云、分布式云、企业云
  • 【零基础学AI】第14讲:支持向量机实战 - 文本分类系统
  • 华为云 Flexus+DeepSeek 征文|基于 Dify 平台开发智能客服 AI Agent 的完整实战指南
  • python+uniapp基于微信小程序蜀味道江湖餐饮管理系统nodejs+java