?? hms7202lib.c
字號:
#include "reg7202.h"
static int onemsLooptimes;
/****************************************************************/
/* set the Programmable Input /Output module (PIO) */
/****************************************************************/
void set_gpio_pin()
{
/****************************************************************/
/* set port a ***********/
/****************************************************************/
*(volatile unsigned short *)PioAmuxctl =0x0000;
*(volatile unsigned short *)PioAmuxsel =0x0000;
*(volatile unsigned short *)PioADDR =0xff00;//置位則設置為輸入口
*(volatile unsigned short *)PioADR =0xffff;//數據寄存器
*(volatile unsigned short *)PioAIM =0x0000;//置位則設置相應引腳為中斷源
*(volatile unsigned short *)PioAIS =0x0000;//無中斷
*(volatile unsigned short *)PioAIE =0x0000;//設置為電平觸發模式
*(volatile unsigned short *)PioAIC =0xffff;//清除中斷掛起位
*(volatile unsigned short *)PioAIP =0xffff;//低電平有效
/****************************************************************/
/* set port b ***********/
/****************************************************************/
*(volatile unsigned short *)PioBmuxctl =0x000;
*(volatile unsigned short *)PioBDDR =0x035;
*(volatile unsigned short *)PioBDR =0xfff;
*(volatile unsigned short *)PioBIM =0x000;
*(volatile unsigned short *)PioBIS =0x000;
*(volatile unsigned short *)PioBIE =0x000;
*(volatile unsigned short *)PioBIC =0xfff;
*(volatile unsigned short *)PioBIP =0xfff;
/****************************************************************/
/* set port c ***********/
/****************************************************************/
*(volatile unsigned short *)PioCmuxctl =0x000;
*(volatile unsigned short *)PioCDDR =0x084;
*(volatile unsigned short *)PioCDR =0x7ff;
*(volatile unsigned short *)PioCIM =0x000;
*(volatile unsigned short *)PioCIS =0x000;
*(volatile unsigned short *)PioCIE =0x000;
*(volatile unsigned short *)PioCIC =0x7ff;
*(volatile unsigned short *)PioCIP =0x7ff;
/****************************************************************/
/* set port d ***********/
/****************************************************************/
*(volatile unsigned short *)PioDmuxctl =0x000;
*(volatile unsigned short *)PioDDDR =0x000;
*(volatile unsigned short *)PioDDR =0x1ff;
*(volatile unsigned short *)PioDIM =0x000;
*(volatile unsigned short *)PioDIS =0x000;
*(volatile unsigned short *)PioDIE =0x000;
*(volatile unsigned short *)PioDIC =0x1ff;
*(volatile unsigned short *)PioDIP =0x1ff;
/****************************************************************/
/* set port e ***********/
/****************************************************************/
*(volatile unsigned *)PioEmuxctl =0x0fc0000;
*(volatile unsigned *)PioEDDR =0x01c0000;
*(volatile unsigned *)PioEDR =0x1ffffff;
*(volatile unsigned *)PioEIM =0x0000000;
*(volatile unsigned *)PioEIS =0x0000000;
*(volatile unsigned *)PioEIE =0x0000000;
*(volatile unsigned *)PioEIC =0x1ffffff;
*(volatile unsigned *)PioEIP =0x1ffffff;
*(volatile unsigned char *)PioSwap =0x0;
*(volatile unsigned char *)PioTictMDR =0x0;
}
#define _outw(addr, data) ((*(volatile int *)(addr)) = (data))
#define _inw(addr) (*(volatile int *)(addr))
#define _inb(addr) *(volatile char *)(addr)
#define _outb(addr, data) *(volatile char *)(addr) = data
static void pll_init()
{
int val;
val = _inw(PmuClkCtl);
// _outw(PmuClkCtl, val | PmuPLL1En | PmuPLL2En );
_outw(PmuClkCtl, val | PmuPLL1En | PmuPLL2En | PmuPLL3Mute);
// for(val=0; val< 0xf0000;val++); // delay
}
/* Register Offset */
#define SERIAL_THR 0
#define SERIAL_RBR 0
#define SERIAL_DLL 0
#define SERIAL_DLM 0x04
#define SERIAL_IER 0x04
#define SERIAL_IIR 0x08
#define SERIAL_FCR 0x08
#define SERIAL_LCR 0x0C
#define SERIAL_MCR 0x10
#define SERIAL_LSR 0x14
#define SERIAL_MSR 0x18
#define SERIAL_SCR 0x1c
#define SERIAL_BASE (0x80020000) // Uart0
#define DEBUG_PORT_LEVEL 8
typedef enum {
tty_baud1200,
tty_baud2400,
tty_baud4800,
tty_baud9600,
tty_baud19200,
tty_baud38400,
tty_baud57600,
tty_baud115200,
tty_baud230400
} tty_baud_t;
int baud_data[] = {
192, // tty_baud1200
96, // tty_baud2400
48, // tty_baud4800
24, // tty_baud9600
12, // tty_baud19200
6, // tty_baud38400
4, // tty_baud57600
2, // tty_baud115200
1 // tty_baud230400
};
typedef enum {TEXT_MODE, BINARY_MODE } ser_mode_t;
static int ser_opened = 0;
static ser_mode_t ser_mode = TEXT_MODE;
static unsigned int ser_base = SERIAL_BASE;
static unsigned int ser_level = DEBUG_PORT_LEVEL;
static tty_baud_t cur_baud = tty_baud57600;
unsigned char serial_inb(int offset)
{
unsigned char ch= _inb(ser_base + offset);
return ch;
}
int ser_open()
{
if(ser_opened) return 0;
ser_base = SERIAL_BASE;//0x80020000 Uart0
ser_level = DEBUG_PORT_LEVEL;//0x8
cur_baud = tty_baud57600;
_outb(ser_base+0x30,1);//使能UART0
_outw(0x8002301c, 0xffff9f9f);
_outw(0x800230A4, 0x6060);//PA14:USOUT3,PA13:USIN3,PA6:USOUT2,PA5:USIN2
_outb(ser_base+SERIAL_LCR,0x80);//置位 DLAB
_outb(ser_base+SERIAL_DLL,baud_data[cur_baud]);
_outb(ser_base+SERIAL_DLM,0x0);//設置波特率.DLL=4,即波特率=57600
_outb(ser_base+SERIAL_LCR,0x03);//DLAB 清0,8位字長,1_stop,無奇偶校驗
_outb(ser_base+SERIAL_FCR,0x01);//使能FIFO
_outb(ser_base+SERIAL_IER,0x00);//禁止UART中斷
_outb(ser_base+SERIAL_MCR,0x03);//使NRTS和NDTR信號輸出為0,nUDTR和nURTS信號輸出為0
//即UART已準備好接收和發送
ser_opened = 1;
return 1;
}
void ser_close()
{
ser_opened = 0;
}
#include <string.h>
#include <stdarg.h>
char ser_getchar()
{
char ch;
int lsr;
if(ser_opened == 0)
return -1;
do {
lsr = (int) serial_inb(SERIAL_LSR);
}while( (lsr&0x1) != 0x1);
ch = serial_inb(SERIAL_RBR);
return ch;
}
static int pseqno = 0;
void ser_putchar(char ch)
{
int lsr;
if(ser_opened == 0)
return;
pseqno = 0;
do {
lsr = serial_inb(SERIAL_LSR);
}while( (lsr&0x60) != 0x60);
_outb(ser_base+SERIAL_THR,ch);
if(ser_mode == TEXT_MODE && ch == '\n')
_outb(ser_base+SERIAL_THR,'\r');
}
int ser_printf(const char *format, ...)
{
char buff[256];
int chars, i;
va_list ap;
va_start(ap, format);
chars = vsprintf(buff, format, ap);
va_end(ap);
i = 0;
while (buff[i])
ser_putchar(buff[i++]);
return 0;
}
void system_init(void)
{
set_gpio_pin();
pll_init();
ser_open();
ser_printf("\nHMS30C7202系統初始化完畢\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -