查看: 5333|回复: 3

UART模块详解与使用示例

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32024
    最后登录
    2024-4-25
    发表于 2020-2-20 09:41:23 | 显示全部楼层 |阅读模式
    UART模块详解与使用示例


    为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。点此回顾往期内容:
    GPIO详解
    FAST GPIO模块详解与使用示例
    ADC模块和QTIMER模块
    PIT模块详解与使用示例


    各位朋友好,新冠肺炎疫情还未解除,目前还不能正常复工,开启在家办公模式,所以连载应该继续,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来投稿啦!
    今天分享UART模块的使用,感谢来自恩智浦的支持,感谢梁平老师帮忙检查修改文中错误,感谢关注“逐飞科技”。接下来进入我们今天分享的主题:

    UART模块

    1. UART功能

    UART(Universal Asynchronous Receiver / Transmitter)通用异步收发器,主要用于低速近距离的通信,嵌入式开发中大多数工程师,喜欢使用串口将调试信息发送至PC上的串口调试助手等软件。

    RT1064片内的UART全部都是低功耗串口(LPUART)。

    2. UART库函数

    以下函数均位于zf_uart.c和zf_uart.h:
    1.png
    uart_init函数参数
    2.png
    uart_putchar函数参数
    3.png
    uart_putbuff函数参数
    4.png
    uart_putstr函数参数
    5.png
    uart_getchar函数参数
    6.png
    uart_query函数参数
    8.png
    uart_tx_irq函数参数
    9.png
    uart_rx_irq函数参数
    10.png
    uart_set_handle函数参数
    11.png
    UART使用示例


    1. UART发送与接收(非中断方式)
    1. <font size="3" face="微软雅黑">#include "headfile.h"       //包含头文件  
    2.   
    3.   
    4. uint8 uart_receive;
    5. uint8 uart_send[10];
    6. int main(void)
    7. {
    8.     DisableGlobalIRQ();
    9.     board_init();//务必保留,本函数用于初始化MPU 时钟 调试串口

    10.     //初始化串口   波特率为115200 TX为D16 RX为D17
    11.     uart_init (USART_8, 115200,UART8_TX_D16,UART8_RX_D17);
    12.       
    13.     //总中断最后开启  
    14.     EnableGlobalIRQ(0);
    15.     uart_send[0] = 'S';
    16.     uart_send[1] = 'E';
    17.     uart_send[2] = 'E';
    18.     uart_send[3] = 'K';
    19.     uart_send[4] = 'F';
    20.     uart_send[5] = 'R';
    21.     uart_send[6] = 'E';
    22.     uart_send[7] = 'E';
    23.     uart_send[8] = '\n';
    24.     uart_send[9] = '\r';
    25.     while(1)
    26.     {
    27.         //串口字节发送  
    28.         uart_putchar(USART_8,'S');          //发送0xA5  
    29.         uart_putbuff(USART_8,uart_send,10); //发送uart_send  
    30.         uart_putstr(USART_8,"输入任意字符程序继续运行\n\r");//发送字符串  
    31.         uart_getchar(USART_8,&uart_receive);//等待接收到一个字节后程序继续运行  
    32.         uart_putchar(USART_8,uart_receive); //发送收到的字符  
    33.         uart_putstr(USART_8,"\n\r");        //发送换行  
    34.   
    35.         systick_delay_ms(100);//延时100毫秒  
    36.     }
    37. }</font>
    复制代码
    编程要点1:在使用uart_getchar函数获取串口数据时需要注意,此函数需要等到收到数据后才会继续往后运行。




    2. UART接收(中断方式)
    1. <font size="3" face="微软雅黑">#include "headfile.h"
    2.   
    3.   
    4. uint8 example_rx_buffer;
    5. lpuart_transfer_t   example_receivexfer;
    6. lpuart_handle_t     example_g_lpuartHandle;
    7.   
    8.   
    9. uint8 uart_data;//接收到的串口数据  
    10. void example_uart_callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
    11. {
    12.     if(kStatus_LPUART_RxIdle == status)
    13.     {
    14.         //数据已经被写入到了 之前设置的BUFF中
    15.         //本例程使用的BUFF为 example_rx_buffer  
    16.         uart_data = example_rx_buffer;//将数据取出  
    17.     }
    18.       
    19.     handle->rxDataSize = example_receivexfer.dataSize;  //还原缓冲区长度  
    20.     handle->rxData = example_receivexfer.data;          //还原缓冲区地址
    21. }
    22.   
    23.   
    24. //实验现象说明:将RX TX短接
    25. //通过在线调试可以看到 uart_data数据在持续加一操作
    26. uint8 uart_send;
    27. int main(void)
    28. {
    29.     DisableGlobalIRQ();
    30.     board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口

    31.     //初始化串口   波特率为115200 TX为D16 RX为D17  
    32.     uart_init (USART_8, 115200,UART8_TX_D16,UART8_RX_D17);
    33.     NVIC_SetPriority(LPUART8_IRQn,15);  //设置串口中断优先级 范围0-15 越小优先级越高
    34.     uart_rx_irq(USART_8,1);
    35.       
    36.       
    37.     example_receivexfer.dataSize = 1;              //配置串口接收缓冲区长度
    38.     example_receivexfer.data = &example_rx_buffer; //配置串口接收的缓冲区

    39.     //设置中断函数及其参数
    40.     uart_set_handle(USART_8, &example_g_lpuartHandle, example_uart_callback, NULL, 0, example_receivexfer.data, 1);
    41.       
    42.     EnableGlobalIRQ(0);
    43.       
    44.     while(1)
    45.     {
    46.         uart_send++;
    47.          
    48.         //串口字节发送
    49.         uart_putchar(USART_8,uart_send);
    50.         //更多功能函数 自行查阅zf_uart文件
    51.         systick_delay_ms(100);
    52.     }
    53. }</font>
    复制代码
    编程要点1:在使用串口接收中断时需要注意,串口中断并不是一个固定的名称了,而是使用一个函数去设置当中断后我们想要执行的函数。这是因为在SDK的底层已经定义了串口中断,并且在串口中断里面做了一些处理,内部的程序会根据我们在初始化串口中断函数时设置的参数,在合适的时候调用我们用户自己设置的中断回调函数。
    编程要点2:在使用串口接收中断后,我们想要接收到一个字节就进入中断,但是又想要接收数组或者字符串应该怎么办呢?完成这个功能并不难,我们只需要定义一个数组,将每次收到的字节依次存放在数组里面就可以实现。

    本期逐飞科技“UART模块详解与使用示例”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足、或对库有什么建议请及时联系“逐飞科技”,我们将尽快完善。
    PS:通过QQ群(逐飞科技__智能车③部:824575535)可以联系到我们,群里也方便大家讨论交流,也可与管理员私信,保障该开源库有问题时可以及时得到解决。然后再分享给各位使用,形成良性循环。接下来我们将会分章节详细介绍多个模块的使用。感谢关注“逐飞科技”,下期再见!
    最后,希望中国早日战胜新冠疫情,希望所有人听从指挥,不聚集,不放松警惕,科学防护,希望被感染人群早日康复,希望未感染人群都远离病毒,感谢所有医务工作者,你们是明天的希望,武汉加油!湖北加油!中国加油!





    作者:范兵@逐飞科技       文章出处:恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2020-2-20 22:01:31 | 显示全部楼层
    这个教程写得还是挺有耐心的。
    是一个不错的入门中文资料
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    97

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    386
    最后登录
    2023-9-12
    发表于 2023-5-7 12:01:39 | 显示全部楼层
    你好,这些例程哪里可以下载呀 ?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    5

    主题

    11

    帖子

    0

    注册会员

    Rank: 2

    积分
    66
    最后登录
    2023-10-14
    发表于 2023-10-9 18:02:05 | 显示全部楼层
    哪里可以下载此示例,哪位大牛发一下示例
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-25 17:13 , Processed in 0.127681 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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