⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hms7202lib.c

📁 基于ARM核的HMS7202
💻 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 + -