UART

  • UART简介
    • 发送FIFO
    • 接收FIFO
    • 模式切换
    • 寄存器操作
      • 中断和状态寄存器
  • 发送数据
    • 轮询
    • 中断
  • 接收数据
    • 轮询
    • 中断
  • 实验:串口中断数据环回

UART简介

不需要了解时序。
UART是全双工异步收发的,没有时钟。
UART的操作通过配置和模式寄存器控制。
UART由独立的接受和发送路径构成。每个路径包含深度为64字节的FIFO。FIFO中断状态为支持轮询或中断方式。
轮询方式:不停地读取寄存器看有没有数据。
中断方式:只有当接收到串口数据后才打断主进程来接收数据。
数据位宽:6/7/8bit
停止位:1/1.5/2bit


发送FIFO

CPU通过APB接口将数据写入发送FIFO,直到发送模块(Transmitter,执行并转串)将数据从FIFO中读出并送到移位寄存器。CPU通过操纵TxFIFO寄存器来写数据。
写入数据后,TxFIFO的空标志被清零,发送模块检测到非空后,开始从TxFIFO中读出数据,并转为串行。

接收FIFO

接收FIFO存储来源于接收模块(Receiver,执行串转并)的数据,写入RxFIFO。CPU通过APB接口读取RxFIFO寄存器。
阈值触发:当RxFIFO接收到设定的阈值位数的数据后,阈值触发标志位变为1。可用于产生中断。

模式切换

寄存器操作

中断和状态寄存器

有两个状态寄存器:

  • 中断状态寄存器可以被读取状态和产生中断。(sticky)
  • 状态寄存器仅能读取状态。(dynamic)
    中断状态寄存器和掩码寄存器(只读)按位与。仅有都为1的位才能产生中断,送入中断控制器。

    通过中断使能寄存器和中断除能寄存器来控制中断掩码寄存器。

    收发FIFO寄存器的几种中断:空、满、触发阈值、接近满、溢出。

发送数据

轮询

  1. 检查TxFIFO是否为空
  2. 向TxFIFO中写数(64B)
  3. 等待TxFIFO空后再次写入

中断

  1. 除能TxFIFO空中断
  2. 向TxFIFO中写数(64B)
  3. 检查TxFIFO中还有没有空间可以写数
  4. 重复2、3
  5. 使能中断
  6. 等待TxFIFO为空后返回1

接收数据

轮询

  1. 等待RxFIFO中数据达到阈值或接收超时
  2. 从RxFIFO中读数据
  3. 重复2直到RxFIFO空
  4. 若接收超时,清除超时位

中断

  1. 使能中断
  2. 等待RxFIFO中数据达到阈值或接收超时
  3. 从RxFIFO中读数据
  4. 重复2、3
  5. 清除中断

读写数据操纵的都是TX_RX_FIFO0寄存器,其中包含收发两个FIFO。

实验:串口中断数据环回

/******************************************************************************
*
* Copyright (C) 2009 - 2014 Xilinx, Inc.  All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************//** helloworld.c: simple test application** This application configures UART 16550 to baud rate 9600.* PS7 UART (Zynq) is not initialized by this application, since* bootrom/bsp configures it to baud rate 115200** ------------------------------------------------* | UART TYPE   BAUD RATE                        |* ------------------------------------------------*   uartns550   9600*   uartlite    Configurable only in HW design*   ps7_uart    115200 (configured by bootrom/bsp)*/
/** 20230307运行成功!*/
#include <stdio.h>
//#include "platform.h"
#include "xil_printf.h"
#include "xuartps.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xuartps_hw.h"#define UART_DEVICE_ID     XPAR_XUARTPS_0_DEVICE_ID
#define UART_INT_IRQ_ID     XPAR_XUARTPS_0_INTR
#define INTC                XScuGic
#define INTC_DEVICE_ID      XPAR_SCUGIC_0_DEVICE_ID
//#define TEST_BUFFER_SIZE  100XUartPs UartPs   ;
XUartPs_Config *Config;
INTC InterruptController;   // 中断控制器驱动实例
//u8 RecvBuffer[TEST_BUFFER_SIZE];void Handler();
void uart_init();
void uart_intr_handler();
void uart_intr_init(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId);
int SetupInterruptSystem(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId);
int main()
{// 串口初始化uart_init();xil_printf("Uart initializes successfully!");// 串口中断初始化(包含:1.对Uart的中断进行配置;2.对PS的中断控制器(Gic)进行配置)uart_intr_init(&InterruptController, &UartPs, UART_INT_IRQ_ID);while(1); // 让程序停在这个位置,用来检测中断,只有cpu收到中断指令,才会跳出while(1),进入中断服务子程序return 0;
}// 串口初始化函数
void uart_init(){Config = XUartPs_LookupConfig(UART_DEVICE_ID);XUartPs_CfgInitialize(&UartPs, Config, Config->BaseAddress);// 设置串口工作模式XUartPs_SetOperMode(&UartPs, XUARTPS_OPER_MODE_NORMAL);// 设置串口波特率(默认就是115200)XUartPs_SetBaudRate(&UartPs, 115200);// 设置接收FIFO中断事件触发阈值,这里设置为1Byte,即每接收到1字节的数据就要产生一次中断,在中断函数中处理此中断XUartPs_SetFifoThreshold(&UartPs, 1);
}// 串口中断初始化函数
void uart_intr_init(INTC *IntcInstancePtr,XUartPs *UartInstancePtr,u16 UartIntrId){/** 以下为中断控制器Gic配置*/XScuGic_Config *IntcConfig;IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);// 关联中断ID和中断处理函数XScuGic_Connect(IntcInstancePtr, UartIntrId, (Xil_ExceptionHandler) uart_intr_handler, (void *) UartInstancePtr);// 设置并打开中断异常处理功能Xil_ExceptionInit();Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler) XScuGic_InterruptHandler,IntcInstancePtr);Xil_ExceptionEnable();/** 以下为Uart中断配置*/// 设置UART中断触发方式,即哪些状态位能够产生中断u32 IntrMask;IntrMask = XUARTPS_IXR_RXOVR;    // 接收fifo触发阈值中断位XUartPs_SetInterruptMask(UartInstancePtr, IntrMask);/** 使能UART中断*/XScuGic_Enable(IntcInstancePtr, UartIntrId);
}// 中断处理函数
void uart_intr_handler(XUartPs *UartInstancePtr){// 读取中断状态寄存器u32 rec_data = 0;u32 IsrStatus;IsrStatus = XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,XUARTPS_IMR_OFFSET);       // 获取中断掩码寄存器值,此处应该只有最低位为1,对应接收触发阈值中断IsrStatus &= XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET);     // 获取对应的中断状态寄存器的值// 若满足中断掩码寄存器和中断状态寄存器的与为1,再和接收fifo触发阈值位相与,为高电平,则确实为所需类型中断/** 接收处理*/if(IsrStatus & XUARTPS_IXR_RXOVR) {// 读取出Rxfifo中接收到的数据(仅一个字节)//    rec_data = XUartPs_Recv(UartInstancePtr, RecvBuffer, TEST_BUFFER_SIZE);rec_data = XUartPs_RecvByte(UartInstancePtr->Config.BaseAddress);// 清除中断状态寄存器的接收fifo触发阈值位XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET,XUARTPS_IXR_RXOVR);}/** 发送处理*/XUartPs_SendByte(UartInstancePtr->Config.BaseAddress, rec_data);}

ZYNQ嵌入式学习(5)相关推荐

  1. 嵌入式学习路线怎么学,如何学习嵌入式系统

    随着互联网的快速发展,嵌入式也越来越火热,更多的人投入到嵌入式开发的行列中来,那么想要学习嵌入式,该从哪里入手学习,嵌入式学习路线图怎么学? 想要学习好嵌入式,想成为嵌入式软件工程师.那么当前企业需要 ...

  2. 计算机网络之-嵌入式学习

    网络作为嵌入式学习的必备知识,很多嵌入式学习者还没有真正的去系统的了解过网络这个知识,在学习网络这块的知识,整理了一些网络笔记,希望对大家的学习能有帮助,那下面就一起看看计算机网络的相关知识吧!本文较 ...

  3. 以软件推动工业进步 -嵌入式学习网站

    http://www.cnblogs.com/cubean/archive/2010/04/26/1721035.html 以下内容转自:http://bbs.msembed.com/showtopi ...

  4. C指针-这该死的嵌入式学习生涯

    C指针-这该死的嵌入式学习生涯 01 前言 最近在公众号里面收到好几个同学关于嵌入式方面的咨询,再加上在知乎里面陆续推送了好几个嵌入式学习入门的问题,这次想统一整理一下,说说我这些年是如何被嵌入式按在 ...

  5. 嵌入式学习的几种线路图

    嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,我认为大概分3个阶段: 1.嵌入式linux上层应用,包括QT的GUI开发 2.嵌 ...

  6. 嵌入式学习笔记——ADC模数转换器

    ADC模数转换器 前言 ADC介绍 ADC概述 ADC的数量 ADC的特性 ADC框图 芯片外部框图 芯片内部框图 转换部分框图 状态输出部分 条件触发框图 寄存器介绍 编程思路 模式选择 规则通道的 ...

  7. xupt嵌入式学习(day1)

    嵌入式学习 嵌入式系统基础知识: 一.冯诺依曼计算机体系结构的要点: 1.计算机中的信息(程序和数据)以二进制方式表示. 2.程序预存储,机器自动执行. 3.计算机由运算器.控制器.存储器.输入设备和 ...

  8. 嵌入式学习之STM32实现OLED

    嵌入式学习之STM32实现OLED 一.实验要求 二.SPI介绍 三.OLED介绍 四.实验过程 1.代码编写: 实验结果演示: 一.实验要求 理解OLED屏显和汉字点阵编码原理,使用STM32F10 ...

  9. 嵌入式学习⑤——STM32嵌入式应用系统设计

    目录 前言 一.基于跨平台多类型代码编辑器VScode 1.VScode的安装 2.Ubuntu中用vscode编译调试C\C++ 二.Proteus仿真--STM32流水灯 1.创建工程 2.配置实 ...

最新文章

  1. 特征值与特征向量 matlab数值解,用MATLAB和numpy求解特征值和特征向量,matlab,与
  2. UML建模之时序图(Sequence Diagram)教程
  3. 修改Windows7登录界面背景图片的方法
  4. swift 将图片保存到本地_如何保存微博的所有图片链接并下载图片到本地
  5. 如何创建Oracle DBLink
  6. 如何通俗理解拉格朗日对偶问题(part2)
  7. python和matlab交互_MATLAB调用python,交互
  8. 上传失败 已保存至草稿_特大福利 清睿口语100成都会议专家讲座视频已上传至口语100网站...
  9. c语言输入若干数输出最小值循环结构,C语言上机150道题
  10. php date 报错,编译安装PHP报错:ext/date/php_date.lo is not a valid libtool object
  11. mysql快速启动_GitHub - TianSiQiang/Spring-Boot-MyBatis-Mysql: Spring Boot+MyBatis+Mysql 快速启动示例...
  12. DBA:这有一份对接NBU备份故障排除指南,请查收!
  13. ERPS(Ethernet Ring Protection Switching):以太网多环保护技术
  14. uc3854 matlab仿真,基于UC3854硬开关PFC变换电路设计课程设计.doc
  15. 教你做一个最简版的倒计时计时器,新手也能秒懂。
  16. 企业网络安全的重要性
  17. Mac M1 修改/usr/bin文件夹显示permission denied 没有权限的问题
  18. 基于springboot的张家口自驾游管理系统
  19. 关于OLAP数据仓库的归纳总结
  20. 阿德莱德大学计算机科学,School of Computer Science

热门文章

  1. CheckedListBox 当中项的状态改变
  2. 平凡人生的核心烦恼与洒脱消解法
  3. 网五服务器在哪个文件夹,5-4-在服务器中获取和放置文件-【管理文件】-奇秀广告(奇秀网)Dreamweaver CC2018入门及Dreamweaver教程...
  4. 解决dw2022win系统最新中文版安装失败问题 Dreamweaver 2022 一键安装下载教程
  5. vsCode创建javaScript代码模板
  6. 1.1 GB of1 GB physical memory used
  7. 煽情的儿子546=随笔
  8. 关于Linux中自动化配置服务和网络接口的一些笔记
  9. ios7再现大bug:iPhone大面积“激活出错”
  10. 软件体系结构期末总复习