1. 程式人生 > >S5P6818學習(5)--------串列埠中斷髮送資料

S5P6818學習(5)--------串列埠中斷髮送資料

void beep_init(void)
{
	GPIOC.ALTFN0 &= ~(3<<28);
	GPIOC.ALTFN0 |= (1<<28);

	GPIOC.OUTENB |= (1<<14);
	GPIOC.OUT &= ~(1<<14);
}

void beep_open(void)
{
	GPIOC.OUT |= (1<<14);
}

void beep_change(void)
{
	GPIOC.OUT ^= (1<<14); // 0 ^ 1 = 1, 1 ^ 1 = 0
}

void beep_close(void)
{
	GPIOC.OUT &= ~(1<<14);
}

void DelayMs(unsigned int Time)
{
	unsigned int i,j;
	for(i=0;i<Time;i++)
		for(j=0;j<2000;j++);
}
void uart_init1()
{
	/*UART 引腳功能設定*/
	GPIOD.ALTFN0 &= ~(3 << 28);
	GPIOD.ALTFN0 |= (1 << 28);
	GPIOD.ALTFN1 &= ~(3 <<4);
	GPIOD.ALTFN1 |= (1 << 4);
	
	/*UART 通訊幀格式*/
	//1停止位,無校驗,8位長
	UART0.ULCON &= (0 <<0);
	UART0.ULCON |= (3 <<0);
	
	/*UART 波特率設定*/
	UART0.UBRDIV = 26;
	UART0.UFRACVAL = 2;
	
	/*UART 通訊模式設定*/
	UART0.UCON &= ~(0XF << 0); //輪訓或中斷模式
	UART0.UCON |=(5 <<0);
	//
	//UART0.UCON |= (1 << 0);
	UART0.UCON |= (7 << 7);		//禁用接收延時中斷
	UART0.UFCON |= (1 << 0);	//FIFO 開啟
	UART0.UFCON |= (3 << 1);	
	UART0.UFCON &= 0;			//FIFO禁用
	
	//遮蔽傳送中斷
	UART0.UINTM |= ~0;
	//UART0.UINTM &= ~(1 << 0);
	
	//中斷控制器設定(GIC設定)
	GICD_ISENABLER.ISENABLER1 &= (0<< 0);
	GICD_ISENABLER.ISENABLER1 |= (1 <<7);
	GICD_ITARGETSR.ITARGETSR9 &= (0 << 0);
	GICD_ITARGETSR.ITARGETSR9 |= (1 << 24);
	GICD_CTRL |= (1 << 0);
	GICC_CTRL |= (1 << 0);
	
	UART0.UINTP |= ~( 0);
}
char c;
int main()
{
	//串列埠歐總管初始化
	uart_init1();
	//蜂鳴器初始化
	beep_init();
	printf("---UINTM:%d---\n",UART0.UINTM);
	UART0.UINTM &= ~(1 << 0);
	c=0;
	while(1)
	{
		if(c!=0)
		{
			while((UART0.UTRSTAT & 4) ==0);
			
			UART0.UTXH= c;
			//UART0.UCON |= (1 << 2);
			//while((UART0.UTRSTAT & 4) ==0);
			//UART0.UTXH = '\n';
			c=0;
		}
	}
}

void do_irq()
{
	unsigned int irq_number=0;
	
	irq_number = 0x3ff & GICC_IAR;
	printf("-----UINTS:%d--UINTP:%d----------\n",(unsigned int)UART0.UINTS,UART0.UINTP);//打印出來中斷位
	
	switch(irq_number)
	{
		case 39:
			beep_open();
			printf("in irq");
			if(UART0.UINTP & 1)
			{
				//printf("in irq");
				c = UART0.URXH;
				printf("-----------%d------------\n",c);
			}
			break;
	}
	beep_close();
	GICC_EOIR |= (irq_number);
	UART0.UINTP |=1;
}

這個程式碼可實現板子從PC端接收資料,之後在將接收到的資料傳送回PC端。

出現的問題如下:

        1.一開始執行程式碼,會自動產生髮送中斷(板子自動向PC端傳送空格),儘管已經設定了傳送中斷的遮蔽碼。這種情況僅在程式碼剛開始執行時,出現一次,之後正常。

         2.晶片手冊上的UART  FIFO的暫存器沒有初始化為0,如果不手動禁用,在剛開始執行程式碼,會發送一串隨機數值(僅在剛開始啟動階段)

上面倆個問題還沒有解決