📄 main.c
字号:
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 + -