串口配置c语言,C语言驱动之配置串口(基于S3C2440开发板)
#include #include "heap.h"
/*------------------------ Type Declarations ---------------------------------*/
//UART驱动由UART相关的IO口的配置,UART寄存器控制。UART中断处理三部分组成
#define FCLK (405000000) //405M
#define HCLK (101000000) //101M
#define PCLK (50000000) //50.5M
int UART0_init(int baudrate)
{
//设置波特率
int nUBRDIV = PCLK/16/baudrate - 1;
// 设置引脚,配置上拉模式
GPHCON = 0xA0;
GPHUP = 0x0C;
//设置数据传输格式:初始化UART线控制寄存器
//普通模式操作 无奇偶校验 1个停止位 8个字节长度
ULCON0 = (0x3);
// ULCON1 = (0<<6)|(0<<3)|(0<<2)|(3<<0);
// ULCON2 = (0<<6)|(0<<3)|(0<<2)|(3<<0);
//设置通道工作模式:设置UART控制寄存器
// [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0]
// 时钟选择, Tx 中断, Rx 中断, Rx 超时使能, Rx 错误, 回环模式, 发出断点信号, 传输模式, 接收模式
// 0 1 0 , 0 1 0 0 , 01 01
// PCLK 电平 脉冲 禁止 生成 正常 正常传输 中断 或 轮询
UCON0 = (0x5); //轮询或中断
// UCON1 = (0<<12)|(2<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);
// UCON2 = (0<<12)|(2<<10)|(0<<9)|(0<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);
//设置FIFO控制器
// [7:6] [5:4] [3] [2] [1] [0]
// Tx FIFO深度触发 Rx FIFO深度触发 保留 Tx FIFO复位 Rx FIFO复位 FIFO使能
// 0 0 / 0 1 1
// 空 一字节 正常 复位 使能
UFCON0 = (0<<6)|(0<<4)|(0<<2)|(1<<1)|(1<<0);
//UFCON1 = (0<<6)|(0<<4)|(0<<2)|(1<<1)|(1<<0);
//UFCON2 = (0<<6)|(0<<4)|(0<<2)|(1<<1)|(1<<0);
//流控设置
UMCON0 = 0;
//UMCON1 = 0;
//UMCON2 = 0;
//波特率设置
UBRDIV0 = nUBRDIV;
//UBRDIV1 = nUBRDIV;
//UBRDIV2 = nUBRDIV;
return 0;
}
//数据发送
int UART0_SendByte(unsigned char cSendChar)
{
//阻塞式,一直等待,直到串口缓冲区有空闲位并发送数据在返回
while(!(UTRSTAT0 & 0x2));
UTXH0 = (int)cSendChar;
return 0;
}
//接收数据
unsigned char UART0_RecvByte(void)
{
//阻塞式,一直等待,直到串口有数据再读取
while(!(UTRSTAT0 & 0x1));
return (unsigned char)URXH0;
}
//数据发送是否完成
int UART0_IsTransFinish(void)
{
return (UTRSTAT0 & (1<<2));
}
//清空FIFO接收数据
void UART0_cleanRX(void)
{
int num = UFSTAT0 & 0x1f; //当前FIFO中的接收数据
while(num > 0)
{
char ch = URXH0; //只要读取该寄存器就从FIFO中取出一个字节
num--;
}
}
//------------下面是接收、发送一个字符串-------------
int UART0_RecvString(unsigned char * buf, int len)
{
int i = 0;
while(i < len)
{
buf[i++] = UART0_RecvByte();
}
return i;
}
int UART0_SendString(unsigned char * buf, int len)
{
int i;
for(i = 0; i < len; i++)
{
UART0_SendByte(buf[i]);
}
return i;
}
//----------FIFO中断模式----------------------
int ReceiveIndex = 0;
char ReceiveBuffer[200] = {0};
int flag_Receive_end = 0;
int count2 = 0;
unsigned char *p = (unsigned char*)0x31000000;
static void UART0_IRQ_Receive(void)
{
char temp ;
char count, i;
//p = xmalloc(480*272*3);
count = UFSTAT0&0x3F; //中断发生时接受的字节数
for(i = 0; i < count; i++)
{
temp = URXH0;
ReceiveBuffer[ReceiveIndex] = temp;
ReceiveIndex++;
}
memcpy(p+count2,ReceiveBuffer,32);
count2+=count;
// gg[0]=p;
// UART0_RecvString((unsigned char*)(0x31000000),count);
// printf("%d",count2);
//page++;
// p+=480*272*2*page;
ReceiveIndex=0;
if(count < 32)
{
ReceiveBuffer[ReceiveIndex] = 0;//数组或者memcpy的使用
//处理收到的数据
uartcmd_run(ReceiveBuffer);
ReceiveIndex = 0;
flag_Receive_end = 1;//flag_Receive_end为接收结束标志,值为1表示一次数据接收结束
printf("%s", ReceiveBuffer); //回送
}
}
//串口初始化
void UART0_InitFIFO(int baudrate)
{
//设置波特率
int nUBRDIV = PCLK/16/baudrate - 1;
GPHCON = 0xA0;
GPHUP = 0x0C;
//设置数据传输格式:初始化UART线控制寄存器
//普通模式操作 无奇偶校验 1个停止位 8个字节长度
ULCON0 = (0<<6)|(0<<3)|(0<<2)|(3<<0);
UCON0 = (0 << 12) | (2 << 10) | (1 << 7) | (1 << 2) | (1 << 0); //查询方式为轮询或中断;时钟选择为PCLK
UFCON0 = (2 << 6) | (3 << 4) | (0 << 3) | (1 << 2) | (1 << 1) | (1 << 0); //启用FIFO,数据发送中断模式(0字节),数据接收中断模式(32字节)
UMCON0 = 0x00; //不使用流控
UBRDIV0 = nUBRDIV; //波特率为115200,PCLK = 50MHz
//安装中断处理函数
irq_install(IRQ_SUB_RXD0, UART0_IRQ_Receive); //接收使用FIFO中断
//irq_install(IRQ_SUB_TXD0, UART0_IRQ_Send); //不用发送中断
}
//重定向
int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用
{
UART0_SendByte((unsigned char)ch);
return ch;
}
串口配置c语言,C语言驱动之配置串口(基于S3C2440开发板)相关推荐
- c语言编译 aiocompiler,RK3399快速熟悉(基于AIO-3399C开发板)
一.简介 AIO-3399C(AI) 包括 "带 NPU" 和"无 NPU" 两个版本 1.规格参数 ~$ arch aarch64 ~$ cat /proc/ ...
- Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)
文章目录 全系列传送门 1. 在/arch/arm/boot/dts/imx6q-pinfunc.h查找 2. 在设备树配置文件中添加设备节点定义以及其引脚定义 3. 修改设备树文件添加配置 4. d ...
- linux串口驱动ioremap,S3C2440开发板LED驱动——ioremap 映射
刚开始学字符设备驱动,感觉最难的是驱动和底层硬件的连接.linux上的驱动程序,是基于操作系统之上的,他并不直接和底层的硬件打交道,但是我们写的驱动必须能使硬件"跑"起来,即与硬件 ...
- S3C2440 开发板实战(7):字符设备驱动框架+LED驱动
在学习驱动的时候我遇到了很多问题,所以我的学习路线是这样的: 编写驱动发现.ko文件需要放入开发板的目录中,然后就学习通过nfs创建共享文件,在配置nfs时发现网络没有连接上,所以就学习怎样配置IP地 ...
- 串口烧录android板子,ubuntu 串口工具minicom使用 及 dnw镜像烧录(主要针对Android210开发板)...
一.Minicom 使用 Ubuntu下也有串口通信工具,比如Minicom,kermit.这里说明Minicom的使用. (1)安装 suodo apt-get install minicom (2 ...
- JZ2440 S3C2440 开发板开发步骤 之 uboot烧录 参数设置 裸机烧录 kernel烧录(openJTAG oflash usb 串口 dnw tftp nfs )
刚接触JZ2440开发板的通过看视频就知道怎么下载程序和各个开发步骤,但是已经过了好几年,至少快三年了,有些东西也忘记得差不多了,今天稍用很快的速度快进方式看了下视频,回忆起了一点,但不全部看完,此处 ...
- 【基于mini2440开发板的交叉编译环境及内核树配置.
在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙... 笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大 ...
- 在Ubuntu配置tftp服务器的简单几步并下载文件到开发板
1.关于TFTP的简单说明: TFTP:简单文件传输协议 是在TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务,端口号为69. 2.使用前查 ...
- msp430流水灯c语言程序,基于MSP-EXP430F5529开发板流水灯程序
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 RT,全部使用到了板载的8个可编程LED组成的流水灯程序,以及液晶的背光,达到了使能亮的东西全都又闪又亮了. //******************** ...
最新文章
- WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享...
- Web 服务编程,REST 与 SOAP
- SAP MM MIGO + 311 针对预留单做转库不能修改目的地存储地点!
- linux shell ascii 字符 转换
- Python文件处理
- php数组逗号连接,php – 如何使用逗号组合数组中的所有元素?
- 【技术解决方案】优化FFmpeg探测网络流时间过长的问题
- Oracle访问同义词连接超时,利用同义词解决oracle用户访问其它schema的对象
- swt matlab 中 swa,Matlab小波工具箱的使用3
- cisco2950 查看端口流量
- 集合框架之ArrayList集合
- c语言禁止窗口关闭,无法关闭窗口的程序
- css各种居中解决方法
- springBoot集成dubbo的超时时间设置
- 从mysql中检索数据后,通过userId的链接去delete数据
- Crashing Balloon ZOJ1003
- 【MATLAB】基于支持向量机的简单图像识别实现
- 微信公众号开发之iOS分享失败
- 苹果手机的Heic格式转换成jpg格式的简单python代码
- linux基础知识总结(二)