专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
嵌入式
(新手)关于串口的编程的问题
2019-07-16 09:27
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
嵌入式Linux
6837
3
1698
在s5pv210中,不是应该先把GPA0寄存器调成控制串口的模式吗?
怎么我一调,编译没有问题,进入板子执行就没有任何显现
当我把GPIO寄存器的那一段代码删除后,稍微改了下代码,就可以了
这是怎么回事呢?
GPIO不是没有调成控制串口的模式吗?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
z00
2019-07-16 15:35
在使用S5PV210的串口发送和接收的时候,首先要对S5PV210的串口进行配置
1、配置GPIO,使对应管脚作为串口的发送和接收管脚
GPA0 0 1 管脚 2 3 可以配置
GPA0CON寄存器[7:4][3:0] 0x22
GPA0PUD寄存器[3:0] 0 禁止上下拉电阻
2、配置串口单元本身寄存器
ULCON0 0xE2900000
数据位:8位
停止位:1位
校验位:无
使用的正模式,非红外。
3、UCON0 0xE2900004
串口的收发模式:轮询
串口的时钟使用的PCLK UFCON0 0xE2900008
禁止FIFO
UMCON0 0xE290000C
禁止Modem
UBRDIV0 0xE2900028
UDIVSLOT0 0xE290002C
UBRDIV0 = PCLK或者SCLK_UART/波特率/16 - 1 的整数部分
UDIVSLOT0 查表,怎么查?
PCLK或者SCLK_UART/波特率/16 - 1 的小数部分 * 16 取整
查表
PCLK=66500000
波特率是115200
UBRDIV0 = 35
UDIVSLOT0 = 0x0080
发送数据流程(轮询方式)
uart0_putc()
判断UTRSTAT0的BIT1,如果BIT1是0等待如果BIT1是1,就把要发送的一个字节数据写到发送寄存器(UTXH0,0xE2900020)
接收数据流程(轮询方式)
uart0_getc
判断UTRSTAT0的BIT0,如果BIT0是0等待如果BIT0是1,从URXH0 0xE2900024读取一个字节的数据。
编程时:
0xE2900000地址单元写3
0xE2900004地址单元写5
0xE2900008地址单元写0
0xE290000C地址单元写0
0xE2900028地址单元写35
0xE290002C地址单元写0x80
uart.h
#ifndef _UART_H_
#define _UART_H_
#define GPA0CON (*(volatile unsigned int *)0xE0200000)
#define GPA0PUD (*(volatile unsigned int *)0xE0200008)
#define ULCON0 (*(volatile unsigned int *)0xE2900000)
#define UCON0 (*(volatile unsigned int *)0xE2900004)
#define UFCON0 (*(volatile unsigned int *)0xE2900008)
#define UMCON0 (*(volatile unsigned int *)0xE290000C)
#define UTRSTAT0 (*(volatile unsigned int *)0xE2900010)
#define UTXH0 (*(volatile unsigned int *)0xE2900020)
#define URXH0 (*(volatile unsigned int *)0xE2900024)
#define UBRDIV0 (*(volatile unsigned int *)0xE2900028)
#define UDIVSLOT0 (*(volatile unsigned int *)0xE290002C)
#define PCLK (66500000)
//函数原型声明
extern void uart0_init(void);
extern void uart0_puts(const char *);
extern void uart0_putc(char);
extern char uart0_getc(void);
extern void uart0_gets(char *,int);
#endif // _UART_H_
复制代码
uart.c
#include "uart.h"
//初始化串口寄存器
void uart0_init(void){
//配置GPIO口 根据CPU 手册中设置下面的寄存器
//GPA0CON GPA0PUD
ULCON0 = 3;
UCON0 = 5;
UFCON0 = 0;
UMCON0 = 0;
UBRDIV0 = 35;
UDIVSLOT0 = 0x0080;
GPA0CON = 34;
GPA0PUD = ~0xF;
}
//发送一个字符
void uart0_putc(char c){
//判断状态位
while(!(UTRSTAT0 & (1<<1)));
//发送字符
UTXH0 = c;
}
//接收一个字符
char uart0_getc(void){
while(!(UTRSTAT0 & 1));
return URXH0;
}
//接收一串字符
void uart0_gets(char *str,int len){
char* tmp = str;
int in = len;
//int i;
while(--len){
*tmp = uart0_getc();
if(*tmp == ' '){
uart0_putc(' '); //若此处为 则不会输出,若为 则在下一行跳跃输出字符的长度,然后输出字符串
uart0_putc(' ');
break;
}
if(*tmp == 127){ //127 是 ubuntu下 kermit软件中的 BACKSPACE按键 需要实现的效果就是当按下回车键的时候终端的上一个数据会被删掉,
len++; //由于此分支的 127 输入到了 *tmp 中,此时的127是无用的,所以要进行 len++ ,但是有一个问题,我们的退格的目的是删除上一个字母,所以127的上一个字符也没用了,需要对len做两次自加进行还原 但是又出现一个问题,如果已经删到第0个元素就不能再自加两次了,这样会造成 len 越来越大。因此要在下面做一个判断
if(len < in){
len++;
}
if(tmp == str){
continue;
}
uart0_putc('');
uart0_putc(' ');
uart0_putc('');
--tmp;
continue;
}
uart0_putc(*tmp);
tmp++;
}
*tmp = 0;
}
//发送一串字符
void uart0_puts(const char *str){
if(str == 0){
return;
}
while(*str){
uart0_putc(*str);
if(*str == ' '){
uart0_putc(' ');
}
str++;
}
}
复制代码
加载中...
查看其它3个回答
一周热门
更多
>
相关问题
ARM 汇编,怎么这个export这么捣乱啊?
1 个回答
【ALIENTEK 战舰STM32开发板例程系列连载+教学】第五十八章 UCOSII实验1-任务调度
38 个回答
什么情况下会导致 自恢复保险丝 阻值出现异常?
1 个回答
【提问题,赢课程】反激开关电源设计、变压器设计及调试课程问题搜集
2 个回答
nand启动文件大于4KB,怎么解决
1 个回答
相关文章
嵌入式编译生成的HEX文件和BIN文件内容详解
0个评论
嵌入式领域,FPGA的串口通信接口设计,VHDL编程,altera平台
0个评论
IMX6UL裸机实现C语言按键输入实验
0个评论
如何编写一个工程文件夹下通用的Makefile
0个评论
Linux设备树专有名词及语法规则详解(下)
0个评论
嵌入式开发之GNU的汇编语法介绍
0个评论
嵌入式开发之Putty软件的安装和使用
0个评论
嵌入式开发之SecureCRT 软件安装和使用
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
嵌入式
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
1、配置GPIO,使对应管脚作为串口的发送和接收管脚
GPA0 0 1 管脚 2 3 可以配置
GPA0CON寄存器[7:4][3:0] 0x22
GPA0PUD寄存器[3:0] 0 禁止上下拉电阻
2、配置串口单元本身寄存器
ULCON0 0xE2900000
数据位:8位
停止位:1位
校验位:无
使用的正模式,非红外。
3、UCON0 0xE2900004
串口的收发模式:轮询
串口的时钟使用的PCLK UFCON0 0xE2900008
禁止FIFO
UMCON0 0xE290000C
禁止Modem
UBRDIV0 0xE2900028
UDIVSLOT0 0xE290002C
UBRDIV0 = PCLK或者SCLK_UART/波特率/16 - 1 的整数部分
UDIVSLOT0 查表,怎么查?
PCLK或者SCLK_UART/波特率/16 - 1 的小数部分 * 16 取整
查表
PCLK=66500000
波特率是115200
UBRDIV0 = 35
UDIVSLOT0 = 0x0080
发送数据流程(轮询方式)
uart0_putc()
判断UTRSTAT0的BIT1,如果BIT1是0等待如果BIT1是1,就把要发送的一个字节数据写到发送寄存器(UTXH0,0xE2900020)
接收数据流程(轮询方式)
uart0_getc
判断UTRSTAT0的BIT0,如果BIT0是0等待如果BIT0是1,从URXH0 0xE2900024读取一个字节的数据。
编程时:
0xE2900000地址单元写3
0xE2900004地址单元写5
0xE2900008地址单元写0
0xE290000C地址单元写0
0xE2900028地址单元写35
0xE290002C地址单元写0x80
uart.h
- #ifndef _UART_H_
- #define _UART_H_
- #define GPA0CON (*(volatile unsigned int *)0xE0200000)
- #define GPA0PUD (*(volatile unsigned int *)0xE0200008)
- #define ULCON0 (*(volatile unsigned int *)0xE2900000)
- #define UCON0 (*(volatile unsigned int *)0xE2900004)
- #define UFCON0 (*(volatile unsigned int *)0xE2900008)
- #define UMCON0 (*(volatile unsigned int *)0xE290000C)
- #define UTRSTAT0 (*(volatile unsigned int *)0xE2900010)
- #define UTXH0 (*(volatile unsigned int *)0xE2900020)
- #define URXH0 (*(volatile unsigned int *)0xE2900024)
- #define UBRDIV0 (*(volatile unsigned int *)0xE2900028)
- #define UDIVSLOT0 (*(volatile unsigned int *)0xE290002C)
- #define PCLK (66500000)
- //函数原型声明
- extern void uart0_init(void);
- extern void uart0_puts(const char *);
- extern void uart0_putc(char);
- extern char uart0_getc(void);
- extern void uart0_gets(char *,int);
- #endif // _UART_H_
复制代码uart.c
- #include "uart.h"
- //初始化串口寄存器
- void uart0_init(void){
- //配置GPIO口 根据CPU 手册中设置下面的寄存器
- //GPA0CON GPA0PUD
- ULCON0 = 3;
- UCON0 = 5;
- UFCON0 = 0;
- UMCON0 = 0;
- UBRDIV0 = 35;
- UDIVSLOT0 = 0x0080;
- GPA0CON = 34;
- GPA0PUD = ~0xF;
- }
- //发送一个字符
- void uart0_putc(char c){
- //判断状态位
- while(!(UTRSTAT0 & (1<<1)));
- //发送字符
- UTXH0 = c;
- }
- //接收一个字符
- char uart0_getc(void){
- while(!(UTRSTAT0 & 1));
- return URXH0;
- }
- //接收一串字符
- void uart0_gets(char *str,int len){
- char* tmp = str;
- int in = len;
- //int i;
- while(--len){
- *tmp = uart0_getc();
- if(*tmp == '
'){
- uart0_putc('
'); //若此处为
则不会输出,若为
则在下一行跳跃输出字符的长度,然后输出字符串
- uart0_putc('
');
- break;
- }
- if(*tmp == 127){ //127 是 ubuntu下 kermit软件中的 BACKSPACE按键 需要实现的效果就是当按下回车键的时候终端的上一个数据会被删掉,
- len++; //由于此分支的 127 输入到了 *tmp 中,此时的127是无用的,所以要进行 len++ ,但是有一个问题,我们的退格的目的是删除上一个字母,所以127的上一个字符也没用了,需要对len做两次自加进行还原 但是又出现一个问题,如果已经删到第0个元素就不能再自加两次了,这样会造成 len 越来越大。因此要在下面做一个判断
- if(len < in){
- len++;
- }
- if(tmp == str){
- continue;
- }
- uart0_putc('');
- uart0_putc(' ');
- uart0_putc('');
- --tmp;
- continue;
- }
- uart0_putc(*tmp);
- tmp++;
- }
- *tmp = 0;
- }
- //发送一串字符
- void uart0_puts(const char *str){
- if(str == 0){
- return;
- }
- while(*str){
- uart0_putc(*str);
- if(*str == '
'){
- uart0_putc('
');
- }
- str++;
- }
- }
复制代码一周热门 更多>