查看: 8246|回复: 0

[分享] RT1064学习笔记(3)--串口例程(UART Demo)

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3868

    主题

    7472

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39227
    最后登录
    2025-7-18
    发表于 2020-5-14 09:27:37 | 显示全部楼层 |阅读模式
    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对应定义
    1. <font size="3" face="微软雅黑">typedef enum //枚举串口引脚
    2. {
    3.     UART1_TX_B12,
    4.     UART1_RX_B13,
    5.    
    6.     UART2_TX_B18,   UART2_TX_D11,   
    7.     UART2_RX_B19,   UART2_RX_D10,   
    8.    
    9.     UART3_TX_B22,   UART3_TX_C8,    UART3_TX_E13,
    10.     UART3_RX_B23,   UART3_RX_C9,    UART3_RX_E14,
    11.         
    12.     UART4_TX_C16,   UART4_TX_D0 ,   UART4_TX_E19,
    13.     UART4_RX_C17,   UART4_RX_D1 ,   UART4_RX_E20,
    14.         
    15.     UART5_TX_C28,   UART5_TX_E23,
    16.     UART5_RX_C29,   UART5_RX_E24,
    17.         
    18.     UART6_TX_B2 ,   UART6_TX_E25,
    19.     UART6_RX_B3 ,   UART6_RX_E26,
    20.    
    21.     UART7_TX_D8 ,   UART7_TX_E31,
    22.     UART7_RX_D9 ,   UART7_RX_D18,
    23.                   
    24.     UART8_TX_B26,   UART8_TX_D16,   UART8_TX_D24,
    25.     UART8_RX_B27,   UART8_RX_D17,   UART8_RX_D25,
    26.    
    27. }UARTPIN_enum;


    28. /此枚举定义不允许用户修改
    29. typedef enum //枚举串口号
    30. {
    31.     USART_0,//RT1064没有串口0 这里仅用于占位
    32.     USART_1,
    33.     USART_2,
    34.     USART_3,
    35.     USART_4,
    36.     USART_5,
    37.     USART_6,
    38.     USART_7,
    39.     USART_8,
    40. }UARTN_enum;

    41. </font>
    复制代码
    二,example_uart_callback(usart获取返回值函数)
    1)注意uart_data,本数值为实验检测值
    1. <font size="3" face="微软雅黑">uint8 example_rx_buffer;
    2. lpuart_transfer_t   example_receivexfer;
    3. lpuart_handle_t     example_g_lpuartHandle;

    4. uint8 uart_data;

    5. void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
    6. {
    7.     if(kStatus_LPUART_RxIdle == status)
    8.     {
    9.         //数据已经被写入到了 之前设置的BUFF中
    10.         //本例程使用的BUFF为 example_rx_buffer
    11.         uart_data = example_rx_buffer;//将数据取出
    12.     }
    13.    
    14.     handle->rxDataSize = example_receivexfer.dataSize;  //还原缓冲区长度
    15.     handle->rxData = example_receivexfer.data;          //还原缓冲区地址
    16. }

    17. </font>
    复制代码
    三,UART库函数介绍
    1)uart_int()初始化函数
    1. <font size="3" face="微软雅黑">/-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      串口初始化
    3. //  @param      uartn           串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
    4. //  @param      baud            串口波特率
    5. //  @param      tx_pin          串口发送引脚
    6. //  @param      rx_pin          串口接收引脚
    7. //  @return     uint32          实际波特率
    8. //  Sample usage:               uart_init(USART_1,115200,UART1_TX_B12,UART1_RX_B13);       // 初始化串口1 波特率115200 发送引脚使用B12 接收引脚使用B13
    9. //-------------------------------------------------------------------------------------------------------------------
    10. void uart_init(UARTN_enum uartn, uint32 baud, UARTPIN_enum tx_pin, UARTPIN_enum rx_pin)

    11. </font>
    复制代码
    2) NVIC_SetPriority()中断函数
    ①串口中断定义
    1. <font size="3" face="微软雅黑"> LPUART1_IRQn                 = 20,               /**< LPUART1 TX interrupt and RX interrupt */
    2.   LPUART2_IRQn                 = 21,               /**< LPUART2 TX interrupt and RX interrupt */
    3.   LPUART3_IRQn                 = 22,               /**< LPUART3 TX interrupt and RX interrupt */
    4.   LPUART4_IRQn                 = 23,               /**< LPUART4 TX interrupt and RX interrupt */
    5.   LPUART5_IRQn                 = 24,               /**< LPUART5 TX interrupt and RX interrupt */
    6.   LPUART6_IRQn                 = 25,               /**< LPUART6 TX interrupt and RX interrupt */
    7.   LPUART7_IRQn                 = 26,               /**< LPUART7 TX interrupt and RX interrupt */
    8.   LPUART8_IRQn                 = 27,               /**< LPUART8 TX interrupt and RX interrupt */


    9. NVIC_SetPriority(LPUART8_IRQn,15);//设置串口中断优先级 范围0-15 越小优先级越高
    10. </font>
    复制代码
    3)uart_rx_irq(串口接收中断)
    1. <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      串口接收中断设置
    3. //  @param      uartn           串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
    4. //  @param      status          1:打开中断   0:关闭中断
    5. //  @return     void        
    6. //  Sample usage:               uart_rx_irq(USART_1,1);       // 打开串口1接收中断
    7. //-------------------------------------------------------------------------------------------------------------------
    8. void uart_rx_irq(UARTN_enum uartn,uint8 status)
    9. </font>
    复制代码
    4)配置串口接收的缓冲区及缓冲区长度
    1. <font size="3" face="微软雅黑">//配置串口接收的缓冲区及缓冲区长度
    2.     example_receivexfer.dataSize = 1;
    3.     example_receivexfer.data = &example_rx_buffer;</font>
    复制代码
    5)设置中断函数及其参数
    uart_set_handle()

    1. <font size="3" face="微软雅黑">/-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      串口接收中断设置
    3. //  @param      uartn           串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
    4. //  @param      *handle                        串口中断结构体变量       
    5. //  @param      *callback                中断后需要执行的函数
    6. //  @param      *tx_buff                需要发送数据的地址
    7. //  @param      *tx_count            需要发送的字节数
    8. //  @param      *rx_buff                需要接收数据的地址
    9. //  @param      *rx_count                需要接收的字节数       
    10. //  @return     void        
    11. //  Sample usage:               uart_set_handle(USART_1, &csi_g_lpuartHandle, uart1_call_back, NULL, 0, buff, 1);//串口1 的中断回调函数设置为uart1_call_back 不需要发送中断 接收缓存为buff 接收到1个字节就中断
    12. //-------------------------------------------------------------------------------------------------------------------
    13. 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)


    14.   //设置中断函数及其参数
    15.     uart_set_handle(USART_8, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);
    16. </font>
    复制代码
    6)uart_putchar()串口字节输出
    1. <font size="3" face="微软雅黑">//-------------------------------------------------------------------------------------------------------------------
    2. //  @brief      串口字节输出
    3. //  @param      uartn           串口模块号(USART_1,USART_2,USART_3,USART_4,USART_5,USART_6,USART_7,USART_8)
    4. //  @param      dat             需要发送的字节
    5. //  @return     void        
    6. //  Sample usage:               uart_putchar(USART_1,0xA5);       // 串口1发送0xA5
    7. //-------------------------------------------------------------------------------------------------------------------
    8. void uart_putchar(UARTN_enum uartn, uint8 dat)
    9. </font>
    复制代码
    三、while()循环内函数
    1. <font size="3" face="微软雅黑"> while(1)
    2.     {
    3.         uart_send++;
    4.         
    5.         //串口字节发送
    6.         uart_putchar(USART_8,uart_send);
    7.         //更多功能函数 自行查阅zf_uart文件
    8.         systick_delay_ms(100);
    9.         
    10.     }
    11. </font>
    复制代码
    四、主程序展示
    (1)实验现象说明:将RX TX短接
    //通过在线调试可以看到 uart_data数据在持续加1操作
    1. <font size="3" face="微软雅黑">
    2. #include "headfile.h"



    3. uint8 example_rx_buffer;
    4. lpuart_transfer_t   example_receivexfer;
    5. lpuart_handle_t     example_g_lpuartHandle;


    6. uint8 uart_data;

    7. void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
    8. {
    9.     if(kStatus_LPUART_RxIdle == status)
    10.     {
    11.         //数据已经被写入到了 之前设置的BUFF中
    12.         //本例程使用的BUFF为 example_rx_buffer
    13.         uart_data = example_rx_buffer;//将数据取出
    14.     }
    15.    
    16.     handle->rxDataSize = example_receivexfer.dataSize;  //还原缓冲区长度
    17.     handle->rxData = example_receivexfer.data;          //还原缓冲区地址
    18. }


    19. //实验现象说明:将RX TX短接
    20. //通过在线调试可以看到 uart_data数据在持续加一操作

    21. uint8 uart_send;
    22. int main(void)
    23. {
    24.     DisableGlobalIRQ();
    25.     board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口
    26.    
    27.    
    28.     //初始换串口   波特率为115200 TX为D16 RX为D17
    29.     uart_init (USART_8, 115200,UART8_TX_D16,UART8_RX_D17);       
    30.     NVIC_SetPriority(LPUART8_IRQn,15);         //设置串口中断优先级 范围0-15 越小优先级越高
    31.     uart_rx_irq(USART_8,1);
    32.    
    33.     //配置串口接收的缓冲区及缓冲区长度
    34.     example_receivexfer.dataSize = 1;
    35.     example_receivexfer.data = &example_rx_buffer;
    36.    
    37.     //设置中断函数及其参数
    38.     uart_set_handle(USART_8, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);
    39.    
    40.     EnableGlobalIRQ(0);

    41.     while(1)
    42.     {
    43.         uart_send++;
    44.         //串口字节发送
    45.         uart_putchar(USART_8,uart_send);
    46.         //更多功能函数 自行查阅zf_uart文件
    47.         systick_delay_ms(100);
    48.     }
    49. }
    50. </font>
    复制代码
    五、示例展示
    1)RX与DX短接时,uart_data与uart_send同时增长(调试窗口)


    1.png

    2)RX与DX不短接时,只有uart_send同时增长(调试窗口),说明没有收到数据
    3.png


    文章出处:CSDN
    qiandao qiandao
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 09:05 , Processed in 0.078776 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表