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-19 17:51

飞思卡尔16位单片机(七)——SCI串口测试
一、SCI串口介绍 随着单片机系统的广泛应用和计算机网络技术的普及,单片机的通信功能越来越显得重要了。单片机通信是指单片机与计算机或单片机与单片机之间的信息交换。通信方式有并行和串行两种方式。由于单片机的接口资源是比较宝贵的,采用并口通信会占用比较多的接口资源,所以信息的交换多采用串行通信的方式。 (1)并行通信方式 并行通信通常是将数据字节的各位用多条数据线同时进行传送,每一位数据都需要一条数据线,8位数据总线的通信系统,一次传送8位数据(一个字节),将需要8条数据线。此外,还需要一条信号线和若干控制信号线,这种方式仅适合于短距离的数据传输,如比较老式的打印机就是通过并口方式与计算机连接,现在都用传输速度非
[单片机]
飞思卡尔16位单片机(七)——SCI<font color='red'>串口</font>测试
STM32中关于串口中断的调试
说来惭愧,前日在调试stm32f10系列的单片机的时候,想做一个关于串口发送的状态机,每隔100毫秒发送一次命令。没有用DMA,就是想单纯的使用发送中断来数据,结果在调试的时候一直死在了串口中断那里,然后查看sr寄存器,发现是TC位只要打开发送中断就会被置位,看到这里我嘴角微微上扬,轻蔑一笑,(ˉ▽ ̄~) 切~~清掉标志位就好啦。 事实证明,我是愚蠢的,我在中断那里TC位清零后,再次仿真,呃,怎么还不出去?_? 好吧,我在使能发送中断之前清一下好吧。~~(╯﹏╰)b,还不走…… 三板斧耍完了,(~ ̄▽ ̄)~,度娘,你在哪? 百度关键字“STM32发送中断”,哈,一堆的人有和我一样的问题。问题总该迎刃而解了吧。 度娘出来的答案好多,
[单片机]
S3C2440串口(1)
1.S3C2440串口概述 串口通讯一般要增加电平转换电路,原因是TTL/CMOS电平与RS232电平不一致: TTL/CMOS电平: CMOS电平: 常用的电平转换芯片是MAX3232。 S3C2440有3个独立的异步串口,可以选择工作在中断或DMA方式下。每个UART包括一个波特率发生器、发送器、接收器和一个控制单元。 UART有FIFO模式和非FIFO模式。FIFO模式下可以利用64字节的发送/接收缓冲寄存器,非FIFO模式下只使用了发送/接收缓冲寄存器中的1个字节。本篇入门级以非FIFO为例。 2.串口设置及相关寄存器 串口引脚是GPIO复用的。本篇UART只用3根引脚:TXD、RXD、GND。 TXD0 – G
[单片机]
STM32单片机的串口通信波特率计算方法
1. 什么是波特率 不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。 2. STM32波特率相关的寄存器 STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。 该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。 3. 波特率计算方法 STM32的数据手册给出了计算方法,有一个公式,如下图所示: 在这个公式上,共有三个变量
[单片机]
STM32单片机的<font color='red'>串口</font>通信波特率计算方法
STM32 不断进入串口中断问题 解决方法
STM32 有时候会不断进入中断,解决方法如下 1.串口初始化配置时,需要打开ORE 溢出中断,如下红色代码所示 void Usart_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 开启串口时钟 GPIO_PinA
[单片机]
STM32 串口通讯 发送 接收
STM32的使用有利有弊,种类多---但是种类有太多,资料也是比较乱的,还有就是库的调用,经常忘记一些函数的使用------比如最常用的串口------ ------------------------------------------------------------------------------USART ----设置------------------------------- void USART1_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;
[单片机]
串口通信的理论极限及其实现
本文所说的串口,是指RS-232和RS-485串行口,不是硬盘SATA串口,也不是通用串口总线USB。RS-485是对RS-232进行了节点和距离的改进后形成的标准:RS-485将只能够进行一对一通信的RS-232改进到了可接128个节点,距离从RS-232的15米改进到1200米。在下一代RS-485总线的概念下,波仕卡科技将原本用于延长RS-485通信距离并且提高负载能力的中继器与用于信号转换的RS-232/RS-485转换器进行绑定,推出RS-232/RS-485中继转换器,同时对RS-485信号的流向进行整理,使得用户在使用时感觉就是一个RS-232与RS-485的转换器。这种思想体现在最新的《一种带中继功能的串口转换器》
[嵌入式]
采用LabVIEW的PC机与变频器的串口通信
本文针对摩擦学试验研究的特点,采用广泛使用的LabVIEW编程语言,开发用于东元7200MA变频器运行频率的控制串口通讯程序。 由于摩擦学试验机和摩擦学测试的特殊性,摩擦学试验中的变频器调速有着不同于一般工业变频控制的特点。一方面,要求变频器调速能够在较大范围内满足摩擦学测试的要求,使得试验结果具有可比性;另一方面,摩擦磨损试验过程中,对控制有一些特殊的要求,例如需要特殊的速度、运动的非周期性以及设备的快速启动和停止等。在一些疲劳试验中,甚至要求电机进行寸动或者往复运动以检测材料的性能,有的试验现场对人体的损害比较大,需要远距离进行控制和检测电机的运转情况。所以,必须利用计算机程序控制变频器实现一些特殊控制功能。这就
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

更多开源项目推荐
换一换 更多 相关热搜器件
更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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