ZYNQ嵌入式学习(5)
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寄存器的几种中断:空、满、触发阈值、接近满、溢出。
发送数据
轮询
- 检查TxFIFO是否为空
- 向TxFIFO中写数(64B)
- 等待TxFIFO空后再次写入
中断
- 除能TxFIFO空中断
- 向TxFIFO中写数(64B)
- 检查TxFIFO中还有没有空间可以写数
- 重复2、3
- 使能中断
- 等待TxFIFO为空后返回1
接收数据
轮询
- 等待RxFIFO中数据达到阈值或接收超时
- 从RxFIFO中读数据
- 重复2直到RxFIFO空
- 若接收超时,清除超时位
中断
- 使能中断
- 等待RxFIFO中数据达到阈值或接收超时
- 从RxFIFO中读数据
- 重复2、3
- 清除中断
读写数据操纵的都是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)相关推荐
- 嵌入式学习路线怎么学,如何学习嵌入式系统
随着互联网的快速发展,嵌入式也越来越火热,更多的人投入到嵌入式开发的行列中来,那么想要学习嵌入式,该从哪里入手学习,嵌入式学习路线图怎么学? 想要学习好嵌入式,想成为嵌入式软件工程师.那么当前企业需要 ...
- 计算机网络之-嵌入式学习
网络作为嵌入式学习的必备知识,很多嵌入式学习者还没有真正的去系统的了解过网络这个知识,在学习网络这块的知识,整理了一些网络笔记,希望对大家的学习能有帮助,那下面就一起看看计算机网络的相关知识吧!本文较 ...
- 以软件推动工业进步 -嵌入式学习网站
http://www.cnblogs.com/cubean/archive/2010/04/26/1721035.html 以下内容转自:http://bbs.msembed.com/showtopi ...
- C指针-这该死的嵌入式学习生涯
C指针-这该死的嵌入式学习生涯 01 前言 最近在公众号里面收到好几个同学关于嵌入式方面的咨询,再加上在知乎里面陆续推送了好几个嵌入式学习入门的问题,这次想统一整理一下,说说我这些年是如何被嵌入式按在 ...
- 嵌入式学习的几种线路图
嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,我认为大概分3个阶段: 1.嵌入式linux上层应用,包括QT的GUI开发 2.嵌 ...
- 嵌入式学习笔记——ADC模数转换器
ADC模数转换器 前言 ADC介绍 ADC概述 ADC的数量 ADC的特性 ADC框图 芯片外部框图 芯片内部框图 转换部分框图 状态输出部分 条件触发框图 寄存器介绍 编程思路 模式选择 规则通道的 ...
- xupt嵌入式学习(day1)
嵌入式学习 嵌入式系统基础知识: 一.冯诺依曼计算机体系结构的要点: 1.计算机中的信息(程序和数据)以二进制方式表示. 2.程序预存储,机器自动执行. 3.计算机由运算器.控制器.存储器.输入设备和 ...
- 嵌入式学习之STM32实现OLED
嵌入式学习之STM32实现OLED 一.实验要求 二.SPI介绍 三.OLED介绍 四.实验过程 1.代码编写: 实验结果演示: 一.实验要求 理解OLED屏显和汉字点阵编码原理,使用STM32F10 ...
- 嵌入式学习⑤——STM32嵌入式应用系统设计
目录 前言 一.基于跨平台多类型代码编辑器VScode 1.VScode的安装 2.Ubuntu中用vscode编译调试C\C++ 二.Proteus仿真--STM32流水灯 1.创建工程 2.配置实 ...
最新文章
- 特征值与特征向量 matlab数值解,用MATLAB和numpy求解特征值和特征向量,matlab,与
- UML建模之时序图(Sequence Diagram)教程
- 修改Windows7登录界面背景图片的方法
- swift 将图片保存到本地_如何保存微博的所有图片链接并下载图片到本地
- 如何创建Oracle DBLink
- 如何通俗理解拉格朗日对偶问题(part2)
- python和matlab交互_MATLAB调用python,交互
- 上传失败 已保存至草稿_特大福利 清睿口语100成都会议专家讲座视频已上传至口语100网站...
- c语言输入若干数输出最小值循环结构,C语言上机150道题
- php date 报错,编译安装PHP报错:ext/date/php_date.lo is not a valid libtool object
- mysql快速启动_GitHub - TianSiQiang/Spring-Boot-MyBatis-Mysql: Spring Boot+MyBatis+Mysql 快速启动示例...
- DBA:这有一份对接NBU备份故障排除指南,请查收!
- ERPS(Ethernet Ring Protection Switching):以太网多环保护技术
- uc3854 matlab仿真,基于UC3854硬开关PFC变换电路设计课程设计.doc
- 教你做一个最简版的倒计时计时器,新手也能秒懂。
- 企业网络安全的重要性
- Mac M1 修改/usr/bin文件夹显示permission denied 没有权限的问题
- 基于springboot的张家口自驾游管理系统
- 关于OLAP数据仓库的归纳总结
- 阿德莱德大学计算机科学,School of Computer Science
热门文章
- CheckedListBox 当中项的状态改变
- 平凡人生的核心烦恼与洒脱消解法
- 网五服务器在哪个文件夹,5-4-在服务器中获取和放置文件-【管理文件】-奇秀广告(奇秀网)Dreamweaver CC2018入门及Dreamweaver教程...
- 解决dw2022win系统最新中文版安装失败问题 Dreamweaver 2022 一键安装下载教程
- vsCode创建javaScript代码模板
- 1.1 GB of1 GB physical memory used
- 煽情的儿子546=随笔
- 关于Linux中自动化配置服务和网络接口的一些笔记
- ios7再现大bug:iPhone大面积“激活出错”
- 软件体系结构期末总复习