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地址线和数据线分开,来了地 ...
随机推荐
- SQLDumpSplitter sql文件分割工具
数据库误操作,只好使用使用原来的备份数据去恢复数据,但是数据量太大,只好使用SQLDumpSplitter将大文件分割成小文件,然后恢复指定的表即可.
- 进阶之路(基础篇) - 014 通过RGB灯输出七色
本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:输出模拟信号,控制RGB灯的颜色 使用函数: pinMode(引脚 ...
- JQuery UI datepicker 使用方法(转)
官方地址:http://docs.jquery.com/UI/Datepicker,官方示例: http://jqueryui.com/demos/datepicker/. 一个不错的地址,用来DIY ...
- 【SQL】SQL 中Select语句完整的执行顺序
SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...
- [转]PhotoshopCS5 Extended使用atmlib.dll破解注册后没有3D菜单之解决方法
PS CS5分标准版和扩展版,扩展版有包括3D的所有功能理论上Adobe CS5 大师版的PS应该是扩展版的,但是某些童鞋可能会遇到安装好大师版后输入key后,PS再打开“3D选项”没有了.也就是说有 ...
- golang 学习 ---- channel
把一个loop放在一个goroutine里跑,我们可以使用关键字go来定义并启动一个goroutine: package main import "fmt" func loop() ...
- xtrabackup-解压备份文件报错sh: qpress: command not found
# xtrabackup --decompress --target-dir=/data/compressed xtrabackup version 2.4.8 based on MySQL serv ...
- Java String首字母大写
一種寫法參考 public String upperFirstChar(String input) { if (input == null || "".equals(input)) ...
- gcc cc1: all warnings being treated as errors
cc1: all warnings being treated as errors 在Makefile中找到 -Werror项,删除即可.删除后重新编译. 或设置环境变量 c工程设置 export C ...
- [转] Java DecimalFormat 用法
我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text. ...