硬件环境:NXP 1788
软件环境:KEIL
实现过程:上面说了我准备了两个程序,就用裸机版的代码说一下实现流程。带操作系统的原理都是一样的。只是多创建几个任务而已。USB_HOST实现IAP升级,总的思路就是:复制bin文件到U盘->目标板断电,插上U盘->目标板上电,进入升级->运行升级程序。其实可以更具体,比如说设置升级标志或者按键。
拿到一个程序先从main开始,直接贴代码,说一大堆废话有什么用。
int main()
{
int32_t rc;
uint32_t numBlks,blkSize;
uint8_t inquiryResult[INQUIRY_LENGTH];
SystemInit();
UART_Init(57600);
Host_Init();
rc =Host_EnumDev();
if (rc ==OK) {
rc = MS_Init( &blkSize, &numBlks, inquiryResult );
if (rc == OK) {
rc = FAT_Init();
if (rc == OK) {
Bin_Read();
} else {
return (0);
}
} else {
return (0);
}
} else{
return (0);
}
while(1);
}
下面分模块说一下, 前面的硬件初始化函数很简单,USB设备枚举和FAT文件系统NXP官网上都有,只需改硬件接口,Host_Init函数如下:
void Host_Init(void)
{
uint32_t HostBaseAddr;
LPC_SC->PCONP |=0x80000000;
LPC_USB->OTGClkCtrl =0x00000019;
while((LPC_USB->OTGClkSt & 0x00000019) != 0x19);
LPC_USB->StCtrl =0x1;
LPC_IOCON->P0_29 &= ~(0x07UL << 0);
LPC_IOCON->P0_30 &= ~(0x07UL << 0);
LPC_IOCON->P1_28 &= ~(0x07UL << 0);
LPC_IOCON->P1_29 &= ~(0x07UL << 0);
LPC_IOCON->P0_29 |= 0x01UL <<0;
LPC_IOCON->P0_30 |= 0x01UL <<0;
LPC_IOCON->P1_28 |= 0x01UL <<0;
LPC_IOCON->P1_29 |= 0x01UL <<0;