示例#1
0
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;
}
示例#2
0
文件: bluetooth.c 项目: longtek/ZYP
void RxIRQStart(void)
{
    EnableIrq(BIT_UART2);
    EnableSubIrq(BIT_SUB_RXD2);
    ClearPending(BIT_UART2);
    rSUBSRCPND=BIT_SUB_RXD2;
    pISR_UART2=(U32)RxAndTxIRQ;
}
示例#3
0
/*************************************************
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);
   		  
   
}
示例#4
0
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);
	}
}
示例#5
0
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);
}
示例#6
0
文件: key.c 项目: uKingSky/KingSky
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);	
}
示例#7
0
文件: keyscan.c 项目: joemilu/pump
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);	
}
示例#8
0
/********************************************************************
// 语法格式: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");

}
示例#9
0
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);
}