uint16_t FillTxBuffer(const uint8_t *buffer, uint16_t count) { uint8_t irqEnabled = __get_PRIMASK() == 0; HAL_StatusTypeDef st; uint16_t free, freestart, tocopy, copied = 0; UNUSED(st); __disable_irq(); freestart = g_txStart + g_txCount; free = g_size - g_txCount; EnableIrq(irqEnabled); freestart -= (freestart >= g_size) ? g_size : 0; if(count > free) count = free; tocopy = freestart + count > g_size ? g_size - freestart : count; memcpy(g_buffer + freestart, buffer, tocopy); __disable_irq(); if(!g_txCount) { EnableIrq(irqEnabled); g_chunkSize = tocopy; st = HAL_UART_Transmit_IT(g_huart, g_buffer + freestart, tocopy); } copied = tocopy; count -= tocopy; __disable_irq(); g_txCount += tocopy; EnableIrq(irqEnabled); if(!count) return copied; buffer += tocopy; memcpy(g_buffer, buffer, count); uint8_t schedule; __disable_irq(); schedule = !g_txCount; g_txCount += count; EnableIrq(irqEnabled); if(schedule) // unlikely corner case st = HAL_UART_Transmit_IT(g_huart, g_buffer, count); return copied + count; }
void RxIRQStart(void) { EnableIrq(BIT_UART2); EnableSubIrq(BIT_SUB_RXD2); ClearPending(BIT_UART2); rSUBSRCPND=BIT_SUB_RXD2; pISR_UART2=(U32)RxAndTxIRQ; }
/************************************************* Function name: key_init() Parameter : void Description : key的初始化函数,其中K1连接的是GPG0 初始化GPG0为输入模式 Return : void Argument : void Autor & date : Daniel **************************************************/ void key_init(void) /*为什么这个函数没有被调用?*/ { rGPGCON &= ~(3<<0); //input mode rGPGCON |= (0x2<<0); //? rEXTINT1 &= ~(0xf<<0); //设置,EINT8 LowLevel产生中断,过滤器关闭 rEINTPEND |= (1<<8); //清除EINT8产生的中断 rEINTMASK &= ~(1<<8); //允许EINT8中断 //设置ISR pISR_EINT8_23 =(U32)key_handler; EnableIrq(BIT_EINT8_23); }
void Pit::SetIsr(const OnPitTriggerListener &isr) { m_isr = isr; if (m_isr) { ::SetIsr(EnumAdvance(PIT0_IRQn, m_channel), IrqHandler); SET_BIT(PIT->CHANNEL[m_channel].TCTRL, PIT_TCTRL_TIE_SHIFT); EnableIrq(EnumAdvance(PIT0_IRQn, m_channel)); } else { DisableIrq(EnumAdvance(PIT0_IRQn, m_channel)); ::SetIsr(EnumAdvance(PIT0_IRQn, m_channel), nullptr); CLEAR_BIT(PIT->CHANNEL[m_channel].TCTRL, PIT_TCTRL_TIE_SHIFT); } }
static void init_iic_op(void) { rCLKCON |= 1<<16; rGPEUP |= 0xc000; //Pull-up disable rGPECON &= ~0xf0000000; rGPECON |= 0xa0000000; //GPE15:IICSDA , GPE14:IICSCL //Enable ACK, Prescaler IICCLK=PCLK/16, Enable interrupt, Transmit clock value Tx clock=IICCLK/16 // If PCLK 50.7MHz, IICCLK = 3.17MHz, Tx Clock = 0.198MHz //rIICCON = (1<<7) | (1<<6) | (1<<5) | (0); //IICCLK=PCLK/512=97K //just read one byte, don't enable ack! rIICCON = (0<<7) | (1<<6) | (1<<5) | (0); //IICCLK=PCLK/512=97K rIICSTAT = 0x10; //IIC bus data output enable(Rx/Tx) rIICADD = 0x10; //2410 slave address = [7:1] pISR_IIC = (unsigned)IicInt; EnableIrq(BIT_IIC); }
void KeyScan_Test1(void) { Uart_Printf("\nKey Scan Test, press ESC key to exit !\n"); rGPGCON = rGPGCON & (~((3<<22)|(3<<6))) | ((2<<22)|(2<<6)) ; //GPG11,3 set EINT rGPFCON = rGPFCON & (~((3<<4)|(3<<0))) | ((2<<4)|(2<<0)) ; //GPF2,0 set EINT rEXTINT0 &= ~(7|(7<<8)); rEXTINT0 |= (0|(0<<8)); //set eint0,2 falling edge int rEXTINT1 &= ~(7<<12); rEXTINT1 |= (0<<12); //set eint11 falling edge int rEXTINT2 &= ~(0xf<<12); rEXTINT2 |= (0<<12); //set eint19 falling edge int rEINTPEND |= (1<<11)|(1<<19); //clear eint 11,19 rEINTMASK &= ~((1<<11)|(1<<19)); //enable eint11,19 ClearPending(BIT_EINT0|BIT_EINT2|BIT_EINT8_23); pISR_EINT0 = pISR_EINT2 = pISR_EINT8_23 = (U32)Key_ISR1; EnableIrq(BIT_EINT0|BIT_EINT2|BIT_EINT8_23); }
void KeyScan_Test(void) { Uart_Printf("\nKey Scan Test, press ESC key to exit !\n"); rGPBUP = rGPBUP & ~0x03f0|0x03f0; // LED [8:5] => PU En rGPBCON = rGPBCON & ~0x3d57fc|0x3d57fc; //LED[8:5] => OUTPUT; rGPFCON = rGPFCON & (~((3<<4)|(3<<0)|(3<<8)|(3<<2))) | ((2<<4)|(2<<0)|(2<<8)|(2<<2)) ; //GPF4,2,1,0 set EINT rEXTINT0 &= ~(7|(7<<4)|(7<<8)|(7<<16)); rEXTINT0 |= (0|(0<<4)|(0<<8)|(0<<16)); //set eint0,1,2,4 falling edge int rEINTPEND |= (1<<4); //clear eint 4 rEINTMASK &= ~(1<<4); //enable eint 4 ClearPending(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7); pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR; EnableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7); while( Uart_GetKey() != ESC_KEY ) ; DisableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7); }
/******************************************************************** // 语法格式:void DMA_M2M(int ch,int srcAddr,int dstAddr,int tc,int dsz,int burst) // 功能描述: DMA方式内存拷贝 // 入口参数: // : int ch:DMA通道 0-DMA0, 1-DMA1, 2-DMA2, 3-DMA3 // : int srcAddr:源地址 // : int dstAddr:目的地址 // : int tc:初始传输计数值 // : int dsz:传输数据宽度 0:1字节 1:2字节 2:4字节 // : int burst:自动传输的传输宽度 0-单元传输(一个字节) 1-突发模式传输(四个字节) // 出口参数: 无 *********************************************************************/ void DMA_M2M(int ch,int srcAddr,int dstAddr,int tc,int dsz,int burst) { int i,time; volatile U32 memSum0=0,memSum1=0; DMA *pDMA; int length; length=tc*(burst ? 4:1)*((dsz==0)+(dsz==1)*2+(dsz==2)*4); //确定一次传输的字节数( 传输单元模式 * 传输数据宽度 ) Uart_Printf("[DMA%d MEM2MEM Test]\n",ch); switch(ch) { case 0: pISR_DMA0 = (unsigned)Dma0Done; EnableIrq(BIT_DMA0); //open DMA0 INTERRUPT pDMA=(void *)0x4b000000; break; case 1: pISR_DMA1 = (unsigned)Dma1Done; EnableIrq(BIT_DMA1); //open DMA1 INTERRUPT pDMA=(void *)0x4b000040; break; case 2: pISR_DMA2 = (unsigned)Dma2Done; EnableIrq(BIT_DMA2); //open DMA2 INTERRUPT pDMA=(void *)0x4b000080; break; case 3: pISR_DMA3 = (unsigned)Dma3Done; EnableIrq(BIT_DMA3); //open DMA3 INTERRUPT pDMA=(void *)0x4b0000c0; break; } Uart_Printf("DMA%d %8xh->%8xh,size=%xh(tc=%xh),dsz=%d,burst=%d\n",ch, srcAddr,dstAddr,length,tc,dsz,burst); Uart_Printf("Initialize the src.\n"); for(i=srcAddr;i<(srcAddr+length);i+=4) { *((U32 *)i)=i^0x55aa5aa5; //向源地址写入任意数据 写入长度为length memSum0+=i^0x55aa5aa5; //将写入数据累加,为校验读出数据的准确性 } Uart_Printf("DMA%d start\n",ch); dmaDone=0; pDMA->DISRC=srcAddr; //设置源地址 pDMA->DISRCC=(0<<1)|(0<<0); //设置源控制寄存器 inc,AHB pDMA->DIDST=dstAddr; //设置目的地址 pDMA->DIDSTC=(0<<1)|(0<<0); //设置目的控制寄存器 inc,AHB pDMA->DCON=(1<<31)|(1<<30)|(1<<29)|(burst<<28)|(1<<27)| (0<<23)|(1<<22)|(dsz<<20)|(tc); //DMA控制寄存器 HS,AHB sync,enable interrupt,whole, SW request mode,relaod off pDMA->DMASKTRIG=(1<<1)|1; //DMA on, SW_TRIG Timer_Start(3);//128us resolution while(dmaDone==0); time=Timer_Stop(); Uart_Printf("DMA transfer done.\n"); Uart_Printf("time = %u MS\n", time*128/1000); DisableIrq(BIT_DMA0); DisableIrq(BIT_DMA1); DisableIrq(BIT_DMA2); DisableIrq(BIT_DMA3); for(i=dstAddr;i<dstAddr+length;i+=4) { memSum1+=*((U32 *)i)=i^0x55aa5aa5; } Uart_Printf("\n memSum0=%x,memSum1=%x\n",memSum0,memSum1); if(memSum0==memSum1) Uart_Printf("DMA test result--------------------------------------O.K.\n"); else Uart_Printf("DMA test result--------------------------------------ERROR!!!\n"); }
void comdownload(void) { ULONG size; UCHAR *buf; USHORT checksum; puts("\nNow download file from uart0...\n"); downloadAddress = _NONCACHE_STARTADDRESS; buf = (UCHAR *)downloadAddress; temp = buf-4; Uart_GetKey(); #ifdef USE_UART_INT pISR_UART0 = (ULONG)Uart0RxInt; //串口接收数据中断 ClearSubPending(BIT_SUB_RXD0); ClearPending(BIT_UART0); EnableSubIrq(BIT_SUB_RXD0); EnableIrq(BIT_UART0); #endif while((ULONG)temp<(ULONG)buf) { #ifdef USE_UART_INT Led_Display(0); Delay(1000); Led_Display(15); Delay(1000); #else *temp++ = Uart_Getch(); #endif } //接收文件长度,4 bytes size = *(ULONG *)(buf-4); downloadFileSize = size-6; #ifdef USE_UART_INT printf("Download File Size = %d\n", size); #endif while(((ULONG)temp-(ULONG)buf)<(size-4)) { #ifdef USE_UART_INT Led_Display(0); Delay(1000); Led_Display(15); Delay(1000); #else *temp++ = Uart_Getch(); #endif } #ifdef USE_UART_INT DisableSubIrq(BIT_SUB_RXD0); DisableIrq(BIT_UART0); #endif #ifndef USE_UART_INT printf("Download File Size = %d\n", size); #endif checksum = 0; for(size=0; size<downloadFileSize; size++) checksum += buf[size]; if(checksum!=(buf[size]|(buf[size+1]<<8))) { puts("Checksum fail!\n"); return; } puts("Are you sure to run? [y/n]\n"); while(1) { UCHAR key = getch(); if(key=='n') return; if(key=='y') break; } call_linux(0, 193, downloadAddress); }