S3C2440A的通用异步收发器(UART)配有3个独立异步串行I/O(SIO)端口,每个都可以是基于中断或基于DMA模式的操作。换句话说,UART可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输。
UART通过使用系统时钟可以支持最高115.2Kbps的比特率。如果是外部器件提供UEXTCLK的UART,则UART可以运行在更高的速度。每个UART通道包含两个的64字节的FIFO给发送和接收。
S3C2440A的UART包括了可编程波特率,红外(IR)发送/接收,插入1个或2个停止位,5位、6位、7位或8位的数据宽度以及奇偶校验。每个UART包含一个波特率发生器、发送器、接收器和一个控制单元,如图11-1所示。波特率发生器可以由PCLK、FCLK/n或UEXTCLK(外部输入时钟)时钟驱动。发送器和接收器包含了64字节FIFO和数据移位器。
将数据写入到FIFO接着在发送前复制到发送移位器中。随后将在发送数据引脚(TxDn)移出数据。与此同时从接收数据引脚(RxDn)移入收到的数据,接着从移位器复制到FIFO
使用2440的uart和其他芯片的uart使用类似,也是分为以下几步
设置数据长度,开始为,停止位,奇偶校验相关
选择设置uart时钟,中断类型,fifo状态等
设置FIFO,(我禁用了fifo)
设置自动流控制(我禁用了自动流控制)
设置波特率
波特率的计算公式如下
然后很重要的一点是串口配置好了还需要配置串口IO,参见之前的IO配置
如果要使能中断的话还要配置相应的中断,主要还是之前说过的寄存器,但是多了两个,子中断寄存器,
也就是说打开串口总中断之后需要再打开相应的子中断才能工作,中断处理清除总中断标志之后还要清除对应的子中断标志才行
Uart0.c
#include "uart0.h"
#include "stdio.h"
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0((u8)ch);;
return ch;
}
#endif
/***********只打开接收中断***********/
void __irq uartRxISP(void)
{
char ch;
int i = 0;
rSUBSRCPND |= 0x3; //清除rx,tx中断请求
rSRCPND |= 0x1<<28; //清除串口源挂起
rINTPND |= 0x1<<28; //清除串口子挂起
if(rUTRSTAT0 & 1) //接收缓冲区有数据
{
ch = rURXH0; //接收字节数据,接受处理
Uart0SendByte(ch);
}
}
void Uart0Init(u32 baud)
{
CalcBusClk(); //计算总线频率
rULCON0 = 0x03; //8位数据,1位停止位,无校验,不使用红外
rUFCON0 = 0; //禁止fifo
rUMCON0 = 0; //禁止rts自动流控制
rUCON0 = 0x5; //使用pclk时钟,中断模式
rUBRDIV0=( (int)(PCLK/16./baud+0.5) -1 );
rGPHCON &=~((3<<4)|(3<<6));
rGPHCON |=(2<<4)|(2<<6); //把GPH3、GPH2设置为RXD[0] 、TXD[0] 功能
rSRCPND |= 0x1<<28; //清除串口中断挂起
rSUBSRCPND |= 0x3; //清除收发中断
rINTPND |= 0x1<<28; //清除串口中断请求
rINTSUBMSK &= ~(0x1); //打开UART0接收中断,使能中断
rINTSUBMSK |= (0x1<<1); //关闭UART0发送中断,禁止中断
rINTMSK &= ~(0x1<<28); //打开UART0中断屏蔽,总中断
pISR_UART0 = (unsigned)uartRxISP; //中断子程序建立连接
}
void Uart0SendByte(u8 dat)
{
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0(dat);
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
}
Uart0.h
#ifndef __UART0_H_
#define __UART0_H_
#include "2440addr.h"
#include "def.h"
#include "clock.h"
#include "stdio.h"
void Uart0Init(u32 baud);
void Uart0SendByte(u8 dat);
#endif
关键字:S3C2440 串口 中断系统
引用地址:
S3C2440串口及其中断系统详解
推荐阅读最新更新时间:2024-03-16 15:29
PIC入门3,SPI通信和串口调试实验
MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行。 程序: //适合3EPIC实验板,配置PIC单片机的MSSP模块工作于SPI主控方式下, //通过一个并/串行转换移位寄存器(74HC165)将接收的并行数据通过SD0口送出的串行数据, //PIC将串行数据存入寄存器,送给D口,驱动LED亮。 #include pic.h #include pic1687x.h volatile unsigned char data; /*************************************************************************/ /*函数名:SPIINT()
[单片机]
mage128串口加超级终端打印程序
#include avr/io.h #include avr/interrupt.h #include inttypes.h #include avr/sfr_defs.h #include util/delay.h #include avr/pgmspace.h #include stdio.h #include stdarg.h //使用的是mage128的板子,这个是抄别人的,觉得很好用,里面的可变参数的 //理解起来还是有点儿困难的,不过myprintf()这个函数很好用,如果电脑没有 //串口,也可以用usb转串口来实现,需要安装usb转串口驱动,硬件管理器里面可 //以看到安装后的usb-serial的
[单片机]
STM32CubeMX之串口接收不定长数据
基本串口通信通常只能接收到定长数据,无法稳定接收不定长数据,本章介绍利用STM32单片机的IDLE空闲中断,接收不定长数据。 使能串口1的异步串行通信模式,开启Usart1的全局中断。添加DMA通道。 使用Stm32Cubemx生成源码, 打开生成的源码,删除whiel循环中的语句。 打开usart.h文件,在文件开头的USER CODE BEGIN Includes下方引入stdio.h头文件 打开usart.c文件,在USER CODE BEGIN 0与 USER CODE END 0之间添加下列代码。 #if 1 struct __FILE { int handle; }; FILE __stdout; //定义
[单片机]
stm32f103——串口UART
在学习UART之前,我们先来了解一下单片机与外围设备之间的通信: 单片机与外围设备之间的信息交换和传输我们称为通信。过去通信方式有两种:并行通信和串行通信。 并行通信: 定义:并行通信是指利用多条传输线将一个数据的各位同时传送。 传输方式:传输一个字节(8个位)的数据时,并口是将8个位一字排开,分别在8条连接线上同时传输。 特点:传输速度块,适用于短距离通信。 缺点:虽然,并行通信传输速度快,但是由于,线与线之间存在电磁干扰,会导致数据错误。而且由于线比较多,PCB布线比较麻烦,所以并行通信不常用,而串行通信用得比较广泛。 串行通信: 定义:串行通信是指利用一条传输线将数据一位位地顺序传送。 传输方式:传输一个字节(8
[单片机]
Linux驱动:s3c2410/s3c2440 ts驱动分析 之二
一,前言 前面结合“平台总线-设备-驱动”模型分析了ts(触摸)驱动的加载过程,现在进入驱动程序分析下其具体的实现。涉及到输入子系统详解、input核心层程序分析、evdev事件处理层程序分析、ts设备驱动层程序分析以及s3c2440的ADC转换和触摸控制器的操作。 二,涉及的寄存器 三,调用probe函数 根据上一篇的分析,驱动层通过platform_driver_register注册后,会调用到该驱动层的probe函数。 四,s3c2410ts_probe函数分析 4.1 硬件寄存器设置 4.1.1 获取设备参数 struct s3c2410_ts_mach_info *info; info = ( str
[单片机]
STM32 DMA详解——一串口为例
一. DMA原理: DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于 CPU 的大量 中断 负载。否则,CPU 需要从 来源 把每一片段的资料复制到 暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。 DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。 二.STM32使用DMA 1
[单片机]
串口实验改用串口2实现
一。串口2初始化 void uart_init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //串口2的时钟来自PCLK1 USART_DeInit(USART2); //复位串
[单片机]
带全速USB接口的PIC18F4550应用设计
引 言 随着USB(Universal Serial Bus)技术的发展,特别是高速(480 Mbps)USB2.0协议的出现,几乎所有的PC外设都可以移植到USB上,所以USB的PC外设的发展空间是巨大的,甚至在不久的将来,USB将完全取代异步串口和打印机并口,PC机厂商将不会再生产机箱上带异步串口和打印机并口的PC机了,机箱上也不会再有那么多的连线了。 USB是一种快速的、双向同步传输的、廉价并可以进行热插拔的串行接口。利用USB总线技术,开发适用于科学研究和工业牛产的各种仪器仪表设备,借以取代传统计算机测控系统中采用串行RS232或并行接口的仪器仪表设备,使计算机测控系统更加高效实时,方便灵活。 利用USB总线的数据采
[单片机]