打印
[应用相关]

STM32USBBoot Alpha版

[复制链接]
3202|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
simon21ic|  楼主 | 2008-4-23 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过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;
}
沙发
walnutcy| | 2008-4-23 22:47 | 只看该作者

我还是不试了,免得我的st-link-ii没有了,嘻嘻

使用特权

评论回复
板凳
香水城| | 2008-4-23 23:29 | 只看该作者

踩个脚印,有空再回来看

另外,楼主说“发现stm32boot中存在一个bug,使得无法支持,已经mail作者”,请问这个stm32boot是什么程序?作者在哪里?

使用特权

评论回复
地板
simon21ic|  楼主 | 2008-4-23 23:40 | 只看该作者

stm32boot

是在st的论坛上找到的一个串口下载的上位机程序,用这个的原因是因为CLI界面,可以放在Makefile里,编译好后可以自动下载
存在的bug是这样的
stm32boot -e -a 0x08004000 file.bin
如果file.bin的大小小于1K的话,那么应该擦除Flash第16页,但stm32boot缺仍旧擦除Flash第0页

我本来就不是用调试(当然,商业项目中一定会使用高级调试工具,记录程序执行路径),基本ISP就够用了,而收到的那块开发板太没东西玩了,所以就把st-link II给咔嚓了。当然,如果还需要用到调试的话,偶自己开发。

使用特权

评论回复
5
simon21ic|  楼主 | 2008-4-24 00:11 | 只看该作者

bug代码出

main.c的533行:
for(page = 0; page < pages; page++) {
那么,所有的擦除都是从Page0开始的,应该改为:
for(page = (base_address - 0x08000000) / 1024; page < pages; page++) {

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

2597

帖子

104

粉丝