1、2541的OAD要加上ccservice这个profile才能工作,但源码工程没包含。
2、OAD的工作模式是:BIM+A+B
BIM根据FLASH里的一个掩码来选择启动A还是B,一般是用A来作OAD升级程序,B是正常使用的固件。
当固件要更新流程是:
B收到手机软件端命令,自己复位到A,然后手机软件与A连接,进行OAD,下载更新完A会自动复位到B运行。
void enter_oad(void)
{
GAPRole_TerminateConnection();
#ifdef FEATURE_OAD
uint16 crc[2] = { 0x0000, 0xFFFF };
uint16 addr = OAD_IMG_R_PAGE * ((uint16)(HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE)) + OAD_IMG_CRC_OSET / HAL_FLASH_WORD_SIZE;
HalFlashWrite(addr, (uint8 *)crc, 1);
#endif
HAL_SYSTEM_RESET();
}
3、OAD过程android和ios中会存在着service的缓存的更新, 软件端要先订阅0x2a05 (services changed)这个服务,然后设备端调用GATTServApp_SendServiceChangedInd
这样软件就会自动更新服务缓存。