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

【FR801xH】富芮坤FR801xH之UART

00. 目录

文章目录

    • 00. 目录
    • 01. FR801xH概述
    • 02. FR801xH功能框图
    • 03. UART相关类型
      • 3.1 波特率
      • 3.2 串口设备
    • 04. UART相关函数
      • 4.1 uart_init
      • 4.2 uart_finish_transfers
      • 4.3 uart_read
      • 4.4 uart_write
      • 4.5 uart_putc_noint
      • 4.6 uart_putc_noint_no_wait
      • 4.7 uart_put_data_noint
      • 4.8 uart_get_data_noint
      • 4.9 uart_get_data_nodelay_noint
      • 4.10 uart0_read
      • 4.11 uart0_write
      • 4.12 uart1_read
      • 4.13 uart1_write
    • 05. 程序示例
    • 06. 附录

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. UART相关类型

位于 components\driver\include\driver_uart.h

3.1 波特率

/* BAUD_RATE configuration */
#define BAUD_RATE_921600                 11
#define BAUD_RATE_460800                 10
#define BAUD_RATE_230400                 9
#define BAUD_RATE_115200                 8
#define BAUD_RATE_57600                  7
#define BAUD_RATE_38400                  6
#define BAUD_RATE_19200                  5
#define BAUD_RATE_14400                  4
#define BAUD_RATE_9600                   3
#define BAUD_RATE_4800                   2
#define BAUD_RATE_2400                   1
#define BAUD_RATE_1200                   0

3.2 串口设备

#define UART0                            UART0_BASE
#define UART1                            UART1_BASE

04. UART相关函数

4.1 uart_init

/********************************************************************** @fn      uart_init** @brief   initialize the uart module. Before calling this function, corresponding*          IO mux should be configured correctly.** @param   uart_addr   - which uart will be initialized, UART0 or UART1.*          bandrate    - such as BAUD_RATE_115200.** @return  None.*/
void uart_init(uint32_t uart_addr, uint8_t bandrate);
功能:初始化 UART 模块,函数内会清空 fifo,使能接收非空中断
参数:uart_addr 初始化的端口,可选 UART0、UART1bandrate 配置的波特率,例如 BAUD_RATE_115200
返回值:

4.2 uart_finish_transfers

/********************************************************************** @fn      uart_finish_transfers** @brief   wait for tx fifo empty.** @param   uart_addr   - which uart will be checked, UART0 or UART1.** @return  None.*/
void uart_finish_transfers(uint32_t uart_addr);
功能:等待发送 fifo 为空
参数:uart_addr  -  等待的端口,可选 UART0、UART1
返回值:

4.3 uart_read

/********************************************************************** @fn      uart_write** @brief   get several byte from UART bus with block mode.** @param   uart_addr   - which uart will be used, UART0 or UART1.*          bufptr      - store position of data to be received*          size        - length of data to be received** @return  None.*/
void uart_read(uint32_t uart_addr, uint8_t *buf, uint32_t size);
功能:采用阻塞方式从串口接收
参数:uart_addr 等待的端口,可选 UART0、UART1buf 存放接收数据的指针size 需要接收的数据长度
返回值:

4.4 uart_write

/********************************************************************** @fn      uart_write** @brief   send several byte to UART bus with block mode.** @param   uart_addr   - which uart will be used, UART0 or UART1.*          bufptr      - store position of data to be send*          size        - length of data to be send** @return  None.*/
void uart_write(uint32_t uart_addr, const uint8_t *bufptr, uint32_t size);
功能:采用阻塞方式发送数据到串口
参数:uart_addr 等待的端口,可选 UART0、UART1buf 待发送数据的指针size 待发送的数据长度
返回值:

4.5 uart_putc_noint

/********************************************************************** @fn      uart_putc_noint** @brief   send a byte to UART bus, return until tx fifo is empty.** @param   uart_addr   - which uart will be used, UART0 or UART1.*          c           - data to be send** @return  None.*/
void uart_putc_noint(uint32_t uart_addr, uint8_t c);
功能:发送一个字符,且等待发送 fifo 为空
参数:uart_addr 使用的端口,可选 UART0、UART1c 待发送的字符
返回值:

4.6 uart_putc_noint_no_wait

/********************************************************************** @fn      uart_putc_noint** @brief   send a byte to UART bus without the byte is sent.** @param   uart_addr   - which uart will be used, UART0 or UART1.*          c           - data to be send** @return  None.*/
void uart_putc_noint_no_wait(uint32_t uart_addr, uint8_t c);
功能:将待发送的字符写入到发送 fifo
参数:uart_addr 使用的端口,可选 UART0、UART1c 待发送的字符
返回值:

