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

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

3天内不再提示

UART寄存器的循环缓冲区实现以及中断驱动的UART实现和硬件设置

汽车玩家 来源: Zilog 作者: Zilog 2021-06-23 15:43 次阅读

本应用笔记介绍了用于 Z8 Encore 的中断驱动 UART!XP® 和 Z8 Encore!MC™ 微控制器。它描述了 UART 寄存器描述、循环缓冲区实现,以及中断驱动的 UART 实现和硬件设置。

Z8 Encore 中的 UART 外设概述设备

通用异步接收器/发送器 (UART) 是一种能够处理异步数据传输的全双工通信通道。UART 使用具有可选奇偶校验的单个 8 位数据模式。UART 的特性包括:

  • 8 位异步数据传输
  • 可选择的偶数或奇数奇偶校验生成和检查
  • 一或两个停止位的选项
  • 独立的发送和接收中断
  • 单独的发送和接收使能
  • 帧、奇偶校验、溢出和中断检测
  • 16 位波特率发生器 (BRG)
  • 具有三种可配置中断方案的可选多处理器(9 位)模式
  • 波特率发生器定时器模式
  • 驱动器启用外部总线收发器的输出

UART 由三个主要功能块组成:发送器、接收器和波特率发生器。UART 的发送器和接收器各自独立运行,但使用相同的波特率和数据格式。图 1 显示了 UART 架构。


图 1 Z8 Encore 示意图!XP UART 模块

循环缓冲区实现

本节介绍循环缓冲区的实现。此处介绍的例程可用于任何排队或缓冲应用程序。

缓冲区通常用作临时数据存储,通常用于流式传输数据。类似地,循环缓冲区(或环形缓冲区)是具有内存分配方案的临时数据存储,其中缓冲区可以具有固定大小,并且当索引指针返回到起始位置时可以重用每个内存位置。这种缓冲方案被广泛使用,并且有几个现有版本,每个版本都根据应用需求而变化。本节描述一个简单的缓冲机制。

为了初始化循环缓冲区,需要初始化一个内存段或任何预定义长度的数组。这是缓冲数据的存储位置。

《br》#define RBUF_IN_BUFFERSIZE (UINT8) 64)《br》UINT8 RBUF_InBuff [RBUF_IN_BUFFERSIZE];《br》

为了便于管理循环缓冲区,初始化了两个索引指针和一个数据计数器。

《br》UINT8 RBUF_InRdPtr; // Pointer to the next read location《br》UINT8 RBUF_InWrPtr; // Pointer to the next write location《br》UINT8 RBUF_InLength // Buffer length《br》

初始化时,缓冲区不包含任何内容,指针位于缓冲区的开头,如图 2 所示。


图 2 初始化缓冲区

当数据被写入缓冲区时,写指针增加,数据计数器也增加。类似地,当从缓冲区读取数据时,读取指针会递增,而数据计数器会递减。参见图 3。


图 3 缓冲区的读/写操作

当读或写指针到达缓冲区的末尾时,它会跳回到开头,造成环绕效应。因此,之前使用读取操作获取的数据将被覆盖。见图 4。


图 4 环绕

中断驱动的 UART 实现

本节介绍通过Z8 Encore 的UART 外设初始化、发送和接收数据的方法!设备。

本文档中介绍的 UART 软件实现支持基本格式,即 8 个数据位、无奇偶校验和 1 个停止位。程序等待接收一个字符串(以换行符结束),然后回显到输入字符串。

为了便于通过 UART 进行数据输入/输出,上一节中讨论的循环缓冲区用于存储数据。单独的缓冲区用于处理发送和接收数据。可以根据用户需要更改缓冲区大小 RBUF_IN_BUFFERSIZE 和 RBUF_OUT_BUFFERSIZE。

硬件设置


图 5 Z8 Encore 通过 RS-232 端口连接到 PC

图 5 显示了 Z8 Encore 的硬件设置!开发套件通过超级终端连接到 PC。超级终端设置为 8-N-1,流量控制设置为无。源代码和本文档中的默认波特率设置使用 115 kbps。用户可以根据需要更改设置。

编辑:ymf

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

    关注

    22

    文章

    1235

    浏览量

    101354
  • 波特率
    +关注

    关注

    2

    文章

    307

    浏览量

    34115
  • 中断驱动
    +关注

    关注

    0

    文章

    2

    浏览量

    1715
