Ps:本例程主要作用是,展示如何使用串口发送和接收
主板为:逐飞RT1064 + 母板
1)简介:RT1052 芯片具有多达 8 个 LPUART 外设用于串口通讯,它是 Low Power Universal
Asynchronous Receiver Transmitter 的缩写,即低功耗异步收发器,它可以灵活地与外部设
备进行全双工数据交换。有别于 USART(Universal synchronous asynchronous receivertransmitter), UART 是在 USART 基础上裁剪掉了同步通信功能,只支持异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。UART 在 RT1052 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个 UART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。
2)UART 在 RT1052 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一
个 UART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的
串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。
3)UARTX_TX/RX的对应引脚与USART_X对应定义
typedef enum //枚举串口引脚
{
UART1_TX_B12,
UART1_RX_B13,
UART2_TX_B18, UART2_TX_D11,
UART2_RX_B19, UART2_RX_D10,
UART3_TX_B22, UART3_TX_C8, UART3_TX_E13,
UART3_RX_B23, UART3_RX_C9, UART3_RX_E14,
UART4_TX_C16, UART4_TX_D0 , UART4_TX_E19,
UART4_RX_C17, UART4_RX_D1 , UART4_RX_E20,
UART5_TX_C28, UART5_TX_E23,
UART5_RX_C29, UART5_RX_E24,
UART6_TX_B2 , UART6_TX_E25,
UART6_RX_B3 , UART6_RX_E26,
UART7_TX_D8 , UART7_TX_E31,
UART7_RX_D9 , UART7_RX_D18,
UART8_TX_B26, UART8_TX_D16, UART8_TX_D24,
UART8_RX_B27, UART8_RX_D17, UART8_RX_D25,
}UARTPIN_enum;
/此枚举定义不允许用户修改
typedef enum //枚举串口号
{
USART_0,//RT1064没有串口0 这里仅用于占位
USART_1,
USART_2,
USART_3,
USART_4,
USART_5,
USART_6,
USART_7,
USART_8,
}UARTN_enum;
1)注意uart_data,本数值为实验检测值
uint8 example_rx_buffer;
lpuart_transfer_t example_receivexfer;
lpuart_handle_t example_g_lpuartHandle;
uint8 uart_data;
void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
{
if(kStatus_LPUART_RxIdle == status)
{
//数据已经被写入到了 之前设置的BUFF中
//本例程使用的BUFF为 example_rx_buffer
uart_data = example_rx_buffer;//将数据取出
}
handle->rxDataSize = example_receivexfer.dataSize; //还原缓冲区长度
handle->rxData = example_receivexfer.data; //还原缓冲区地址
}
1)uart_int()初始化函数
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口初始化
// @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
// @param baud 串口波特率
// @param tx_pin 串口发送引脚
// @param rx_pin 串口接收引脚
// @return uint32 实际波特率
// Sample usage: uart_init(USART_1,115200,UART1_TX_B12,UART1_RX_B13); // 初始化串口1 波特率115200 发送引脚使用B12 接收引脚使用B13
//-------------------------------------------------------------------------------------------------------------------
void uart_init(UARTN_enum uartn, uint32 baud, UARTPIN_enum tx_pin, UARTPIN_enum rx_pin)
2) NVIC_SetPriority()中断函数
①串口中断定义
LPUART1_IRQn = 20, /**< LPUART1 TX interrupt and RX interrupt */
LPUART2_IRQn = 21, /**< LPUART2 TX interrupt and RX interrupt */
LPUART3_IRQn = 22, /**< LPUART3 TX interrupt and RX interrupt */
LPUART4_IRQn = 23, /**< LPUART4 TX interrupt and RX interrupt */
LPUART5_IRQn = 24, /**< LPUART5 TX interrupt and RX interrupt */
LPUART6_IRQn = 25, /**< LPUART6 TX interrupt and RX interrupt */
LPUART7_IRQn = 26, /**< LPUART7 TX interrupt and RX interrupt */
LPUART8_IRQn = 27, /**< LPUART8 TX interrupt and RX interrupt */
NVIC_SetPriority(LPUART8_IRQn,15);//设置串口中断优先级 范围0-15 越小优先级越高
3)uart_rx_irq(串口接收中断)
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口接收中断设置
// @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
// @param status 1:打开中断 0:关闭中断
// @return void
// Sample usage: uart_rx_irq(USART_1,1); // 打开串口1接收中断
//-------------------------------------------------------------------------------------------------------------------
void uart_rx_irq(UARTN_enum uartn,uint8 status)
4)配置串口接收的缓冲区及缓冲区长度
//配置串口接收的缓冲区及缓冲区长度
example_receivexfer.dataSize = 1;
example_receivexfer.data = &example_rx_buffer;
5)设置中断函数及其参数
uart_set_handle()
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口接收中断设置
// @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
// @param *handle 串口中断结构体变量
// @param *callback 中断后需要执行的函数
// @param *tx_buff 需要发送数据的地址
// @param *tx_count 需要发送的字节数
// @param *rx_buff 需要接收数据的地址
// @param *rx_count 需要接收的字节数
// @return void
// Sample usage: uart_set_handle(USART_1, &csi_g_lpuartHandle, uart1_call_back, NULL, 0, buff, 1);//串口1 的中断回调函数设置为uart1_call_back 不需要发送中断 接收缓存为buff 接收到1个字节就中断
//-------------------------------------------------------------------------------------------------------------------
void uart_set_handle(UARTN_enum uartn, lpuart_handle_t *handle, lpuart_transfer_callback_t callback, uint8 *tx_buff, uint32 tx_count, uint8 *rx_buff, uint32 rx_count)
//设置中断函数及其参数
uart_set_handle(USART_8, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);
6)uart_putchar()串口字节输出
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口字节输出
// @param uartn 串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
// @param dat 需要发送的字节
// @return void
// Sample usage: uart_putchar(USART_1,0xA5); // 串口1发送0xA5
//-------------------------------------------------------------------------------------------------------------------
void uart_putchar(UARTN_enum uartn, uint8 dat)
while(1)
{
uart_send++;
//串口字节发送
uart_putchar(USART_8,uart_send);
//更多功能函数 自行查阅zf_uart文件
systick_delay_ms(100);
}
(1)实验现象说明:将RX TX短接
//通过在线调试可以看到 uart_data数据在持续加1操作
#include "headfile.h"
uint8 example_rx_buffer;
lpuart_transfer_t example_receivexfer;
lpuart_handle_t example_g_lpuartHandle;
uint8 uart_data;
void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
{
if(kStatus_LPUART_RxIdle == status)
{
//数据已经被写入到了 之前设置的BUFF中
//本例程使用的BUFF为 example_rx_buffer
uart_data = example_rx_buffer;//将数据取出
}
handle->rxDataSize = example_receivexfer.dataSize; //还原缓冲区长度
handle->rxData = example_receivexfer.data; //还原缓冲区地址
}
//实验现象说明:将RX TX短接
//通过在线调试可以看到 uart_data数据在持续加一操作
uint8 uart_send;
int main(void)
{
DisableGlobalIRQ();
board_init(); //务必保留,本函数用于初始化MPU 时钟 调试串口
//初始换串口 波特率为115200 TX为D16 RX为D17
uart_init (USART_8, 115200,UART8_TX_D16,UART8_RX_D17);
NVIC_SetPriority(LPUART8_IRQn,15); //设置串口中断优先级 范围0-15 越小优先级越高
uart_rx_irq(USART_8,1);
//配置串口接收的缓冲区及缓冲区长度
example_receivexfer.dataSize = 1;
example_receivexfer.data = &example_rx_buffer;
//设置中断函数及其参数
uart_set_handle(USART_8, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);
EnableGlobalIRQ(0);
while(1)
{
uart_send++;
//串口字节发送
uart_putchar(USART_8,uart_send);
//更多功能函数 自行查阅zf_uart文件
systick_delay_ms(100);
}
}
1)RX与DX短接时,uart_data与uart_send同时增长(调试窗口)
1)RX与DX不短接时,只有uart_send同时增长(调试窗口),说明没有收到数据