linux串口设置1843200波特率,S3C2440-裸机篇-06 | UART数据发送接收实验(扫描模式)...

实验 —— UART数据收发实验

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

4bea999823428e9325c904394f58ca02.png

8f53a5afa53fedafe3b4dfd1258e43d7.png

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

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

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

GPH2:TXD0

GPH3:RXD0

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

f69952afdfd442a30c103ba5d39ab194.png

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

d585aef0d70bb06715f3a8b08a0aae5e.png

3. 看芯片手册设置串口

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

0de15b7d5f54962dc6bfe95601fd06ac.png

3.2.设置串口(UCONn)

9ebf99d3ce6993dec83b06660ed3c940.png

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

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

90b6578f9dfa74fd799bcc54063b0330.png

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

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

b8560fa0bae7ae4850fa8b355855f711.png

3.3.设置波特率(UBRDIVn)

4fbfa1d80fdc409884f0e68dbf2d279e.png

波特率由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)

442cceb7e66910bd1835b585749cfc75.png

其中最重要的是,在使用指针访问这个寄存器的时候,不能使用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.发送/接收状态寄存器

a230dd9f40459403db61660ffd06710f.png

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<

GPHCON |= (2<

//开启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软件进行测试:

5d772795aa1c513e2ecc1982b7053f06.png

7.实验总结

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

关键字:

S3C2440

UART

数据发送接收

扫描模式

编辑:什么鱼 引用地址:

http://news.eeworld.com.cn/mcu/ic503590.html

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值