历史上的今天
返回首页

历史上的今天

今天是:2025年07月19日(星期六)

2020年07月19日 | S3C2440-裸机篇-06 | UART数据发送接收实验(扫描模式)

2020-07-19 来源:eefocus

实验 —— UART数据收发实验

1. 看原理图确定UART硬件如何连接


由原理图可以看出,JZ2440开发板上将三个串口全部引出,其中UART0设置了板载的USB转串口电路,只需连接板上的USB口就可以,所以接下来我们使用UART0进行数据收发实验。


2. 看芯片手册设置引脚复用功能(GPHCON)、开启片内上拉(GPHUP)

由原理图可以看出,UART0的引脚是:


GPH2:TXD0

GPH3:RXD0

这两个引脚都是普通的GPIO口,所以需要设置引脚复用功能,作为串口UART0的引脚:

在【【嵌入式系统通信协议②】EIA RS-232C串口总线标准】一文中讲解通信协议的时候讲过,串口的两根信号线在空闲的时候需要保持高电平,所以要开启这两个引脚的片内上拉电阻:

3. 看芯片手册设置串口

3.1.设置串口数据帧格式(ULCONn)

3.2.设置串口(UCONn)

3.2.1.设置串口波特率产生器的时钟源([11:10])

之前在【【S3C2440⑤】S3C2440时钟体系】中进行实验设置了时钟PCLK=50Mhz,所以在此基础上选择PCLK作为串口UART0的波特率发生器的时钟来源:

3.2.2.设置发送/接收数据模式([3:0])

为了简单起见,不使用中断模式和DMA模式,直接采用查询模式(polling mode):

3.3.设置波特率(UBRDIVn)

波特率由UBRDIVn寄存器决定,这个寄存器的值该取多少呢?公式如下:


比如,这里PCLK = 50Mhz,想要设置波特率为115200bit/s:


UBRDIVn = (int)(50000000/(115200*16)) - 1

= (int)(50000000/1843200) - 1

= (int)(27.13) - 1

= 27 - 1

= 26


3.4.数据发送/接收缓存寄存器(UTXHn和URXHn)

其中最重要的是,在使用指针访问这个寄存器的时候,不能使用int型指针,因为int型指针访问的是4个字节的数据,而此处只能访问一个字节数据,所以要使用char型指针:


#define UTXH0 (*(volatile unsigned char *)(0x50000020))  //UART 0 transmission hold 

#define URXH0 (*(volatile unsigned char *)(0x50000024))  //UART 0 receive buffer    


3.5.发送/接收状态寄存器

4. 编写代码

4.1.启动文件start.s

和之前相同。


4.2.驱动文件bsp_uart_scan.c/bsp_uart_scan.h

bsp_uart_scan.h

#ifndef _BSP_UART_SCAN_H_

#define _BSP_UART_SCAN_H_


void uart0_init();

int putchar(int c);

int getchar(void);

int puts(const char *s);


#endif /* _BSP_UART_SCAN_H_ */


bsp_uart_scan.c

/**

 * @ file    bsp_uart_scan.c

 * @ breif   uart0驱动

 * @ note    查询方式

 * @ author  mculover666

 * @ date    2019/3/7

*/

# include "bsp_uart_scan.h"

# include "s3c2440.h"

/**

 * @ brief  串口0初始化

 * @ param  无

 * @ retval 无

 * @ note   115200,8N1

*/


void uart0_init()

{

    /* 初始化uart0使用的引脚 */

    //GPH2-TXD0,GPH3-RXD0

    GPHCON &= ~(3<<(2*2) | (3<<(2*3)));

    GPHCON |= (2<<(2*2)) | (2<<(2*3));


    //开启GPH2、GPH3上拉    

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


    /* 设置数据格式: 8N1 */

    ULCON0 = 0x03;

    

    /* 设置串口 */

    // 使用PCLK作为串口时钟源,发送和接收均为查询模式

    UCON0 = 0x0005;


    /* 设置波特率为115200bit/s(PCLK = 50Mhz) */

    //UBRDIVn = (int)(50000000/(115200*16)) - 1 = 26

    UBRDIV0 = 26;

}


