0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解ametal_uart总线控制技术的核心要点

UtFs_Zlgmcu7890 来源:互联网 作者:佚名 2017-12-19 08:03 次阅读

第五章为深入浅出AMetal,本文内容为5.8 UART 总线。

5.8 UART 总线

UART(Universal Asynchronous Receiver/Transmitter)是一种通用异步收发传输器,其使用串行的方式在双机之间进行数据交换,实现全双工通信,数据引脚仅包含用于接收数据的RXD 和用于发送数据的TXD。

>>> 5.8.1 初始化

在使用UART 接口前,必须先完成UART 的初始化,获取标准UART 实例句柄。在LPC82x 中,能够提供UART 服务的外设有USART0、USART1 和USART2。注意,USART和UART 的概念很容易混淆,USART 比UART 多了一个S——同步(Synchronous),USART支持同步和异步两种通信方式,而UART 仅支持异步通信方式。同步方式与异步方式主要的区别在于,同步方式需要使用一根时钟线进行时钟的同步。由于使用较多的是异步通信方式,因此AMetal 仅仅提供了异步通信方式的通用接口,即LPC824 的USART 外设也仅被用作UART。为了方便用户使用,AMetal 提供了与外设对应的实例初始化函数,详见表5.23。

表5.23 UART 实例初始化函数(am_lpc82x_inst_init.h)

这些函数的返回值均为am_uart_handle_t 类型的UART 实例句柄,该句柄将作为UART通用接口中handle 参数的实参。类型am_uart_handle_t(am_uart.h)定义如下:

由于函数返回的UART 实例句柄仅作为参数传递给UART 通用接口,因此不需要对该句柄作其它任何操作。若函数返回的实例句柄的值为NULL,则表明初始化失败,不能使用该实例句柄。如果使用串口0,则调用串口0 实例初始化函数,即可获取对应的实例句柄:

>>> 5.8.2 接口函数

AMetal 提供了5 个与UART 相关的标准接口函数(am_uart.h),详见表5.24。

表5.24 UART 标准接口函数

1. UART 控制

实现UART 的常见的控制,比如,波特率、数据位数和奇偶校验等。其函数原型为:

常见命令与对应的p_arg 参数,UART 硬件参数与UART 模式分别详见表5.25、表5.26和表5.27。

表5.25 UART 常用控制命令

表5.26 UART 硬件参数

表5.27 UART 模式

为了便于传递不同类型的值,通常将p_arg 设置为void *类型。比如,在设置波特率时,其类型为uint32_t;而在获取波特率时,其类型为 uint32_t *。如果返回AM_OK,说明本次控制命令执行成功;如果返回-AM_EINVAL,说明因参数无效导致控制命令执行失败。比如,设置UART 为查询模式,波特率为115200,8 位数据位,无校验,1 位停止位,使用范例详见程序清单5.101。

程序清单5.101 am_uart_ioctl()范例程序

由于对应控制命令的参数均为uint32_t 类型,而函数形参为void *,因此需要使用强制类型转换将uint32_t 强制转换为 void *。

2. UART 发送(查询模式)

如果以查询的方式发送UART 数据,则该函数会等待发送结束后返回。其函数原型为:

在使用该函数前,应确保UART 工作在查询模式,其返回值为成功发送数据的个数。比如,发送一个字符串"Hello World! ",详见程序清单5.102。

程序清单5.102 am_uart_poll_send()范例程序

3. UART 接收(查询模式)

如果以查询的方式接收UART 数据,则该函数会等到指定个数的数据接收完成后返回。其函数原型为:

在使用该函数前,应确保UART 工作在查询模式,其返回值为成功接收数据的个数。比如,从串口0 接收10 个数据,详见程序清单5.103。

程序清单5.103 am_uart_poll_receive()范例程序

4. 设置回调函数(中断模式)

由于在查询模式下收发数据会阻塞程序,因此最好的方式是使用中断模式发送数据。当中断事件发生时,通过回调函数与应用程序交互。其函数原型为:

其中,callback_type 表示本次设置的类型,即设置发送回调函数还是接收回调函数,详见表5.28。

