昨天发出了单片机IAP的上位机程序,由于没有实际测试IAP APP的运行情况,所以便没有发出来IAP程序。
上位机相关的帖子:
http://blog.csdn.net/sunhaobo1996/article/details/79233285
说是自己写的,但还是参考了官方给出的Demo,所以叫官方精简定制版会更好一些?
使用标准库来尽可能减小体积,当初想用HAL库,用MXCube来生成初始化代码,但HAL生成的代码太大,什么都没写就将近5K,用在F4P6上性价比太低,果断放弃。
大致提一下这个的功能。
CRC8验证
1024以下可变包长
本来还有个分包序列号这东西,但感觉没什么用,就删掉了(毕竟也不乱序发包……都自带CRC与ACK了……)
难点,可能也就是对Flash的操作与如何跳转到APP上。
但怎么进行跳转,官方Demo已经给出了:
if (((*(__IO uint32_t *)APPStartFlashAddr) & 0x2FFE0000) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *(__IO uint32_t *)(APPStartFlashAddr + 4);
Jump_To_Application = (pFunction)JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t *)APPStartFlashAddr);
/* Jump to application */
Jump_To_Application();
}
就是将主堆栈指针定位到APP起始位置,然后将跳转的地址指向APP Reset处,进行跳转。
貌似没什么说的,那就上代码吧~
IAP & APP都在里面。
哦对了,IAP跳转到APP之前记得将用到的外设设置成初始状态,否则可能会有一些奇奇怪怪的问题。
APP开发遇到的问题
官方给的Demo中,直接拿来用在开发中会有一点小问题。用官方2012版的startup.s不会出现这问题,但拿到2014版就会有warning。
Warning如下。
.\Objects\test.axf: Warning: L6918W: Execution region RW_IRAM2 placed at 0x200000c4 needs padding to ensure alignment 8 of startup_stm32f0xx.o(STACK).
查看了下map文件,发现0x200000c4 这个地方与后面的内存断开了。
检查了下RAM的设定,发现:
明显是错的。
不清楚为什么ST官方会跳过0x200000c4这块内存(我觉得应该是开发人员疏忽了,认为0xC0处是最后一个字的开始,所以下意识的+4),但正确的设定应该为:
这样再F7重新make,就OK了,不会再有Warning。
以上~
没什么难度,倒是用QT做上位机用了好几天……