4.7 uart_put_data_noint

/********************************************************************** @fn      uart_put_data_noint** @brief   send several bytes to UART bus, return until tx fifo is empty.** @param   uart_addr   - which uart will be used, UART0 or UART1.*          d           - data buffer pointer*          size        - how many bytes to be send.** @return  None.*/
void uart_put_data_noint(uint32_t uart_addr, const uint8_t *d, int size);
功能:发送特定长度的字符,且等待发送 fifo 为空
参数:uart_addr 使用的端口,可选 UART0、UART1d 待发送数据的保存地址指针size 待发送数据的长度
返回值:

4.8 uart_get_data_noint

/********************************************************************** @fn      uart_get_data_noint** @brief   get data with specified length, return until all data are acquired.** @param   uart_addr   - which uart will be used, UART0 or UART1.*          d           - data buffer pointer*          size        - how many bytes to be read.** @return  None.*/
void uart_get_data_noint(uint32_t uart_addr, uint8_t *buf, int size);
功能:获取特定长度的字符
参数:uart_addr  -  使用的端口,可选 UART0、UART1buf  -  待接收数据的保存地址指针size  -  待接收数据的长度
返回值:

4.9 uart_get_data_nodelay_noint

/********************************************************************** @fn      uart_get_data_nodelay_noint** @brief   get data with specified length, return until rx fifo is empty *          or all data are acquired.** @param   uart_addr   - which uart will be used, UART0 or UART1.*          d           - data buffer pointer*          size        - how many bytes to be read.** @return  how many bytes have been read, may be less than parameter size.*/
int uart_get_data_nodelay_noint(uint32_t uart_addr, uint8_t *buf, int size);
功能:获取特定长度的字符,当接收 fifo 为空时就会返回
参数:uart_addr  -  使用的端口,可选 UART0、UART1buf  -  待接收数据的保存地址指针size  -  待接收数据的长度
返回值:实际接收到的数据长度

4.10 uart0_read

/********************************************************************** @fn      uart0_read** @brief   get data with specified length. Interrup will be enable inside this function,*          callback will be called once all data are acquired.** @param   bufptr  - ram pointer used to store read data.*          size    - how many bytes to be read.*          callback- callback function when all data are acquired.** @return  None.*/
void uart0_read_for_hci(uint8_t *bufptr, uint32_t size, uart_int_callback callback, void *dummy);
#define uart0_read(bufptr, size, callback)      uart0_read_for_hci(bufptr, size, callback, NULL)
功能:采用中断加回调函数的方式从 UART0 中读取特定长度的数据,需配合内置的 uart0_isr 使用(也就是无需重新实现 UART0 的中断处理函数)。
参数:bufptr  -  待接收数据的保存地址指针size  -  待接收数据的长度callback  -  接收完数据的回调函数
返回值:

4.11 uart0_write

/********************************************************************** @fn      uart0_write** @brief   send data with specified length. callback will be called once all *          data are sent.** @param   bufptr  - ram pointer used to store send data.*          size    - how many bytes to be sent.*          callback- callback function when all data are sent.** @return  None.*/
void uart0_write_for_hci(uint8_t *bufptr, uint32_t size, uart_int_callback callback, void *dummy);
#define uart0_write(bufptr, size, callback)      uart0_write_for_hci(bufptr, size, callback, NULL)
功能:采用中断加回调函数的方式用 UART0 中发送特定长度的数据,需配合内置的 uart0_isr 使用(也就是无需重新实现 UART0 的中断处理函数)。
参数:bufptr  -  待发送数据的保存地址指针size  -  待发送数据的长度callback  -  发送完数据的回调函数
返回值:

4.12 uart1_read

/********************************************************************** @fn      uart1_read** @brief   get data with specified length. Interrup will be enable inside this function,*          callback will be called once all data are acquired.** @param   bufptr  - ram pointer used to store read data.*          size    - how many bytes to be read.*          callback- callback function when all data are acquired.** @return  None.*/
void uart1_read_for_hci(uint8_t *bufptr, uint32_t size, uart_int_callback callback, void *dummy);
#define uart1_read(bufptr, size, callback)      uart1_read_for_hci(bufptr, size, callback, NULL)
功能:采用中断加回调函数的方式从 UART1 中读取特定长度的数据,需配合内置的 uart1_isr 使用(也就是无需重新实现 UART1 的中断处理函数)。
参数:bufptr  -  待接收数据的保存地址指针size  -  待接收数据的长度callback  -  接收完数据的回调函数
返回值:

4.13 uart1_write