表5.28 callback_type 的含义(am_uart.h)

以获取一个待发送的字符为例,pfn_callback 参数的类型为am_uart_txchar_get_t:

当可以发送一个字符时,UART 驱动将自动调用设置的该类型回调函数,p_arg 为用户自定义的参数(即为设置该类型回调函数时指定的p_arg),p_char 指针用于获取一个待发送的字符,详见程序清单5.104。

程序清单5.104 设置“获取发送数据的回调函数”范例程序

以提交一个已经接收到的字符为例,pfn_callback 参数的类型为am_uart_rxchar_put_t:

当接收一个字符时,UART 驱动将自动调用设置的该类型函数,p_arg 为用户自定义的参数(即为设置该类型回调函数时指定的p_arg),ch 为接收的字符数据,详见程序清单5.105。

程序清单5.105 设置“提交已接收数据回调函数”范例程序

5. 启动发送(中断模式)

如果UART 使用中断模式发送数据,当UART 发送器为空时,就会调用设置的“获取发送数据的回调函数”以获取发送数据。其函数原型为:

使用中断模式收发数据的范例程序详见程序清单5.106。

程序清单5.106 中断模式范例程序

该程序的功能是将每次收到的10 个数据原封不动地发送出去,am_main()函数中的主循环可以不参与任何处理,即可实现串口数据的收发。

>>> 5.8.3 带缓冲区的UART 接口

由于查询模式会阻塞整个应用,因此在实际应用中几乎都使用中断模式。在中断模式下,UART 每收到一个数据都会调用回调函数。如果将数据的处理放在回调函数中,很有可能因当前数据的处理还未结束而丢失下一个数据。基于此,AMetal 提供了带缓冲区的UART 接收函数,其实现是在UART 中断接收与应用程序之间,增加一个接收缓冲区。当串口收到数据时,将数据存放在缓冲区中,应用程序直接访问缓冲区即可。

对于UART 发送,虽然不存在丢失数据的问题,但为了便于开发应用程序,避免在UART中断模式下的回调函数接口中一次发送单个数据,同样提供了带缓冲区的UART 发送函数。当应用程序发送数据时,将发送数据存放在发送缓冲区中,串口在发送空闲时提取发送缓冲区中的数据进行发送。基于此,AMetal 提供了一组带缓冲区的UART 通用接口,详见表5.29。如无特殊需求,均建议使用带缓冲区的UART 通用接口。

表5.29 带缓冲区的UART 通用接口函数(am_uart_rngbuf.h)

1. 初始化

指定关联的串口外设(相应串口的实例句柄handle),以及用于发送和接收的数据缓冲区,初始化一个带缓冲区的串口实例,其函数原型为:

其中, p_dev 为指向am_uart_rngbuf_dev_t 类型的带缓冲区的串口实例指针,在使用时,只需要定义一个am_uart_rngbuf_dev_t 类型(am_uart_rngbuf.h)的实例即可:

其中,g_uart0_rngbuf_dev 为用户自定义的实例,其地址作为p_dev 的实参传递。handle为 UART 实例句柄,用于指定该带缓冲区的串口实际关联的串口。p_rxbuf 和rxbuf_size 用于指定接收缓冲区及其大小,p_txbuf 和txbuf_size 用于指定发送缓冲区及其大小。

函数的返回值为带缓冲区串口的实例句柄,可用作其它通用接口函数中handle 参数的实参。其类型am_uart_rngbuf_handle_t(am_uart_rngbuf.h)定义如下:

如果返回值为NULL,表明初始化失败,初始化函数使用范例详见程序清单5.107。

程序清单5.107 am_uart_rngbuf_init()范例程序

虽然程序将缓冲区的大小设置为128,但实际上缓冲区的大小应根据实际情况确定。若接收数据的缓冲区过小,则可能在接收缓冲区满后又接收新的数据发生溢出而丢失数据。若发送缓冲区过小,则在发送数据时很可能因为发送缓冲区已满需要等待,直至发送缓冲区有空闲空间而造成等待过程。

2. 发送数据

