当前位置: 首页 > 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.lryc.cn/news/577234.html

相关文章:

  • Stable Diffusion 项目实战落地:从0到1 掌握ControlNet 第三篇: 打造光影字形的创意秘技-文字与自然共舞
  • [面试] js手写题-树转数组
  • 文心大模型 4.5 系列开源首发:技术深度解析与应用指南
  • uni-app使用uview2自定义tabber
  • PHP 全面解析:从入门到实践的服务器端脚本语言
  • 计算机网络中那些常见的路径搜索算法(一)——DFS、BFS、Dijkstra
  • Qt Quick 与 QML(四)qml中的Delegate系列委托组件
  • Python I/O 库 包 iopath
  • ExGeo代码理解(七)main.py(运行模型进行训练和测试)
  • 生成式人工智能实战 | 变分自编码器(Variational Auto-Encoder, VAE)
  • 如何让Excel自动帮我们算加减乘除?
  • PHP语法基础篇(七):函数
  • 电脑开机加速工具,优化启动项管理
  • 深入比较 Gin 与 Beego:Go Web 框架的两大选择
  • 深度学习04 卷积神经网络CNN
  • 国科大深度学习作业2-基于 ViT 的 CIFAR10 图像分类
  • 工业级PHP任务管理系统开发:模块化设计与性能调优实践
  • DBeaver 设置阿里云中央仓库地址的操作步骤
  • 提示技术系列——链式提示
  • 数据结构入门-图的基本概念与存储结构
  • 【软考高项论文】论信息系统项目的干系人管理
  • 利用不坑盒子的Copilot,快速排值班表
  • upload-labs靶场通关详解:第15-16关
  • docker-compose部署Nacos、Seata、MySQL
  • 《Effective Python》第十一章 性能——使用 timeit 微基准测试优化性能关键代码
  • 初始CNN(卷积神经网络)
  • C++ cstring 库解析:C 风格字符串函数
  • 深入理解Webpack的灵魂:Tapable插件架构解析
  • 人工智能和云计算对金融未来的影响
  • 大模型在急性左心衰竭预测与临床方案制定中的应用研究