S5P6818學習(5)--------串列埠中斷髮送資料
阿新 • • 發佈:2018-12-09
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,如果不手動禁用,在剛開始執行程式碼,會發送一串隨機數值(僅在剛開始啟動階段)
上面倆個問題還沒有解決