S3C2440串口的基本使用

发布者:huanli最新更新时间:2023-09-25 来源: elecfans关键字: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, 0n"        /* 读出控制寄存器 */ 

    "orr    r1, r1, #0xc0000000n"          /* 设置为“asynchronous bus mode” */

    "mcr    p15, 0, r1, c1, c0, 0n"        /* 写入控制寄存器 */

    );

    /* 设置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=(92<<12)|(1<<4)|(1<<0);

}

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(100000);

    Set_gpio(OUT, GPIOF,GPIO_PinSource4);

    Delay(100000);

    //点亮LED2然后熄灭

    Reset_gpio(OUT, GPIOF,GPIO_PinSource5);

    Delay(100000);

    Set_gpio(OUT, GPIOF,GPIO_PinSource5);

    Delay(100000);

    //点亮LED3然后熄灭

    Reset_gpio(OUT, GPIOF,GPIO_PinSource6);

    Delay(100000);

    Set_gpio(OUT, GPIOF,GPIO_PinSource6);

    Delay(100000);

    //熄灭三盏LED灯

    Set_gpio(OUT, GPIOF,GPIO_PinSource5);

    Set_gpio(OUT, GPIOF,GPIO_PinSource4);


    unsigned char c;

    

    uart_init();

    puts("Hello, world!nr");


    while (1)

    {

        

        while(1)

        {

            c = getchar();

            if (c == 'r')

            {

                putchar('n');

            }

        

            if (c == 'n')

            {

                putchar('r');

            }

        

            putchar(c);

        }



    }

    return 0;

}


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 &= ~((3<<4) | (3<<6));

    //设置2,3为发送接收

    GPHCON |= ((2<<4) | (2<<6));

    //使能内部上拉 

    GPHUP &= ~((1<<2) | (1<<3));  

    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 & (1<<2)));

    UTXH0 = (unsigned char)c;

    return 0;

    

}


int getchar(void)

{

//接收是在寄存器中读数据

    while (!(UTRSTAT0 & (1<<0)));

    return URXH0;

}


int puts(const char *s)

{

    if(s!=NULL)

    {

        while (*s)

        {

            putchar(*s);

            s++;

        }

    }

    return 0;

}


配置串口,要注意波特率,还有是否有缓存,实际应用中,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 0 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串口的基本使用

上一篇:s3c2440内存控制器与SDRAM基本测试
下一篇:ARM学习之S3C2440的bootloader代码分析(1)

推荐阅读最新更新时间:2024-11-09 21:04

AVR串口通讯的详解
一.熟悉AVR单片机UART资源,首先从波特率和帧说起 波特率:与51不同有单独的波特率发生器,不需要定时器来产生,节省了资源 波特率计算公式,这里我采用IccAVR的配置功能,直接计算生成 单片机支持的模式:异步正常模式,异步倍数模式,和同步模式,一般选第一种模式 帧格式:起始位+数据位(5-9位可选)+校验位(可选)+停止位(1、2位) 空闲 o ********* P 1 1 通讯电路空闲时为高电平 二、大概了解了下硬件资源后,就要了解软硬件的桥梁 寄存器了
[单片机]
labview串口错误:-1073807253,-1073807252,1073676294
最近的项目中使用串口通信,FPGA和上位机实现上传和下传通信,下传数据到FPGA没有问题,但是FPGA上传数据到labview总是出错。 问题:FPGA上传数据到FPGA有时可以,有时发生错误,labview错误代码-1073807253,-1073807252,1073676294 错误原因:代码前面有负号的表示错误,没有负号的代码表示警告,和其他编程语言一样,错误必须处理,警告可能有潜在的危险,一般不处理也没有关系。 labview错误代码解释链接 , 1073807253 传输时发生成帧错误。 1073807252 传输时发生超出限度错误。 在下一个字符到达之前,未从硬件读取该字
[测试测量]
单片机串口笔记
REN=1; //打开串口数据接收 SM0=0; SM1=1; TMOD=0x20; 使用T1计时器,因为M0=0;M1=1;则为0010 0000 为0x20 TH1=0xfd; TL1=0xfd; TR1=1; ES=1; ES:串行口中断允许位 位于单片机中断允许寄存器IE当中,可直接寻址(ACH),ES=0时,禁止串行口中断;ES=1时,允许串行口中断。 EA=1; 中断4: //接收部分 RI=0; somebody=SBUF; //发送部分 ES=0; SBUF='a'; while(TI==0); TI=0; E
[单片机]
STM32 基础系列教程 9 – 串口通信
前言 学习stm32 usart串口的使用,学会用Printf() 函数打印信息。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置: 系统时钟树 USART1配置 引脚配置(保持默认即可) 引脚保持默认即可,当然实际应用中可以根据自己的需求对其进行重映射。 工程代码 在main.c 中加
[单片机]
STM32 基础系列教程 9 – <font color='red'>串口</font>通信
基于CCS工程MSP430串口升级(三)
一、前文 第一次接触MSP430的芯片,第一次使用CCS开发环境,花了将近一个星期的时间,才把MSP430串口升级做出来。 同样分成BOOT(引导程序)、APP(主程序)、上位机(PC端工具),三个部分来讲解。 二、正文 折腾这个功能的时候,遇到了很多问题,现在来一一描述 C和汇编语言混合编程 C语言嵌入汇编语言是asm(“xxx”);,这样一开始编译一直不过。 然后几经百度谷歌后,发现在xxx前面加上制表符t,asm( xxx );,编译就过了。 IAR没有这个问题,CCS就这样。看来CCS编译器还有待改进。 汇编语言,#和&傻傻分不清 mov #0xEFFE,PC和mov &0xEFFE,PC 一开始搞不清楚,啥区
[单片机]
基于CCS工程MSP430<font color='red'>串口</font>升级(三)
基于S3C2440嵌入式系统的以太网接口电路设计方案
文章主要介绍了一个基于三星ARM9芯片S3C2440嵌入式系统的以太网接口电路设计方案,采用了工业级以太网控制器DM9000AEP成功实现了嵌入式系统网络数据交换。论文在重点阐述了网络接口电路基础之上,对Windows CE系统控制软件部分DM9000AEP的驱动程序和注册表项进行了具体分析。 随着微电子技术和计算机技术的发展,嵌入式技术得到广阔的发展,已成为现代工业控制、通信类和消费类产品发展的方向。以太网在实时操作、可靠传输、标准统一等方面的卓越性能及其便于安装、维护简单、不受通信距离限制等优点,已经被国内外很多监控、控制领域的研究人员广泛关注,并在实际应用中展露出显着的优势。本文提出了一种基于DM9000AE网络接口
[单片机]
基于<font color='red'>S3C2440</font>嵌入式系统的以太网接口电路设计方案
s3c2440裸机-LCD编程-5-LCD上实现画点线圆
1.画点 无论是何种图形,都是基于点来构成的,因此我们需要先实现画点,其他的都是上层的一些数据处理了,像各种图形、甚至色彩鲜艳的图片无非都是一些由点构造出的数据而已。 我们在在farmebuffer.c实现画点,在geomentry.c实现画线、画圆等几何图形,font.c实现画字。 那么一个像素点要显示到lcd上,我们要知道它的位置坐标,然后还要知道它的颜色值,假设该像素点的坐标为(x,y),那么该像素的地址为: (x,y)= fb_base + (xres*(bpp/8))*y +x*bpp/8; 那么所以在画点前需要先获取lcd参数:fb_base、xres、yres、bpp; static unsigned
[单片机]
STM32 | 串口IAP实例分享
什么是IAP? IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 在重新编程过程中可以使用任意类型的通信协议,如UART、I2S、SPI等。这篇笔记分享的是使用UART方式IAP。 串口IAP实验 先理一理流程(本实验是以STM32F103ZET6为例): 1、实验说明 做这个实验需要准备两个keil工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。最终,两份工程编译出来的可
[单片机]
STM32 | <font color='red'>串口</font>IAP实例分享
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved