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

📄 main.c

📁 ZLG的EASYARM8962开发板Keil实验例程
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (UARTSpaceAvail(UART0_BASE)) {                               /*  判断FIFO是否有可用空间      */
		
		    UARTCharNonBlockingPut(UART0_BASE, *Buffer++);              /*  发送一个字符到存储位置      */
		    NByte--;
		}
	}
}

/*********************************************************************************************************
** Function name:     main
** Descriptions:      主函数:初始化操作系统,创建卡操作任务和启动操作系统。
** input parameters:  无
** output parameters: 无
** Returned value:    0
*********************************************************************************************************/
int main (void)
{
    intDisAll();                                                        /*  关闭所有中断                */

    OSInit();                                                           /*  初始化uC/OS-II的内核        */

    OSTaskCreate ( Task_Card,                                           /*  创建卡操作任务              */
		           (void *)0, 
				   &Task_CardStk[TASK_CARD_STK_SIZE - 1], 
				   TASK_CARD_PRIO );
				     

    OSStart();                                                          /*  启动uC/OS-II                */

    return(0);
}

/*********************************************************************************************************
** Function name:     Task_Card
** Descriptions:      对SD卡进行操作
** input parameters:  *p_arg
** output parameters: 无
** Returned value:    无
*********************************************************************************************************/
static  void  Task_Card (void  *p_arg)
{
  	uint8  *pRec;
    uint8  err;
	uint32 bufaddr, blockaddr, blocknum; 

    (void)p_arg;

	Uart0ReviceMbox = OSMboxCreate(NULL);                               /*  建立邮箱                    */
    if (Uart0ReviceMbox == NULL) {                                      /*  判断邮箱是否建立成功        */
        while (1) {
		    ;
		}
	 }
    targetInit();                                                       /*  初始化目标单片机            */

#if OS_TASK_STAT_EN > 0
    OSStatInit();                                                       /*  使能统计功能                */
#endif

																		
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);						/*  使能GPIOA                   */
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);               			/*  使能GPIOE                   */
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);						/*  使能GPIOG                   */

	GPIO_SET();															/*  配置GPIO口                  */
																		/*  初始化串口                  */
	uart0init(115200, 3);
			        
	SSIInit();                                                          /*  SSI初始化                   */

	while (1) {  
     	pRec = (uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err);           /*  接收数据                    */
        switch(pRec[0]) {
		case CMD_SD_INIT: pRec[1] = SD_Initialize();		   		    /*  初始化卡                    */
		    break; 
		
		case CMD_SD_READ:
			blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +	            /*  计算块地址                  */
						(pRec[3] << 8) + pRec[4];
			pRec[1] = SD_ReadBlock(blockaddr, sd_buf);		 	        /*  卡单块读                    */ 			
		    break;
		 	    		
		case CMD_SD_WRITE:	 
			blockaddr = (pRec[1] << 24) + (pRec[2] << 16) + 		    /*  计算块地址                  */
						(pRec[3] << 8) + pRec[4];
			pRec[1] = SD_WriteBlock(blockaddr, sd_buf);		            /*  卡单块写                    */
		    break;
			
		case CMD_SD_ERASE:	 
			blockaddr = (pRec[1] << 24) + (pRec[2] << 16) + 
					    (pRec[3] << 8) + pRec[4];				        /*  擦卡起始地址                */
			blocknum  = (pRec[5] << 16) + (pRec[6] << 8) +	
				 	    (pRec[7]);								        /*  块数                        */
			pRec[1] = SD_EraseBlock(blockaddr, blocknum);		        /*  擦除操作                    */
		    break;
		
		case CMD_DATA_RECV:	 
			bufaddr = (pRec[1] << 8) + pRec[2];				            /*  计算缓冲区地址              */
			memcpy(sd_buf + bufaddr, &pRec[3], 5);				        /*  收到数据放入pRec            */
		    break;
			
		case CMD_DATA_TRANS: 
			bufaddr = (pRec[1] << 8) + pRec[2];				            /*  计算缓冲区地址              */ 
			memcpy(&pRec[1], sd_buf + bufaddr, 7);				        /*  sd_buf数据放入pRec          */
		    break;  							
	
		default: 
		    break;
    	}
    	
    	uart0send(pRec, 8);		                                        /*  发送响应帧                  */
    }
}
/*********************************************************************************************************
** Function name:     uart0_ISR
** Descriptions:      串口中断函数,通过接收中断将接收到的数据以消息邮箱的形式发送出去。
** input parameters:  无
** output parameters: 无
** Returned value:    无
*********************************************************************************************************/
void uart0_ISR(void)
{
	unsigned long ulStatus;
	static char Buf[8];
	INT8U i = 0;
	
	#if OS_CRITICAL_METHOD == 3
	OS_CPU_SR  cpu_sr;
	#endif 
	
	OS_ENTER_CRITICAL();                                                /*  关中断                      */
	OSIntNesting++;                                                     /*  操作系统中断嵌套层数加1     */
	OS_EXIT_CRITICAL();                                                 /*  开中断                      */
	
	ulStatus = UARTIntStatus(UART0_BASE, true);                         /*  读取已使能的串口0中断状态   */
	UARTIntClear(UART0_BASE, ulStatus);                                 /*  清除当前的串口0中断         */
	
	if ((ulStatus & UART_INT_RX) || (ulStatus & UART_INT_RT)) {         /*  判断是否有接收中断	        */
		while (UARTCharsAvail(UART0_BASE)) {                            /*  判断FIFO是否有数据          */
		 	Buf[i] = UARTCharNonBlockingGet(UART0_BASE);                /*  串口接收数据                */
			i++;
			if (i == 8) {
				OSMboxPost(Uart0ReviceMbox, (void *)Buf);               /*  发送消息邮箱                */
				i = 0;
			}
		}
	}
	OSIntExit();
}

/*********************************************************************************************************
 END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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