在线时间4746 小时
UID3441752
注册时间2017-11-21
NXP金币82795
TA的每日心情 | 开心 2025-7-11 08:53 |
---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 39227
- 最后登录
- 2025-7-18
|
RT1064学习笔记(3)--串口例程(UART Demo)
RT1064之UART例程
Ps:本例程主要作用是,展示如何使用串口发送和接收
主板为:逐飞RT1064 + 母板
一,UART简介(基于RT1052)
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对应定义
- <font size="3" face="微软雅黑">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;
- </font>
复制代码 二,example_uart_callback(usart获取返回值函数)
1)注意uart_data,本数值为实验检测值
- <font size="3" face="微软雅黑">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; //还原缓冲区地址
- }
- </font>
复制代码 三,UART库函数介绍
1)uart_int()初始化函数
- <font size="3" face="微软雅黑">/-------------------------------------------------------------------------------------------------------------------
- // @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)
- </font>
复制代码 2) NVIC_SetPriority()中断函数
①串口中断定义
- <font size="3" face="微软雅黑"> 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 越小优先级越高
- </font>
复制代码 3)uart_rx_irq(串口接收中断)
- <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
- // @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)
- </font>
复制代码 4)配置串口接收的缓冲区及缓冲区长度
- <font size="3" face="微软雅黑">//配置串口接收的缓冲区及缓冲区长度
- example_receivexfer.dataSize = 1;
- example_receivexfer.data = &example_rx_buffer;</font>
复制代码 5)设置中断函数及其参数
uart_set_handle()
- <font size="3" face="微软雅黑">/-------------------------------------------------------------------------------------------------------------------
- // @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);
- </font>
复制代码 6)uart_putchar()串口字节输出
- <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
- // @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)
- </font>
复制代码 三、while()循环内函数
- <font size="3" face="微软雅黑"> while(1)
- {
- uart_send++;
-
- //串口字节发送
- uart_putchar(USART_8,uart_send);
- //更多功能函数 自行查阅zf_uart文件
- systick_delay_ms(100);
-
- }
- </font>
复制代码 四、主程序展示
(1)实验现象说明:将RX TX短接
//通过在线调试可以看到 uart_data数据在持续加1操作
- <font size="3" face="微软雅黑">
- #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);
- }
- }
- </font>
复制代码 五、示例展示
1)RX与DX短接时,uart_data与uart_send同时增长(调试窗口)
2)RX与DX不短接时,只有uart_send同时增长(调试窗口),说明没有收到数据
文章出处:CSDN
|
|