/********************************************************************** @fn      uart1_write** @brief   send data with specified length. callback will be called once all *          data are sent.** @param   bufptr  - ram pointer used to store send data.*          size    - how many bytes to be sent.*          callback- callback function when all data are sent.** @return  None.*/
void uart1_write_for_hci(uint8_t *bufptr, uint32_t size, uart_int_callback callback, void *dummy);
#define uart1_write(bufptr, size, callback)      uart1_write_for_hci(bufptr, size, callback, NULL)
功能:采用中断加回调函数的方式用 UART1 中发送特定长度的数据,需配合内置的 uart1_isr 使用(也就是无需重新实现 UART0 的
中断处理函数)。
参数:bufptr  -  待发送数据的保存地址指针size  -  待发送数据的长度callback  -  发送完数据的回调函数
返回值:

05. 程序示例

程序示例

__attribute__((section("ram_code"))) void uart0_isr_ram(void)
{uint8_t int_id;uint8_t c;volatile struct uart_reg_t *uart_reg = (volatile struct uart_reg_t *)UART0_BASE;int_id = uart_reg->u3.iir.int_id;if (int_id == 0x04 || int_id == 0x0c) /* Receiver data available or Character time-out indication */{while (uart_reg->lsr & 0x01){c = uart_reg->u1.data;uart_putc_noint_no_wait(UART0, c);}}else if (int_id == 0x06){// uart_reg->u3.iir.int_id = int_id;// uart_reg->u2.ier.erlsi = 0;volatile uint32_t line_status = uart_reg->lsr;}
}void peripheral_demo(void)
{
#if 0system_set_port_pull(GPIO_PD6, true);system_set_port_mux(GPIO_PORT_D, GPIO_BIT_6, PORTD6_FUNC_UART0_RXD);system_set_port_mux(GPIO_PORT_D, GPIO_BIT_7, PORTD7_FUNC_UART0_TXD);uart_init(UART0, BAUD_RATE_115200);co_printf("uart0 demo\r\n");
#endifsystem_set_port_pull(GPIO_PD4, true);system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_UART0_RXD);system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_UART0_TXD);// uart_init(UART1, BAUD_RATE_115200);uart_param_t param ={.baud_rate = 115200,.data_bit_num = 8,.pari = 0,.stop_bit = 1,};uart_init1(UART0, param);NVIC_EnableIRQ(UART0_IRQn);co_printf("uart0 demo\r\n");
}

运行结果

******Connected************Start Auto Burn******
****************************************************
******CRC Success************Burn Success******
?uart0 demo

串口调试助手


[11:59:33.982]发→◇aa
[11:59:34.006]收←◆aa
[11:59:38.770]发→◇bb
[11:59:38.780]收←◆bb
[11:59:50.265]发→◇cc
[11:59:50.278]收←◆cc

06. 附录

http://www.lqws.cn/news/590131.html

相关文章:

  • 【javaAI】SpringAI快速入门
  • 【C#】如果有一个数值如 168.0000100,如何去除末尾的无效零,只显示有效的小数位数,让DeepSeek给我们解答
  • 半加器和全加器
  • Disruptor架构哲学
  • 【机器学习2】正则化regularizaiton(降低模型过拟合)
  • 设备管理的11个指标、七大误区、六大特征
  • muduo
  • 数据结构——线性表的链式存储
  • QT笔记---环境和编译出现的问题
  • Golang的代码结构设计原则与实践与模式应用
  • helm安装配置jenkins
  • 百度轮岗:任命新CFO,崔珊珊退居业务二线
  • Redis-7.4.3-Windows-x64下载安装使用
  • 时空数据挖掘五大革新方向详解篇!
  • 我认知的AI宇宙系列第三期
  • 强化学习概述及学习流程
  • 3D词云图
  • 虚拟机配置过程中的知识点
  • shardingsphere5.2.1与SpringBoot3.X的版本冲突问题
  • 华为云Flexus+DeepSeek征文 | ​​华为云ModelArts Studio大模型与企业AI会议纪要场景的对接方案
  • 具身智能环境的构建和工作(具身智能入门四)
  • Oracle 进阶语法实战:从多维分析到数据清洗的深度应用​(第四课)
  • 贪心算法在C++中的应用与实践
  • Monorepo+Pnpm+Turborepo
  • 数据结构:链表
  • 认识 Spring AI
  • 华为云Flexus+DeepSeek征文|基于华为云Flexus云服务的Dify 快速构建联网搜索助手
  • Zookeeper安装使用教程
  • 产品背景知识——API、SDK、Library、Framework、Protocol
  • guava限流器RateLimiter源码详解