通过USB接口来实现原来需要用串口实现的程序下载功能。 原理:通过USB接口实现CDC类,在PC上模拟出一个串口(参考Virtual COM示例代码),在这个串口上根据"System boot mode specification.pdf"中定义的协议,实现程序下载功能。
目前在st-link II上测试通过,Flash Loader可以正常下载程序。 另:发现stm32boot中存在一个bug,使得无法支持,已经mail作者。 main.c文件中的Sys_Init函数中前面初始化的一个IO口,是进入Bootloader的条件。 应用程序需要做的修改: 1.连接脚本(设置起始地址为0x08004000):FLASH (rx) : ORIGIN = 0x8004000, LENGTH = 112K 2.NVIC设置SetVectTable需要加上一个偏移0x4000:NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000); 编译环境:Codesourcery GCC Toolchain 使用许可:目前上传的是Alpha版本,发布时将基于GPLv2许可协议 Boot condition连接方式(st-link II,建议自己做PCB,否则st-link II就不能再用于调试了)
测试源代码:http://space.**/upload/2008/4/24/7c7c45a6-31b9-4834-891a-c9f7bbf11890.zip
原来的校验问题解决,但又有新的问题,main.c中的USB_Out函数中,每次发送的最大数据包为最大端点数据长度-1。如果使用最大端点数据包长度的话,发送失败。 以上问题也解决了,解决方法:main.c文件中的USB_Out函数最后,加入判断并发送ZLP: u8 USB_Out(u8 *data,u32 len) { u32 sent_len = 0;
while(sent_len < len) { if((len - sent_len) > VIRTUAL_COM_PORT_DATA_SIZE) count_in = VIRTUAL_COM_PORT_DATA_SIZE; else count_in = len - sent_len;
UserToPMABufferCopy(data + sent_len, ENDP1_TXADDR, count_in); sent_len += count_in;
SetEPTxCount(ENDP1, count_in); SetEPTxValid(ENDP1);
while(count_in)USB_Istr(); }
if(!(len % VIRTUAL_COM_PORT_DATA_SIZE)) { // Send ZLP SetEPTxCount(ENDP1,0); SetEPTxValid(ENDP1); }
return 0; }
|