//---------------------------------------------------- //Copyright (C), 2004-2009, lst. //版权所有 (C), 2004-2009, lst. //所属模块: 原始输入输出 //作者:lst //版本:V1.0.0 //文件描述: 标准输入输出口需要使用操作系统功能,本文件提供一个在初始化完成之前的 // 最基本的输入输出功能。本模块在系统启动前、钩子函数调用后即被初始化, // 可在启动前使用来作为原始的输入输出,但不可以在安全钩子程序中使用。 //其他说明: //修订历史: //1. 日期:2009-07-22 // 作者:lst // 新版本号:1.0.0 // 修改说明: 原始版本 //------------------------------------------------------ #include <string.h> #include "inc_os.h" #include "uart.h" #include "sysctl.h" #include "gpio.h" #include "nude_io.h" static volatile struct uart_reg *pg_uart0_reg = (struct uart_reg *)0x7f005000; uint8_t scan_byte_nude(void) { uint32_t fifo_reg; for(;;) { fifo_reg = pg_uart0_reg->UFSTAT; if((fifo_reg & 0x3f) != 0) return pg_uart0_reg->URXH; } } bool_t read_byte_nude(uint8_t *byte) { uint32_t fifo_reg; fifo_reg = pg_uart0_reg->UFSTAT; if((fifo_reg & 0x3f) != 0) { *byte = pg_uart0_reg->URXH; return true; }else return false; } void printf_byte_nude(uint8_t byte) { uint32_t fifo_reg; for(;;) { fifo_reg = pg_uart0_reg->UFSTAT; if(((fifo_reg>>8) & 0x3f) < 0x3f) { pg_uart0_reg->UTXH = byte; return ; } } } void printf_str_nude(uint8_t *str) { uint32_t i=0; while(str[i] != 0) { printf_byte_nude(str[i]); i++; } } void printf_hex_nude(uint32_t hex,uint32_t size) { uint8_t uni; if((size < 1 )|| (size >8)) return ; for(;size > 0; size--) { uni = (hex >>(size*4-4))&0xf; if(uni < 10) printf_byte_nude(uni+0x30); else printf_byte_nude(uni+0x37); } } bool_t nude_terminal_init(void) { uint32_t temp; //初始化IO端口位uart功能 //Ports : GPA10 GPA9 GPA8 GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0 //Signal : xx xx xx xx xx xx xx xx xx TXD0 RXD0 //Binary : xx xx xx xx xx xx xx xx xx 0010 0010 temp = pg_gpio_reg->GPACON; temp &= ~0xff; temp |= 0x22; pg_gpio_reg->GPACON = temp; pg_gpio_reg->GPAUP &= ~0xf; // The pull u/d function is disabled GPA[1:0] pg_gpio_reg->GPACONSLP |= 0xf; // keep GPA[1:0] Previous state when sleep pg_gpio_reg->GPAUPSLP &= ~0xf; // disabled pull u/d GPA[1:0] when sleep //select mclk as clk source of uartclk ,但不知这个时钟是用来干什么的, //不是用来产生baud,手册也没讲 pg_syscon_reg->CLK_SRC |= 0x2000; temp = pg_syscon_reg->CLK_DIV2; temp &= 0xfff0ffff; temp |= 0x00010000; pg_syscon_reg->CLK_DIV2 = temp; //uartclk = mclk/2 pg_uart0_reg->ULCON = 0x3; pg_uart0_reg->UCON = 0x805; pg_uart0_reg->UFCON = 0x57; //bit0=1使能fifo. pg_uart0_reg->UMCON = 0x0; pg_uart0_reg->UBRDIV = ((cn_pclk<<2)/115200 -32)>>6; pg_uart0_reg->UDIVSLOT = 0x0080; //微调baud,正式版本中,此值需要计算。 return true; }


Created by 2beanet Embedded Group : http://www.2beanet.com