发送数据就是将数据存放到am_uart_rngbuf_init()指定的发送缓冲区中,串口可以进行数据发送时(发送空闲),从发送缓冲区中提取需要发送的数据进行发送。其函数原型为:

该函数将数据成功存放到发送缓冲区后返回,返回值为成功写入的数据个数。比如,发送一个字符串“Hello World!“,详见程序清单5.108。

程序清单5.108 am_uart_rngbuf_send()范例程序

注意,当该函数返回时,数据仅仅只是存放到了发送缓冲区中,并不代表已经成功地将数据发送出去了。

3. 接收数据

接收数据就是从am_uart_rngbuf_init()指定的接收缓冲区中提取接收到的数据,其函数原型为:

该函数返回值为成功读取数据的个数,使用范例详见程序清单5.109。

程序清单5.109 am_uart_rngbuf_receive()范例程序

4. 控制函数

与UART 控制函数类似,用于完成一些基本的控制操作。其函数原型为:

“控制命令”和“对应命令的参数”,与UART 控制函数am_uart_ioctl()的含义类似。带缓冲区的UART 可以看作是在UART 基础上的一个扩展,因此绝大部分UART 控制函数的命令均可直接使用。之所以不支持“模式设置”命令,是因为带缓冲区的UART 在初始化后始终工作在中断模式,不能修改为查询模式。除支持串口控制函数的绝大部分命令外,还新定义了一些扩展命令,详见表5.30。

表5.30 带缓冲区的UART 扩展控制命令

前5 条命令都是用于操作缓冲区的一些命令,“获取可读数据的个数”命令用于获取接收缓冲区中已经接收的数据个数,“获取已经写入数据的个数”命令可以获取当前已经写入发送缓冲区中的数据个数。当不再需要发送或接收缓冲区的数据时,即可直接使用“清空缓冲区”命令将对应的缓冲区直接清空,其相应的范例程序详见程序清单5.110。

程序清单5.110 am_uart_rngbuf_ioctl()范例程序

“设置读超时时间”命令用于设置读超时时间,该时间在am_uart_rngbuf_receive()接收数据时起作用。在接收数据时会指定接收数据的个数,在接收数据过程中,可能由于接收缓冲区中无数据可读而进入等待状态。在默认情况下,如果没有设置读超时时间,则会一直等到数据接收完成(接收到指定的数据个数)才会返回。当设置了超时时间后,假设设置超时时间为50ms,则在等待过程中超过50ms 都没有接收到任何新数据时,函数同样会返回,其返回值为实际接收到的数据个数,其相应的范例详见程序清单5.111。

程序清单5.111 设置超时时间范例程序

注意,超时时间并不是每次接收数据前都需要设置,往往只需要设置一次。如果需要修改超时时间,可以使用该函数重新设置一个超时时间。特别地,若希望接收数据不足时立即返回,则可以设置超时时间为AM_NO_WAIT(am_common.h),若需要恢复为一直等待到数据接收完成才返回,则可以设置超时时间为AM_WAIT_FOREVER(am_common.h)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ametal
    +关注

    关注

    2

    文章

    24

    浏览量

    11392

