S3C2440串口的基本使用
2440A有三个串口,我们使用串口0对它进行了解熟悉。
首先肯定是应该找到手册上串口0所对应的引脚,然后配置相应寄存器。
串口0对应GPIO H的 2,3

串口在单片机中我们已经有很多使用经验了,对于协议采用 8-N-1,8bit数据位,无校验,1停止位。
说明波特率的计算方式:


把串口对应IO配置成 TX和RX功能之后,我们需要对指定寄存器进行读写操作,实现串口的接发。
具体的寄存器就不贴出来了。手册上都有,这里不使用FIFO和中断方式,只是最基本的接发操作。
main.c:
#include "s3c2440_gpio.h"
#include "s3c2440_soc.h"
#include "uart.h" void SystemInit(void)
{
//配置LOCKTIME(0x4C000000) = 0xFFFFFFFF
*(volatile unsigned int *)0x4C000000=0xFFFFFFFF;
//CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8
*(volatile unsigned int *)0x4C000014=0x5;
//协处理指令
__asm__(
"mrc p15, 0, r1, c1, c0, 0\n" /* 读出控制寄存器 */
"orr r1, r1, #0xc0000000\n" /* 设置为“asynchronous bus mode” */
"mcr p15, 0, r1, c1, c0, 0\n" /* 写入控制寄存器 */
);
/* 设置MPLLCON(0x4C000004) = (92<<12)|(1<<4)|(1<<0)
* m = MDIV+8 = 92+8=100
* p = PDIV+2 = 1+2 = 3
* s = SDIV = 1
* FCLK = 2*m*Fin/(p*2^s) = 2*100*12/(3*2^1)=400M
*/
*(volatile unsigned int *)0x4C000004=(<<)|(<<)|(<<);
}
void Delay(uint32_t count)
{
while(count--);
}
int main(void)
{
//配置GPIOF 0,2,GPIOG 3为输入模式
Set_gpio(IN, GPIOF,GPIO_PinSource0);
Set_gpio(IN, GPIOF,GPIO_PinSource2);
Set_gpio(IN, GPIOG,GPIO_PinSource3);
//点亮LED1然后熄灭
Reset_gpio(OUT, GPIOF,GPIO_PinSource4);
Delay();
Set_gpio(OUT, GPIOF,GPIO_PinSource4);
Delay();
//点亮LED2然后熄灭
Reset_gpio(OUT, GPIOF,GPIO_PinSource5);
Delay();
Set_gpio(OUT, GPIOF,GPIO_PinSource5);
Delay();
//点亮LED3然后熄灭
Reset_gpio(OUT, GPIOF,GPIO_PinSource6);
Delay();
Set_gpio(OUT, GPIOF,GPIO_PinSource6);
Delay();
//熄灭三盏LED灯
Set_gpio(OUT, GPIOF,GPIO_PinSource5);
Set_gpio(OUT, GPIOF,GPIO_PinSource4); unsigned char c; uart_init();
puts("Hello, world!\n\r"); while ()
{ while()
{
c = getchar();
if (c == '\r')
{
putchar('\n');
} if (c == '\n')
{
putchar('\r');
} putchar(c);
} }
return ;
}
uart.c:
#include "uart.h"
#include "s3c2440_soc.h"
#define PCLK 50000000 // PCLK为50MHz
#define UART_CLK PCLK // UART0的时钟源设为PCLK
#define UART_BAUD_RATE 115200 // 波特率
#define UART_BRD ((int)(UART_CLK / (UART_BAUD_RATE * 16.0)+0.5) - 1)
#define NULL 0
void uart_init(void)
{
/* GPH2,3用于TxD0, RxD0 */
//清除GPHCON
GPHCON &= ~((<<) | (<<));
//设置2,3为发送接收
GPHCON |= ((<<) | (<<));
//使能内部上拉
GPHUP &= ~((<<) | (<<));
ULCON0 = 0x03; // 8N1(8个数据位,无校验,1个停止位)
UCON0 = 0x05; // 中断/查询模式,UART时钟源为PCLK
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRDIV0 = UART_BRD; // 波特率为115200 } int putchar(int c)
{
/* UTRSTAT0 */
/* UTXH0 */
/*发送是向寄存器写数据*/
while (!(UTRSTAT0 & (<<)));
UTXH0 = (unsigned char)c;
return ; } int getchar(void)
{
//接收是在寄存器中读数据
while (!(UTRSTAT0 & (<<)));
return URXH0;
} int puts(const char *s)
{
if(s!=NULL)
{
while (*s)
{
putchar(*s);
s++;
}
}
return ;
}
配置串口,要注意波特率,还有是否有缓存,实际应用中,FIFO是不可缺少的,这里只是入门简单实现。
启动文件和之前的时钟章节一样,
Makefile:
all:
arm-linux-gcc -c -g -o s3c2440_gpio.o s3c2440_gpio.c
arm-linux-gcc -c -g -o uart.o uart.c
arm-linux-gcc -c -g -o main.o main.c
arm-linux-gcc -c -g -o start.o start.S
arm-linux-ld -Ttext start.o main.o s3c2440_gpio.o uart.o -o uart.elf
arm-linux-objcopy -O binary -S uart.elf uart.bin
arm-linux-objdump -S -D uart.elf > uart.dis
clean:
rm *.bin *.o *.elf *.dis
NOTE:
在此之后,还是不去编写库函数了,太过于消耗时间,使用寄存器配置的方式,如果工作中需要长期使用某个cpu或mcu时,再去编写对应的库函数,因为时间实在不够。
S3C2440串口的基本使用的更多相关文章
- s3c2440串口裸板驱动(使用fifo)
使用fifo的好处有: 1:串口的数据发送的数据量较大时,使用fifo可以大大降低MCU的开销.(有点类似串入并出的cput处理模型,本质上还是串行收发) 2:在某些特殊场合,例如制定较复杂的协议时, ...
- s3c2440串口详解
一.UART原理说明 通用异步收发器简称UART(Universal Asynchronous Receiver/Transmitter),它用来传输串行数据:发送数据时,CPU将并行数据写入UART ...
- S3C2440串口及其中断系统详解
个独立异步串行I/O(SIO)端口,每个都可以是基于中断或基于DMA模式的操作.换句话说,UART可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输. 字节的FIFO给发送和接收. 字节 ...
- Smart210学习记录------linux串口驱动
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27025492&id=327609 一.核心数据结构 串口驱动有 ...
- S3C2440—6.串口的printf实现
文章目录 一.框架 二.printf函数原理 2.1 printf的声明 2.2 参数解读 2.3 如何得到可变参数的值 2.4 解决变参的宏定义 2.5 完成printf函数的封装 三.结合UART ...
- (三) UART 串口通讯
UART : university asynchronous receiver and transmitter UART // 通用异步接收器和发送器 为什么要有串口:因为许多嵌入式设备没有显示屏 ...
- 将JZ2440的调试串口换成com2
众所周知JZ2440 V3很小巧,精致.今天单就JZ2440的串口来讨论一些问题.我们在用串口进行调试的时候,需要用JZ2440自带的一根USB线连接电脑USB口和开发板的USB-com1口.先来看一 ...
- stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码
单片机,大概三年前,就买了一本 <爱上单片机> 最后就学会,用面包板了,编程书上基本没讲. 看原理图,看时序图,看数据手册, 都没讲. 而且书上自带的代码写的很烂. 1,缩近控制不好 2, ...
- s3c2440存储控制器和地址以及启动的理解
转自:http://blog.sina.com.cn/s/blog_5ddb672b0100fkcf.html 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地 ...
随机推荐
- Kickstart无人值守安装[转载]
导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有什么? 光盘安装系统===>一个服务器DV ...
- HDU 3584 Cube (三维数状数组)
Cube Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- 算法中的 log 到底是什么?
之前一直不解为何算法中经常会看到 log 今天看<数据结构与算法分析 Java 语言描述>(第 3 版)2.4.3 节 求最大子序列和的分治算法实现时才注意到原因 翻看第 29 页的最后一 ...
- golang学习笔记 ---命名
Go语言中的函数名.变量名.常量名.类型名.语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母.数字或下划线.大写 ...
- Oracle 12C -- shutdown CDB
SQL> select name,open_mode from v$pdbs; NAME OPEN_MODE ------------------------------ ---------- ...
- MySQL加载配置文件的顺序
MySQL5.6启动时,按照下表,从上往下的顺序加载配置文件: File Name Purpose /etc/my.cnf Global options /etc/mysql/my.cnf Globa ...
- 第1章 Python基础-Python介绍&循环语句 练习题&作业
1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型? 高级语言分为编译型与解释型两种,分别从执行速度.开发效率.跨平台性三个方面说它们的区别. 编译型语言因为执行的 ...
- Chrome封掉不在chrome商店中的插件解决办法
添加chrome的管理模板,chrome.adm文件:下载地址:链接:http://pan.baidu.com/s/1c08st7i 密码: e811 然后进行如下的设置,重启chrome就可以解除封 ...
- Linux 密码过期(WARNING:Your password has expired )
最近遇到两次这个问题,我们公司用的是开源的堡垒机Jumpserver但是最近有两个同学遇到了 WARNING:Your password has expired 第一次遇到这个问题也没有往深了去查,当 ...
- 在 Windows 7 中安装 .NET Framework 时遇到错误:无法建立到信任根颁发机构的证书链
当全新安装 Windows 7 SP1 后,在未安装任何补丁,也未进行联网的状态下,安装 .NET Framework 4.6 或更高的版本时,应该会遇到错误提示:无法建立到信任根颁发机构的证书链. ...