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串口的基本使用的更多相关文章

  1. s3c2440串口裸板驱动(使用fifo)

    使用fifo的好处有: 1:串口的数据发送的数据量较大时,使用fifo可以大大降低MCU的开销.(有点类似串入并出的cput处理模型,本质上还是串行收发) 2:在某些特殊场合,例如制定较复杂的协议时, ...

  2. s3c2440串口详解

    一.UART原理说明 通用异步收发器简称UART(Universal Asynchronous Receiver/Transmitter),它用来传输串行数据:发送数据时,CPU将并行数据写入UART ...

  3. S3C2440串口及其中断系统详解

    个独立异步串行I/O(SIO)端口,每个都可以是基于中断或基于DMA模式的操作.换句话说,UART可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输. 字节的FIFO给发送和接收. 字节 ...

  4. Smart210学习记录------linux串口驱动

    转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27025492&id=327609 一.核心数据结构 串口驱动有 ...

  5. S3C2440—6.串口的printf实现

    文章目录 一.框架 二.printf函数原理 2.1 printf的声明 2.2 参数解读 2.3 如何得到可变参数的值 2.4 解决变参的宏定义 2.5 完成printf函数的封装 三.结合UART ...

  6. (三) UART 串口通讯

    UART  : university asynchronous receiver and transmitter UART  // 通用异步接收器和发送器 为什么要有串口:因为许多嵌入式设备没有显示屏 ...

  7. 将JZ2440的调试串口换成com2

    众所周知JZ2440 V3很小巧,精致.今天单就JZ2440的串口来讨论一些问题.我们在用串口进行调试的时候,需要用JZ2440自带的一根USB线连接电脑USB口和开发板的USB-com1口.先来看一 ...

  8. stc89c52开发板遥控器解码 红外线发射 内置 eeprom 存储 串口显示编码

    单片机,大概三年前,就买了一本 <爱上单片机> 最后就学会,用面包板了,编程书上基本没讲. 看原理图,看时序图,看数据手册, 都没讲. 而且书上自带的代码写的很烂. 1,缩近控制不好 2, ...

  9. s3c2440存储控制器和地址以及启动的理解

    转自:http://blog.sina.com.cn/s/blog_5ddb672b0100fkcf.html 1.首先应该先了解Flash ROM的种类 NOR FLASH地址线和数据线分开,来了地 ...

随机推荐

  1. SIGTERM等信号含义【转】

    主要是做sigterm 和sigkill区别的比较,之前的好多操作,在结束正在运行的一个程序的时候,常用kill,这个以后的注意,在sigterm不起作用的时候,再使用kill; 原文地址:http: ...

  2. UIAlertView 点击按钮后控制其是否消失

    新建NotDismissAlertView类,继承UIAlertView. 设置控制是否消失的标示符 重写  在-(void)dismissWithClickedButtonIndex:(NSInte ...

  3. Mac Vim 编辑器

    1.常用命令 /xxx 查找xxx n 执行上一次查找 0 到行首 w 光标往后移动一个词 b 光标往前移动一个词 x 删除当前一个字符 dw 删除一个单词 D 删除到行尾 dd 删除整行 V 选中整 ...

  4. 基于TransactionScope类的分布式隐式事务

    System.Transactions 命名空间中除了上一节中提到的基于 Transaction 类的显式编程模型,还提供使用 TransactionScope 类的隐式编程模型,它与显示编程模型相比 ...

  5. ElementUI 按需引入坑爹的点记录

    官网说的是这样的: 但实际上,应该是这样修改: { "presets": [ ["env", { "targets": { "br ...

  6. 如何在Android Studio中添加注释模板信息?

    如何在Android Studio中添加注释模板信息? 在开发程序的时候,我们一般都会给文件自动添加上一些关于文件的注释信息,比如开发者的名字,开发的时间,开发者的联系方式等等.那么在android ...

  7. FIR仿真module_04

    作者:桂. 时间:2018-02-06  12:10:14 链接:http://www.cnblogs.com/xingshansi/p/8421001.html 前言 本文主要记录基本的FIR实现, ...

  8. SpringBoot actuator 应用监控。

    前言 : 今天在阅读 <SpringCloud微服务实战>一书时看到了SpringBoot actuator相关知识,并且自己也本地调试实践.觉得SpringBoot这一套监控还是挺有意思 ...

  9. unity, Gizmos.DrawMesh一个坑

    错误写法(画不出来): void OnDrawGizmos(){ Mesh mesh=new Mesh(); mesh.vertices=... mesh.triangles=... //mesh.R ...

  10. 将视频转换为 HLS(HTTP Live Streaming) 协议格式文件

    就是将视频文件转码(H264+ACC).分片(n个.ts文件).生成列表(.m3u8) 方便网站提供视频播放服务,提升加载速度,节省流量. 1.准备好源视频文件. 2.下载 ffmpeg(http:/ ...