原文标题:周立功:深入浅出AMetal—— UART 总线

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    汽车模块化是整车系统下的域控分化核心

    业界看到,Bosch在推荐整个域控制器的分布实施,这也是全球汽车跨国OEM整车开发和投放的战略变化,本文主要想聊一聊整车战略下的域控分化,首先从域控制器分布实施的核心要点——汽车模块化说起。##本文
    发表于 04-15 16:22 1.2w次阅读
    汽车模块化是整车系统下的域控分化<b class='flag-5'>核心</b>

    面向ametal框架与接口的编程ametal uart总线

    《面向AMetal框架与接口的编程(上)》一书对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。
    的头像 发表于 11-06 06:55 6299次阅读
    面向<b class='flag-5'>ametal</b>框架与接口的编程<b class='flag-5'>ametal</b> <b class='flag-5'>uart</b><b class='flag-5'>总线</b>

    一文读懂ametal_hc595接口的学习要点

    《面向AMetal框架与接口的编程(上)》一书对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。
    的头像 发表于 11-28 07:27 3824次阅读
    一文读懂<b class='flag-5'>ametal</b>_hc595接口的学习<b class='flag-5'>要点</b>

    看完这篇文章终于学懂了ametal_spi和iic总线知识

    《面向AMetal框架与接口的编程(上)》一书对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。
    的头像 发表于 12-05 07:53 8322次阅读
    看完这篇文章终于学懂了<b class='flag-5'>ametal</b>_spi和iic<b class='flag-5'>总线</b>知识

    详解ametal_键盘扫描接口和pwm接口技术

    第五章为深入浅出AMetal,本文内容为5.3 键盘扫描接口和5.4 PWM 接口。
    的头像 发表于 12-07 08:16 7245次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>ametal</b>_键盘扫描接口和pwm接口<b class='flag-5'>技术</b>

    Android系统原理与开发要点详解_培训课件

    Android系统原理与开发要点详解_培训课件
    发表于 08-20 13:01

    灵动微电子MM32 MCU正式入驻AMetal平台

    的本土通用MCU公司,可以为客户提供从优异芯片产品到核心算法、从完备参考设计方案到整机开发的全方位支持,真正为中国电子信息产业提供底层技术驱动和支持。立功科技与灵动微电子强强联合,开启MM32 MCU
    发表于 01-16 11:38

    嵌入式系统的三个基本的核心要

    硬件平台、相关支撑硬件、嵌入式操作系统、支撑软件以及应用软件组成。其中,“嵌入性”、“专用性”与“计算机系统”是嵌入式系统的三个基本的核心要素,具体来讲:嵌入性:指计算机计算机嵌入到对象系统中,且满足对象系统的环境要求,如物理环境(小型)、电气/气氛环境(可靠)、成本(价廉)等要求。专用性:...
    发表于 11-08 07:20

    嵌入式系统的三个基本的核心要

    的灵活性,主要由嵌入式硬件平台 、 相关支撑硬件 、 嵌入式操作系统 、 支撑软件以及应用软件组成。其中, “ 嵌入性 ”、“ 专用性 ” 与 “ 计算机系统 ” 是嵌入式系统的三个基本的核心要素,具体来讲:嵌入性:指计算机计算机嵌入到对象系统中,且满足对象系统的环境要求,如物理环境(小型) 、 电气 /
    发表于 12-22 07:52

    uCOS_ARM移植要点详解

    uCOS_ARM移植要点详解
    发表于 10-31 11:25 11次下载
    uCOS_ARM移植<b class='flag-5'>要点</b><b class='flag-5'>详解</b>

    SPI总线技术要点汇总

    前面总结了UART/I2C的技术要点,SPI相对I2C而言,比较简单。本文来总结一下SPI总线个人认为比较重要的一些技术
    的头像 发表于 10-09 11:45 3920次阅读

    万变不离其宗之SPI总线要点总结

    前面总结了UART/I2C的技术要点,SPI相对I2C而言,比较简单。本文来总结一下SPI总线个人认为比较重要的一些技术
    发表于 01-26 17:47 1次下载
    万变不离其宗之SPI<b class='flag-5'>总线</b><b class='flag-5'>要点</b>总结

    AMetal代码仓库使用说明

    本文档简述了 AMetal 代码仓库的使用、 TortoiseGit 的使用以及版本控制等。AMetal 是芯片级的裸机软件包,定义了跨平台的通用接口(使得基于 AMetal 的应用程
    发表于 10-12 16:06 1次下载

    ChatGPT的核心要点

    ,但由于其出色的解释性和计算性能开始广泛地使用在AI各个领域,成为最近几年最流行的AI算法模型,无论是这篇论文还是transformer模型,都是当今AI科技发展的一个缩影。以此为前提,本文分析了这篇论文的核心要点和主要创新初衷。
    发表于 02-21 09:33 849次阅读
    ChatGPT的<b class='flag-5'>核心要点</b>

    新一代MES十大核心要

    电子发烧友网站提供《新一代MES十大核心要素.docx》资料免费下载
    发表于 12-29 11:14 0次下载