收藏 人收藏

    评论

    相关推荐

    基于C语言实现环形缓冲区/循环队列

    这里分享一个自己用纯C实现的环形缓冲区
    的头像 发表于 04-11 10:39 3285次阅读
    基于C语言<b class='flag-5'>实现</b>环形<b class='flag-5'>缓冲区</b>/<b class='flag-5'>循环</b>队列

    基于宏高效实现环形缓冲区教程

    来源 | 小麦大叔 循环缓冲区是嵌入式软件工程师在日常开发过程中的关键组件。 多年来,互联网上出现了许多不同的循环缓冲区实现和示例。我非常喜
    的头像 发表于 09-02 09:24 6730次阅读
    基于宏高效<b class='flag-5'>实现</b>环形<b class='flag-5'>缓冲区</b>教程

    使用UART FIFO缓冲区时,缓冲区中的数据有时会损坏的原因?

    1 TX FIFO 缓冲区中的一个字节从 UART 0 TX FIFO 更改为一个字节(见下图)。 据我所见,问题发生在FIFO硬件的某个地方,因为软件发送的数据是正确的。 UART
    发表于 03-06 06:59

    UART上的FIFO循环缓冲区大小

    ?示例:{STX,Hello \ 0,RTX}和{STX,这是一个长文本\ 0,RTX}我一直在互联网上挖掘,我发现最好的方法是使用FIFO循环缓冲区。问题是BUFFER_SIZE在这种情况下如何解
    发表于 09-13 15:42

    UART缓冲区问题

    问题与中断有关。只要UARTHI PUCHCHAR例程将字符直接放入PSoC UART发送数据寄存器,就发送字符。如果UARTHIPPUCHAR例程将字符放置到缓冲区中,则
    发表于 05-22 13:19

    UART缓冲技术:友好中断

    释想象一下执行一个任务的中断例程:通过UART接收到字节后,它将字节存储到缓冲区数组中,并增加totalBytes计数。isr_routine(){if(
    发表于 09-19 08:32

    DMA循环缓冲区如何重置起点?

    ){head_index = (head_index + dma_buffer_interrupt_size) % uartsize;}我遇到的问题是,当我设置一个循环缓冲区时,一旦它进入
    发表于 12-13 08:22

    如何接收UART数组缓冲区的长度呢?有何解决方案?

    数据,禁用接收并返回。如果缓冲区数组已满,但传输仍在继续,只需等待传输结束,然后禁用接收并返回。代码:void uart1_receiveArray(uint8_t *arrayp
    发表于 12-14 08:18

    msp430 UART 通讯寄存器的详细解读

    msp430 UART 通讯 寄存器的详细解读 相关参数的设置和命令的详见等等
    发表于 08-15 19:03 1次下载

    51单片机内核UART串行总线环形缓冲区驱动实现的程序免费下载

    驱动实现串口中断接收和发送数据,缓冲区使用环形缓冲区。发送:手动置RI中断标志位为1,发生
    发表于 07-19 17:38 3次下载
    51单片机内核<b class='flag-5'>UART</b>串行总线环形<b class='flag-5'>缓冲区</b><b class='flag-5'>驱动</b><b class='flag-5'>实现</b>的程序免费下载

    环形缓冲区实现原理

    在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区
    的头像 发表于 03-22 10:03 7530次阅读
    环形<b class='flag-5'>缓冲区</b>的<b class='flag-5'>实现</b>原理

    UART寄存器介绍与中断操作详解

    简介 UART核提供了一个Avalon存储映射(Avalon-MM)的接口,这个接口使得Avalon-MM的主要周边设备(例如Nios II处理)通过读和写数据、控制寄存器,就能
    的头像 发表于 08-25 16:46 1.6w次阅读
    <b class='flag-5'>UART</b><b class='flag-5'>寄存器</b>介绍与<b class='flag-5'>中断</b>操作详解

    什么是缓冲区?有什么作用

    缓冲区其实就是一个存储区域,它是由专门的硬件寄存器所组成的。
    的头像 发表于 02-02 09:57 2.6w次阅读

    环形缓冲区实现思路

    单片机程序开发一般都会用到UART串口通信,通过通信来实现上位机和单片机程序的数据交互。通信中为了实现正常的收发,一般都会有对应的发送和接收缓存来暂存通信数据。这里使用环形缓冲区的方式
    的头像 发表于 01-17 15:07 1632次阅读

    C++环形缓冲区设计与实现

    Buffer) 环形缓冲区(Circular Buffer),也被称为循环缓冲区(Cyclic Buffer)或者环形队列(Ring Buffer),是一种数据结构类型,它在内存中形成一个环形
    的头像 发表于 11-09 11:21 2026次阅读
    C++环形<b class='flag-5'>缓冲区</b>设计与<b class='flag-5'>实现</b>