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<<0);//將 bit0~7清零rGPA0CON|=0x22; //設置 _0 _1引腳為RX TX//串口相關寄存器rULCON0=0x3;rUCON0=0x5;rUMCON0=0;rUFCON0=0;//波特率計算相關/* //9600rUBRDIV0=433;rUDIVSLOT0=0x2222;*///用66.7MHZ算 //115200//66700000/(115200*16)-1rUBRDIV0=35;// rUBRDIV0余數*16 然后查表rUDIVSLOT0=0x0888; } //串口發送一字節 void uart_putc(char c) { while(!(rUTRSTAT0&(1<<1)));//等待發送結束rUTXH0=c; } char uart_getc() {while(!(rUTRSTAT0&(1<<0)));//等待發送結束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 = 0; i < strlen(g_pcOutBuf); i++){putc(g_pcOutBuf[i]);}return len; }int scanf(const char * fmt, ...) {int i = 0;unsigned char c;va_list args;while(1){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-arINCDIR := $(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 CFLAGSobjs := start.o led.o clock.o uart.o main.o objs += lib/libc.auart.bin: $(objs)$(LD) -Tlink.lds -o uart.elf $^$(OBJCOPY) -O binary uart.elf uart.bin$(OBJDUMP) -D uart.elf > uart_elf.disgcc mkv210_image.c -o mkx210./mkx210 uart.bin 210.binlib/libc.a:cd lib; make; cd ..%.o : %.S$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -c%.o : %.c$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ $< -cclean:rm *.o *.elf *.bin *.dis mkx210 -fcd lib; make clean; cd ..?
轉載于:https://www.cnblogs.com/PengfeiSong/p/6352816.html
總結
以上是生活随笔為你收集整理的X210串口配置与stdio移植的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东白条支付是什么意思
- 下一篇: 《暗黑破坏神3》国服武僧详细教学攻略