X210串口配置与stdio移植
串口控制器初始化关键步骤
(1)初始化串口的Tx和Rx引脚所对应的GPIO(查原理图可知Rx和Rx分别对应GPA0_1和GPA0_0)
(2)GPA0CON(0xE0200000),bit[3:0] = 0b0010 bit[7:4] = 0b0010
(3)初始化这几个关键寄存器UCON0 ULCON0 UMCON0 UFCON0 UBRDIV0 UDIVSLOT0
主要的几个寄存器
(1)ULCON0 = 0x3 // 0校验位、8数据位、1停止位
(2)UCON = 0x5 // 发送和接收都是polling mode
(3)UMCON0 = 0x0 // 禁止modem、afc
(4)UFCON0 = 0x0 // 禁止FIFO模式
(5)UBRDIV0和UDIVSLOT0和波特率有关,要根据公式去算的
波特率的计算和设置
(1)第一步,用PCLK_PSYS和目标波特率去计算DIV_VAL: DIV_VAL = (PCLK / (bps x 16)) ?1
(2)第二步,UBRDIV0寄存器中写入DIV_VAL的整数部分
(3)第三步,用小数部分*16得到1个个数,查表得uBDIVSLOT0寄存器的设置值
- #define GPA0CON 0xE0200000
- #define UCON0 0xE2900004
- #define ULCON0 0xE2900000
- #define UMCON0 0xE290000C
- #define UFCON0 0xE2900008
- #define UBRDIV0 0xE2900028
- #define UDIVSLOT0 0xE290002C
- #define UTRSTAT0 0xE2900010
- #define UTXH0 0xE2900020
- #define URXH0 0xE2900024
- #define rGPA0CON (*(volatile unsigned int *)GPA0CON)
- #define rUCON0 (*(volatile unsigned int *)UCON0)
- #define rULCON0 (*(volatile unsigned int *)ULCON0)
- #define rUMCON0 (*(volatile unsigned int *)UMCON0)
- #define rUFCON0 (*(volatile unsigned int *)UFCON0)
- #define rUBRDIV0 (*(volatile unsigned int *)UBRDIV0)
- #define rUDIVSLOT0 (*(volatile unsigned int *)UDIVSLOT0)
- #define rUTRSTAT0 (*(volatile unsigned int *)UTRSTAT0)
- #define rUTXH0 (*(volatile unsigned int *)UTXH0)
- #define rURXH0 (*(volatile unsigned int *)URXH0)
- //串口初始化
- void uart_init()
- { //初始化rx tx对应GPIO引脚
- rGPA0CON&=~(0xff<<);//将 bit0~7清零
- rGPA0CON|=0x22; //设置 _0 _1引脚为RX TX
- //串口相关寄存器
- rULCON0=0x3;
- rUCON0=0x5;
- rUMCON0=;
- rUFCON0=;
- //波特率计算相关
- /* //9600
- rUBRDIV0=433;
- rUDIVSLOT0=0x2222;
- */
- //用66.7MHZ算
- //115200
- //66700000/(115200*16)-1
- rUBRDIV0=;
- // rUBRDIV0余数*16 然后查表
- rUDIVSLOT0=0x0888;
- }
- //串口发送一字节
- void uart_putc(char c)
- {
- while(!(rUTRSTAT0&(<<)));//等待发送结束
- rUTXH0=c;
- }
- char uart_getc()
- {
- while(!(rUTRSTAT0&(<<)));//等待发送结束
- return rURXH0;
- }
2.移植stdio(部分代码展示)
- int printf(const char *fmt, ...)
- {
- int i;
- int len;
- va_list args;
- va_start(args, fmt);
- len = vsprintf(g_pcOutBuf,fmt,args);
- va_end(args);
- for (i = ; i < strlen(g_pcOutBuf); i++)
- {
- putc(g_pcOutBuf[i]);
- }
- return len;
- }
- int scanf(const char * fmt, ...)
- {
- int i = ;
- unsigned char c;
- va_list args;
- while()
- {
- c = getc();
- putc(c);
- if((c == 0x0d) || (c == 0x0a))
- {
- g_pcInBuf[i] = '\0';
- break;
- }
- else
- {
- g_pcInBuf[i++] = c;
- }
- }
- va_start(args,fmt);
- i = vsscanf(g_pcInBuf,fmt,args);
- va_end(args);
- return i;
- }
Makefile
- CC = arm-linux-gcc
- LD = arm-linux-ld
- OBJCOPY = arm-linux-objcopy
- OBJDUMP = arm-linux-objdump
- AR = arm-linux-ar
- INCDIR := $(shell pwd)
- # C预处理器的flag,flag就是编译器可选的选项
- CPPFLAGS := -nostdlib -nostdinc -I$(INCDIR)/include
- # C编译器的flag
- CFLAGS := -Wall -O2 -fno-builtin
- #导出这些变量到全局,其实就是给子文件夹下面的Makefile使用
- export CC LD OBJCOPY OBJDUMP AR CPPFLAGS CFLAGS
- objs := start.o led.o clock.o uart.o main.o
- objs += lib/libc.a
- uart.bin: $(objs)
- $(LD) -Tlink.lds -o uart.elf $^
- $(OBJCOPY) -O binary uart.elf uart.bin
- $(OBJDUMP) -D uart.elf > uart_elf.dis
- gcc mkv210_image.c -o mkx210
- ./mkx210 uart.bin .bin
- lib/libc.a:
- cd lib; make; cd ..
- %.o : %.S
- $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
- %.o : %.c
- $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c
- clean:
- rm *.o *.elf *.bin *.dis mkx210 -f
- cd lib; make clean; cd ..
X210串口配置与stdio移植的更多相关文章
- 小草手把手教你 LabVIEW 串口仪器控制——VISA 串口配置
建议大家按我发帖子的顺序来看,方便大家理解.请不要跳跃式的阅读.很多人现在看书,都跳跃式的看,选择性的看,导致有些细节的部分没有掌握到,然后又因为某个细节耽误很多时间.以上只是个人建议,高手可以略过本 ...
- Linux下串口配置初步探寻
一.在struct termios结构体中,对串口进行基本配置(如波特率设置,校验位和停止位设置 等). (一): struct termios //串口的设置主要是设置struct termio ...
- 【STM32】STM32串口配置的一般步骤(库函数)
STM32串口配置的一般步骤(库函数)(1)串口时钟使能:RCC_APBxPeriphClockCmd(); GPIO时钟使能:RCC_AHBxPeriphClockCmd();(2)引脚复用映 ...
- S5PV210_uart stdio移植
1.stdio : standard input output 标准输入输出 2.printf函数调用到的2个关键函数: vsprintf : 格式化打印信息,最终得到纯字符串的打印信息等待输出 pu ...
- STM32CubeMX的串口配置,以及驱动代码
1.STM32CubeMX的配置没啥子好说的,使能然后改一下波特率和字长,然后在将中断勾选,把中断等级调到1(一定要比systick的优先级垃圾!!!) 2.驱动代码 在生成的it.c文件中,例如用的 ...
- S5PV210 串口配置与实验(轮询方式)
S5PV210 UART 相关说明 通用异步收发器简称 UART, 即 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据.发送数据时, ...
- ZLG zigbee 虚拟串口配置
一.设置网关工作模式: 在ZNetCom Utility工具中,将设置网关工作模式为 Real COM 模式 启动 ZNetCom Utility 搜索设备 获得设备信息 修改工作模式为:real c ...
- SVN配置使用及移植
使用svn作为配置管理工具及其普遍的用于项目开发中,网上有很多关于svn的原理介绍及命令行管理教程.这里仅仅分享下个人配置及使用的过程,不通过命令行,可简单的上手操作.如有遗漏欢迎留言交流. 配置及使 ...
- STM32串口配置步骤
串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO 时钟使能2) 串口复位3) GPIO 端口模式设置4) 串口参数初始化5) 开启中断并且初始化 NVIC(如果需要开启中断才 ...
随机推荐
- Open MPI集群运行
部署完之后,代码也能正确跑起来了,也确实集群分散了.跑一下各种各样的代码,发现了一个错误: $ ~/OpenMpi/bin/mpiexec -np ~/NetWorkTest My rank is M ...
- 关于Filter中ServletRequest强转HttpServletRequest问题
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOE ...
- Automatic Judge
Description Welcome to HDU to take part in the second CCPC girls’ competition! A new automatic judge ...
- 计算器软件实现系列(七)WPF+SQL+策略模式
一 整体概述 本次设计主要是在WPF的页面中实现的,属于表现层的更换,数据库部分用的还是数据库的封装,其中引用了策略模式 二 设计思路 1 在出题页面,进行试题的编辑,在编辑后会自动保存到数据库中 ...
- C#操作Excel执行分类多条件汇总合并
之前发了一片模拟合并,详见模拟Excel同一列相同值的单元格合并 在之前的文章中介绍了思想,其中Excel采用的二维数组模拟,今天花了点时间,学习了一下C#操作Excel,实现了类似的效果! 准备 需 ...
- .getClass()和.class的区别
一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享. 原来为就是涉及到java的反射----- Java反射学习 所谓反射,可以 ...
- <Effective C++>读书摘要--Ctors、Dtors and Assignment Operators<二>
<Item 9> Never call virtual functions during construction or destruction 1.you shouldn't call ...
- MVC学习笔记:入门
1.controller/action action直接返回字符串,适用于不需要返回大量html的业务,类似一般处理程序. 如果需要返回大量html代码,需要返回view(); View文件夹中需添加 ...
- WIN8/8.1/10进入BIOS方法图解
1.首先点击桌面左下角的"开始". 2.然后点击电源. 3.然后按住shift,同时点击"重启".于是进入这个画面: 4.然后点击"疑难解答" ...
- mysql的my.cnf配置文件
[client]port = 3306default-character-set=utf8mb4socket = /var/run/mysqld/mysql.sock# user=david# pas ...