/**

 * @ brief  串口发送一个字节的数据

 * @ param  c-要发送的数据

 * @ retval 无

 * @ note   映射到串口0

*/


int putchar(int c)

{

    /* 在发送数据之前检查是否处于发送完成状态 */

    while(!(UTRSTAT0 & 0x06));

    UTXH0 = (unsigned char)c;


    return 0;

}

/**

 * @ brief  串口接收一个字节的数据

 * @ param  无

 * @ retval int

 * @ note   映射到串口0

*/

int getchar(void)

{

    while (!(UTRSTAT0 & (0x01)));

return URXH0;

}

/**

 * @ brief  串口发送字符串

 * @ param  s

 * @ retval 无

 * @ note   映射到串口0

*/

int puts(const char *s)

{

    while(*s)

    {

        putchar(*s);

        s++;

    }

    return 0;

}


/* 实现printf */

#if 1

#include


int _write(int fd, char *ptr, int len)  

{  

    while(*ptr)

    {

        while(!(UTRSTAT0 & 0x06));

        UTXH0 = (unsigned char)(*ptr++);

    }

  return len;

}

#endif


4.3.驱动测试文件main.c

/**

 * @ breif   测试uart0驱动程序:bsp_uart_scan.c

 * @ author  mculover666

 * @ date    2019/3/7

*/

# include "bsp_uart_scan.h"


int main(void)

{

    unsigned char recv_data;

    //初始化uar0:115200,8N1

    uart0_init();


    //测试发送字符串

    puts("Hello,World.I am mculover666.rn");


    //测试printf

    printf("printf is ok.rn");


    while(1)

    {

        recv_data = getchar();

        putchar(recv_data);

    }

}


5. 编译代码

使用makefile构建编译,在之前的基础上进行修改,如下:


TARGET = uart


CFLAGS = -Wall #输出所有warning


$(TARGET).bin:$(TARGET).elf

arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin

#注意:启动文件必须第一个链接

$(TARGET).elf:start.o bsp_uart_scan.o main.o

arm-linux-ld -Ttext 0 start.o bsp_uart_scan.o main.o -o $(TARGET).elf

start.o:start.s

arm-linux-gcc -c start.s $(CFLAGS) -o start.o

bsp_uart_scan.o:bsp_uart_scan.c

arm-linux-gcc -c bsp_uart_scan.c $(CFLAGS) -o bsp_uart_scan.o

main.o:main.c

arm-linux-gcc -c main.c $(CFLAGS) -o main.o

clean:

rm -rf *.o *.elf *.bin


download_to_nand:

#下载到nand flash

oflash 0 1 0 0 0 $(TARGET).bin 


6. 下载运行

这里使用SerialPort Utility软件进行测试:

7.实验总结

历经三天,终于完成了本实验,通过该实验:

推荐阅读

史海拾趣

巴丁微公司的发展小趣事

巴丁微积极参与各类电子行业的展会和交流活动,以此展示公司的技术实力和产品优势。在CITE2023第十一届中国电子信息博览会上,巴丁微向大家展示了其在电机驱动芯片在智能锁、气表、水表、个人护理及智能垃圾桶等领域的应用案例,吸引了大量专业人士和行业客户的关注。

通过展会,巴丁微不仅成功展示了公司的最新技术和产品,还加强了与业界同仁的交流与合作,进一步提升了公司在行业内的知名度和影响力。

BeagleBoard公司的发展小趣事

作为一家以开源硬件为核心的公司,BeagleBoard深知教育和人才培养的重要性。他们积极与学校、教育机构合作,提供教育支持和培训服务,帮助更多的学生了解嵌入式系统开发的魅力。同时,公司还设立了奖学金和竞赛项目,鼓励年轻开发者积极参与创新实践,为行业培养了一批批优秀的人才。

Electro-Term/Hollingsworth公司的发展小趣事

Hollingsworth公司一直以来都坚持品质至上的原则。公司投入大量资源用于产品质量控制和检测,确保每一件产品都符合最高标准。这种对品质的坚持不仅赢得了客户的信任,也帮助公司在市场上建立了良好的口碑。随着时间的推移,Hollingsworth的品牌价值不断提升,成为电子行业中的佼佼者。

Accelink Technologies Co Ltd公司的发展小趣事

随着环保意识的提高,Hollingsworth公司积极响应国家号召,致力于推动绿色生产和可持续发展。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还加大了对新能源领域的投入,开发了一系列环保型电子产品。这些举措不仅提升了公司的社会形象,也为公司未来的发展奠定了坚实的基础。

GuangDong Province MengCo Semiconductor Co., Ltd公司的发展小趣事
长时间或大电流制动可能导致制动电阻过热,影响使用寿命。
Deltron公司的发展小趣事

Deltron公司成立于XXXX年,初期以生产基础电子元器件为主。创始人XXX凭借其对电子技术的深刻理解和对市场趋势的敏锐洞察,带领团队进行了一系列技术创新。通过引进先进的生产设备和研发技术,Deltron成功开发出了一系列具有竞争力的产品,逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

但片机控制步进马达

要求能输入数据.按启动后马达按输入数运行.LCD能显示运行数字. 联系人潘军13922952043 panjun6@126.com…

查看全部问答>

急求FPGA设计的多功能波形发生器的目标芯片

小女子做的课题,初次接触FPGA的设计 用的是Quartus2的平台运行,综合编译已通过,但是时序仿真出了错:说是目标芯片不适用。 求各位大侠能指点指点,给出合适波形发生器的芯片型号,先在此谢过 下为VHDL开头部分程序: library ieee; use ie ...…

查看全部问答>

CE5+2440的IIC问题

小弟做的IIC读取温度的应用程序。运行我的应用程序后,系统拖死了,用示波器监测IIC波形是一直都在发送数据。但是运行网上下的IIC调试助手IICMgr_CE5.0.exe后,我的应用程序就正常了。即使把IICMgr_CE5.0.exe关了,再运行我的应用程序也正常的。 ...…

查看全部问答>

wince5.0下每次开机都要重新载入硬盘文件系统

wince5.0下,写了个硬盘驱动,可以加载16G硬盘。但是每次开机都要等10分钟载入文件系统,串口输出为不停的读某些扇区,一直等读完以后才能显示盘符,才可以读写硬盘不知为何?求教!…

查看全部问答>

欢迎加入c8051f群

这是一个面向c8051f的技术群,有热心的朋友和积极向上的氛围,如果您加入必然给您的c8051f的学习带来极大的帮助! 群一:3318950 群二:74346610 可以同时加入!…

查看全部问答>

变频带绕线电机的问题

变频器(ABB ACS800)带转子短接绕线电机,变频总报过载或超速(下降时)故障!是否是电机的故障呢? 谢谢各位的回答!我这套起升机构变频使用了外置制动单元与制动电阻,实际检查线路发现转子有断线现象,处理后依然存在上述问题。检查变 ...…

查看全部问答>

问一个有关vc33存储器配置的问题

我现在要设计一个vc33的应用系统,存储器分配如下400000--480000 为 EEPROM 程序存储器存储区 100000--180000  为 SRAM 数据,程序存储器 在设计时该如何管理/page0,/page1,/page2,/page3这些信号线? …

查看全部问答>

出售剩余的高速DA芯片AD9772A和时钟合成芯片CDCM7005

这两种芯片都只有2片了,便宜卖给喜欢自己做东西的兄弟 这些都是做项目剩余下来得,经过我实际做板测试,确实都是原装的好芯片,AD9772A用带海绵的盒子包的好好的,当然已经开封过了,不然我自己也没法用;CDCM7005也剩下2片,包装袋没开封,保存 ...…

查看全部问答>

怎么在这个程序里加蜂鸣器啊

 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity xiaoba10 isport(    clk:in std_logic;--    co  :out std_logic;--蜂鸣器 &nbs ...…

查看全部问答>

【项目外包】FPGA中实现TCP/IP IPV4或者IPV6的协议栈

FPGA中实现TCP/IP IPV4或者IPV6的协议栈 项目预算:¥ 3,000~20,000 开发周期: 45天 项目分类: 嵌入式 竞标要求: 项目标签: Xil ...…

查看全部问答>