分享

UART模块详解与使用示例

 西北望msm66g9f 2020-03-19
为方便参加恩智浦大学生智能车设计竞赛的同学们,成都逐飞科技设计制作了i.MX RT1064核心板,并配套开发了相应的函数库。
本文为逐飞科技来稿,在此分享给大家,对不参加智能车竞赛的朋友也有很大的帮助作用。
点此回顾往期内容:


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

UART模块

1. UART功能

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

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

2. UART库函数

以下函数均位于zf_uart.c和zf_uart.h:
函数名称
函数功能
uart_init
uart初始化
uart_putchar
uart发送一个字节
uart_putbuff
uart发送一个数组
uart_putstr
uart发送一个字符串
uart_getchar
uart等待获取一个字节
uart_queryuart查询获取一个字节
uart_tx_irquart发送中断设置
uart_rx_irquart接收中断设置
uart_set_handle

uart中断回调函数设置

  • uart_init函数参数

参数名称
参数说明
uartn

设置uart模块编号

baud

设置uart波特率

tx_pin

设置uart发送引脚

rx_pin

设置uart接收引脚

  • uart_putchar函数参数

参数名称
参数说明
uartn

设置uart模块编号

dat

需要发送的数据

  • uart_putbuff函数参数

参数名称
参数说明
uartn

设置设置uart模块编号

buff

需要发送的数组地址

len

需要发送的长度

  • uart_putstr函数参数

参数名称
参数说明
uartn

设置设置uart模块编号

str

需要发送的字符串地址

  • uart_getchar函数参数

参数名称
参数说明
uartn

设置设置uart模块编号

dat

保存数据的地址

  • uart_query函数参数

参数名称
参数说明
uartn

设置设置uart模块编号

dat

保存数据的地址

return:

返回1读取成功,返回0未读取到数据

  • uart_tx_irq函数参数

参数名称
参数说明
uartn

设置设置uart模块编号

status

设置1开启发送完成中断,设置0关闭发送完成中断

  • uart_rx_irq函数参数

参数名称
参数说明
uartn

设置设置uart模块编号

status

设置1开启接收完成中断,设置0关闭接收完成中断

  • uart_set_handle函数参数

参数名称
参数说明
uartn

设置设置uart模块编号

handle

uart中断句柄结构体

callback

回调函数地址(直接填写函数名称即可)

tx_buff

发送缓冲区地址

tx_count

设置发送n个字节后触发中断

rx_buff

接收缓冲区地址

rx_count

设置接收n个字节后触发中断

UART使用示例

1. UART发送与接收(非中断方式)

#include 'headfile.h' //包含头文件


uint8 uart_receive;
uint8 uart_send[10];
int main(void)
{
DisableGlobalIRQ();
board_init();
//务必保留,本函数用于初始化MPU 时钟 调试串口

    //初始化串口 波特率为115200 TX为D16 RX为D17
uart_init (USART_8, 115200,UART8_TX_D16,UART8_RX_D17);

//总中断最后开启
EnableGlobalIRQ(0);
uart_send[0] = 'S';
uart_send[1] = 'E';
uart_send[2] = 'E';
uart_send[3] = 'K';
uart_send[4] = 'F';
uart_send[5] = 'R';
uart_send[6] = 'E';
uart_send[7] = 'E';
uart_send[8] = '\n';
uart_send[9] = '\r';
while(1)
{
//串口字节发送
uart_putchar(USART_8,'S');
//发送0xA5
uart_putbuff(USART_8,uart_send,10);
//发送uart_send
uart_putstr(USART_8,'输入任意字符程序继续运行\n\r');
//发送字符串
uart_getchar(USART_8,&uart_receive);
//等待接收到一个字节后程序继续运行
uart_putchar(USART_8,uart_receive);
//发送收到的字符
uart_putstr(USART_8,'\n\r');
//发送换行

systick_delay_ms(100);
//延时100毫秒
}
}
编程要点1:在使用uart_getchar函数获取串口数据时需要注意,此函数需要等到收到数据后才会继续往后运行。

2. UART接收(中断方式)

#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:在使用串口接收中断时需要注意,串口中断并不是一个固定的名称了,而是使用一个函数去设置当中断后我们想要执行的函数。这是因为在SDK的底层已经定义了串口中断,并且在串口中断里面做了一些处理,内部的程序会根据我们在初始化串口中断函数时设置的参数,在合适的时候调用我们用户自己设置的中断回调函数。
编程要点2:在使用串口接收中断后,我们想要接收到一个字节就进入中断,但是又想要接收数组或者字符串应该怎么办呢?完成这个功能并不难,我们只需要定义一个数组,将每次收到的字节依次存放在数组里面就可以实现。
本期逐飞科技“UART模块详解与使用示例”专题分享就到这里,大家在使用库的过程中如果遇到什么问题、或发现不足、或对库有什么建议请及时联系“逐飞科技”,我们将尽快完善。
PS:通过QQ群(逐飞科技__智能车③部:824575535)可以联系到我们,群里也方便大家讨论交流,也可与管理员私信,保障该开源库有问题时可以及时得到解决。然后再分享给各位使用,形成良性循环。接下来我们将会分章节详细介绍多个模块的使用。感谢关注“逐飞科技”,下期再见!
最后,希望中国早日战胜新冠疫情,希望所有人听从指挥,不聚集,不放松警惕,科学防护,希望被感染人群早日康复,希望未感染人群都远离病毒,感谢所有医务工作者,你们是明天的希望,武汉加油!湖北加油!中国加油!

恩智浦MCU加油站


这是由恩智浦官方运营的公众号,着重为您推荐恩智浦MCU的产品信息、开发技巧、教程文档、培训课程等内容。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约