当前位置:   article > 正文

RT1064学习笔记(3)--串口例程(UART Demo)_rtthread bsp rt1064

rtthread bsp rt1064

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对应定义

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
二,example_uart_callback(usart获取返回值函数)

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
三,UART库函数介绍

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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 越小优先级越高
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4)配置串口接收的缓冲区及缓冲区长度

//配置串口接收的缓冲区及缓冲区长度
    example_receivexfer.dataSize = 1;
    example_receivexfer.data = &example_rx_buffer;
  • 1
  • 2
  • 3

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);
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
三、while()循环内函数
   while(1)
    {
        uart_send++;
        
        //串口字节发送
        uart_putchar(USART_8,uart_send);
        //更多功能函数 自行查阅zf_uart文件
        systick_delay_ms(100);
        
    }
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
四、主程序展示

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
五、示例展示

1)RX与DX短接时,uart_data与uart_send同时增长(调试窗口)
在这里插入图片描述
1)RX与DX不短接时,只有uart_send同时增长(调试窗口),说明没有收到数据

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/787139
推荐阅读
相关标签
  

闽ICP备14008679号