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

📄 hms7202lib.c

📁 基于HMS7202的波形发生器源程序
💻 C
字号:
 #include "reg7202.h"
 #include "utils.h"
 #include "ddscommand.h"


 static int ser0_open();
 static int ser1_open();
 static unsigned char serial0_inb(int);
 static unsigned char serial1_inb(int);
 static void interrupt_init();
 static void keyboard_init();
 static void lcd_init();
 static void pll_init();
 static void ser0_close();
 static void ser1_close();
 static void set_gpio_pin();
 static void ser0_putchar(char);
 static void ser1_putchar(char);

 int f_nDelayLoopCount;
/****************************************************************/
/*   set the Programmable Input /Output module (PIO)	*/
/****************************************************************/
 static 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                              ***********/
/****************************************************************/
/****************************************************************
 PE0  PE1  PE2  PE3  PE4  PE5  PE6  PE7  PE8  PE9  PE10 PE11 PE12
 RD16 RD17 RD18 RD19 RD20 RD21 RD22 RD23 RD24 RD25 RD26 RD27 RD28
 
 PE13 PE14 PE15 PE16 PE17 PE18 PE19 PE20 PE21 PE22 PE23 PE24
 RD29 RD30 RD31 nRW2 nRW3 SSDI ZERO SSDO      pul1 pul2 RA24*/
 /*PE22 PE23作为旋钮中段信号输入线,上升沿有效*/ 

 *(volatile unsigned *)PioEmuxctl =0x0c00000;
 *(volatile unsigned *)PioEDDR    =0x0c00000;
 *(volatile unsigned *)PioEDR     =0x0000000;
 *(volatile unsigned *)PioEIM     =0x0c00000;
 *(volatile unsigned *)PioEIS     =0x0000000;
 *(volatile unsigned *)PioEIE     =0x0c00000;
 *(volatile unsigned *)PioEIC     =0x1ffffff;
 *(volatile unsigned *)PioEIP     =0x13fffff;
 *(volatile unsigned char *)PioSwap    =0x0;

 *(volatile unsigned char *)PioTictMDR =0x0;

 }



 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 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 ser0_opened = 0;
 static int ser1_opened = 0;
 static ser_mode_t ser_mode = TEXT_MODE;
 static unsigned int ser_base = UART0_BASE;
 static unsigned int ser_level = DEBUG_PORT_LEVEL;
 static tty_baud_t cur_baud = tty_baud38400;

 static unsigned char serial0_inb(int offset)
 {
	unsigned char ch= _inb(UART0_BASE + offset);
	return ch;
 }
 
  static unsigned char serial1_inb(int offset)
 {
	unsigned char ch= _inb(UART1_BASE + offset);
	return ch;
 }

 static int ser0_open()
 {
	if(ser0_opened) return 0;

	ser_base = UART0_BASE;//0x80020000 Uart0
	ser_level = DEBUG_PORT_LEVEL;//0x8
	cur_baud = tty_baud38400;


	_outb(ser_base+0x30,1);//使能UART0
	_outw(0x8002301c, 0x0);
	_outw(0x800230A4, 0x0);//

	_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已准备好接收和发送

	ser0_opened = 1;
	return 1;
 }
 
 static int ser1_open()
 {
	if(ser1_opened) return 0;

	ser_base = UART1_BASE;//0x80021000 Uart1
	ser_level = DEBUG_PORT_LEVEL;//0x8
	cur_baud = tty_baud38400;


	_outb(ser_base+0x30,1);//使能UART1
	_outw(0x8002301c, 0x0);//AEn=0,KSCANI/O
	_outw(0x800230A4, 0x0);//AMULSEL=0,GPIO

	_outb(ser_base+SERIAL_LCR,0x80);//置位 DLAB 
	
	_outb(ser_base+SERIAL_DLL,baud_data[cur_baud]);
	_outb(ser_base+SERIAL_DLM,0x0);//设置波特率.DLL=4,即波特率=38400
	_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已准备好接收和发送

	ser1_opened = 1;
	return 1;
 }

 static void ser0_close()
 {
	ser0_opened = 0;
 }
 
  static void ser1_close()
 {
	ser1_opened = 0;
 }



 #include <string.h>
 #include <stdarg.h>

 char ser0_getchar()
 {
	char ch;
	int lsr;
	if(ser0_opened == 0)
		return -1;

	do {
		lsr = (int) serial0_inb(SERIAL_LSR);
	}while( (lsr&0x1) != 0x1);

	ch = serial0_inb(SERIAL_RBR);
	return ch;
 }


 static void ser0_putchar(char ch)
 {
	int lsr;

	if(ser0_opened == 0)
		return;

	do {
		lsr = serial0_inb(SERIAL_LSR);
	}while( (lsr&0x60) != 0x60);
	_outb(UART0_BASE+SERIAL_THR,ch);
	if(ser_mode == TEXT_MODE && ch == '\n')
		_outb(UART0_BASE+SERIAL_THR,'\r');
 }
 
 static void ser1_putchar(char ch)
 {
	int lsr;

	if(ser1_opened == 0)
		return;

	do {
		lsr = serial1_inb(SERIAL_LSR);
	}while( (lsr&0x60) != 0x60);
	_outb(UART1_BASE+SERIAL_THR,ch);
 }
 
 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])
		ser0_putchar(buff[i++]);

    return 0;
 }
 
 void delay(int nTime)
 {
	int nAdjust;
	int i;

	nAdjust = 0;

	if(nTime == 0)
	{
		nTime = 200;
		nAdjust = 1;
		f_nDelayLoopCount = 400;
		//rWTCON = ((MCLK/1000000-1)<<8)|(2<<3);			// 1M/64, Watch-dog, nRESET, interrupt disable
		*((volatile char *)TM0_CTRL) = 0x4;//stop count,reset counter register
		*((int *)TM0_BASE) = 0xffffffff;//溢出值设为最大
		*((volatile char *)TM0_CTRL) = 0x1;//开始计数
	}

	for(; nTime>0; nTime--)
	{
		for(i=0; i<f_nDelayLoopCount; i++)
			;
	}

	if(nAdjust==1)
	{
		*((volatile char *)TM0_CTRL) = 0x0;//停止计数
		i =*((volatile int *)TM0_COUNT);//读取计数值
		f_nDelayLoopCount = 3686400*8/i;
	}
 }

 static void interrupt_init(void)
 {
    /*
    add interrupt init code here;
    */
 }

 static void keyboard_init(void)
 {
	//设置PORTA管脚功能
  *(volatile unsigned short *)PioAmuxctl =0x0000;
  *(volatile unsigned short *)PioAmuxsel =0x0000;
  *(volatile unsigned short *)PioADDR    =0xff00;//置位则设置为输入口
  //将中断服务程序入口地址放入中断向量寄存器中
  //pISR_KBD = (unsigned int)Key_IsrCode;
  //开键盘中断
  //*(volatile unsigned int *)IntEnR |= 0x1000;
  //设置扫描频率
  *(volatile unsigned char*)KBCr &= 0xfc;
  *(volatile unsigned char*)KBCr |=0x03;
  //开始键盘扫描
  *(volatile unsigned char*)KBCr |= (KbScnStart + KbPwrUp);
 }
 
 static void lcd_init(void)
 {
	/*
	add lcd display init code here;
	*/
 }
 void system_init(void)
 {
    set_gpio_pin();
    
   	pll_init();
   	
   	delay(0);
   	
   	interrupt_init();
   	
   	ser0_open();
   	ser1_open();
   	
   	keyboard_init();
   	
   	lcd_init();
 }

 void FrameHead_Send(FRAME_HEAD_t * p)
 {
    int i;
    ser1_putchar(0x7f);
    ser1_putchar(0xfe);
    ser1_putchar(p->m_WWaveType);
    ser1_putchar(p->m_WDataLen & 0xff);
    ser1_putchar(p->m_WDataLen>>8 & 0xff);
    ser1_putchar(p->m_WFrameCount);
    ser1_putchar(p->m_WFrameIndex);
    ser1_putchar(p->m_WFreMode);
    
    for(i=0;i<6;i++) ser1_putchar(p->m_WFrequency[i]);
 }

 void FrameData_Send(char *p, int size)
 {
	int i;
	for(i=0;i<size;i++)
	 ser1_putchar(*p++);
 }

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -