关于RS-232C串口总线通信标准请参见我的另一个系列专题文章:
【嵌入式系统通信协议②】EIA RS-232C串口总线标准

实验 —— 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-RXD0GPHCON &= ~(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 = 26UBRDIV0 = 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 <stdio.h>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,8N1uart0_init();//测试发送字符串puts("Hello,World.I am mculover666.\r\n");//测试printfprintf("printf is ok.\r\n");while(1){recv_data = getchar();putchar(recv_data);}
}

5. 编译代码

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

TARGET = uartCFLAGS = -Wall    #输出所有warning$(TARGET).bin:$(TARGET).elfarm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin#注意:启动文件必须第一个链接
$(TARGET).elf:start.o bsp_uart_scan.o main.oarm-linux-ld -Ttext 0 start.o bsp_uart_scan.o main.o -o $(TARGET).elfstart.o:start.sarm-linux-gcc -c start.s $(CFLAGS) -o start.o
bsp_uart_scan.o:bsp_uart_scan.carm-linux-gcc -c bsp_uart_scan.c $(CFLAGS) -o bsp_uart_scan.o
main.o:main.carm-linux-gcc -c main.c $(CFLAGS) -o main.o    clean:rm -rf *.o *.elf *.bindownload_to_nand:#下载到nand flashoflash 0 1 0 0 0 $(TARGET).bin 

6. 下载运行

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

7.实验总结

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

  • 嵌入式系统的角度来说:掌握了RS-232C串口总线通信标准,包括其物理层和协议层,针对现在的情况主要使用其改进版,它的协议简单,在嵌入式系统中被大量使用,但是也有缺点,就是传输距离短,在15m左右;
  • S3C2440这颗芯片来说:掌握了其UART设备的使用。

S3C2440-裸机篇-06 | UART数据发送接收实验(扫描模式)相关推荐

  1. 4G模组工作笔记001---NB-IOT之一个完整的BC95 UDP从开机到数据发送接收过程

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 一直没来得及写一个完整的NB-IOT BC95的UDP数据传输过程,这里用我们的开发板来演示一下, ...

  2. 实战篇:UART串口连续接收实现

    这篇博文主要解决在双通道幅频相可调的DDS信号发生器中串口连续接收一帧信息时时间间隔和接收实现问题. 1. 多个字节接收如何实现? 2. 目前常见的是uart传输8bit信息,但是如果要传输一帧,多个 ...

  3. GD32F303RET6 串口空闲中断+DMA数据发送接收+环形缓冲区方式保存数据

    GD32F303RET6 DMA 通道映射关系 串口 源文件 #include "uart.h" #include "stdio.h" #include &qu ...

  4. Keil5 平台 S3C2440裸机程序开发-----UART

    目录 前言 一.时钟频率 二.代码 main.c uart.c uart.h led.c led.h S3C2440.h 三.编译,烧录,打开串口助手,接收到数据. 前言 本博文介绍mini2440开 ...

  5. 使用Jrtplib实现RTP视频数据发送接收

    在网上下载获取Jrtplib包的源码,解压缩配置编译安装以后就可以使用,下载的代码包里面有example代码示例: 示例都是基于Jrtplib的RTP/RTCP协议栈实现,在设置Server端的时候, ...

  6. 全志V3S裸机串口驱动(中断方式接收,DMA接收有问题,小于32字节数据无法触发DMA传输)

    调试DMA接收遇到了个很奇怪的问题,就是DMA发送没问题,DMA接收的时候,如果数据小于32字节,数据被DMA从串口接收FIFO中取走了,但是并不会传输到指定的buff中,这个就没法用于接收未知长度的 ...

  7. stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  8. verilog设计UART发送接收及各种错误仿真

    发送数据,接收数据等. 错误信号 - OverrunError - 发生在接收器已经收到一个字符(!rxEmpty),并且在rxRead发生之前,下一个字符开始到达. UnderrunError - ...

  9. Python3树莓派连接阿里云物联网设备发送接收数据

    Python3连接阿里云物联网设备发送接收数据(树莓派) 阿里云物联网IOT 代码部分 库文件 Windows下安装环境 树莓派安装环境 可能遇到的错误 代码 效果展示 阿里云物联网IOT 首先,准备 ...

最新文章

  1. 概率分布函数的关系框架
  2. python 欧氏距离_如何用NumPy计算欧氏距离?
  3. goroutine并发扫描MySQL表_goroutine 并发之搜索文件内容
  4. Typora用法教程小结
  5. QQ邮箱怎么发送文件夹 怎样在QQ邮箱里发送压缩文件夹
  6. 好导师、选好题、保持创新; 然后坚定地执行: SCI论文是一切
  7. Deploy Oracle 10.2.0.5 on Red Hat Enterprise Linux 6.4
  8. 一个好的算法工程应该具备哪几点要素?
  9. 微信开发源代码详细分析-微信开发教程6
  10. ccna考试之导入题库———pdf转vce格式转换
  11. ElasticSearch学习总结(基础篇,可学习,可复习)
  12. codewars Kata——Persistent Bugger问题
  13. mysql查询前五行数据_五行缺失查询表,用sql语句查询表格的前五行
  14. MySQL 批量插入数据,一次插入多少行数据效率最高?
  15. 该充电时就充电,电池生命力才会持久,人何尝不是呢?
  16. 无人机监控交通流量实时传输路况智慧交通系统说明
  17. 俏兔子大战傻贼鹰(刚开始接触是写的,一直在草稿箱)
  18. linux cp拷贝一个文件到另一个目录,cp命令复制文件夹到另一个文件夹的注意事项 - 翟码农技术博客...
  19. Axure8 教程:两种图片交互效果(悬浮放大和左右滑动切换)
  20. VueCompilerError: v-html will override element children.

热门文章

  1. python常用数学公式
  2. 25个超酷手绘插图的网站设计
  3. Java使用POI将doc文档转为Html
  4. 大脑的未来将走向何方?《大脑全书》告诉你答案
  5. ios 微信分享重新编码链接_iOS 微信分享文件【原创】
  6. 大于4G的文件无法拷贝到U盘
  7. 挑战52天背完小猪佩奇(第02天)
  8. 米氏散射多次散射计算程序
  9. Go技术日报(2021-11-16/17)——gRPC的错误处理实践
  10. 【day22】java导出word文档(包含导出图片)