在stm32上使用DFU

    今天在STM32上尝试了一下DFU功能。使用DFU需要准备PC上的软件DfuSe,驱动程序就在软件的安装目录下;另外还需要DFU固件的MDK的工程。

    因为网上有很多图文教程,这里只说下大致的流程:

    首先修改DFU工程文件,根据板子的情况修改上拉电阻的使能引脚,如果是12M的外部晶振还需要修改时钟的配置;同时,DFU模式是通过判断某一引脚(比如按键是否按下)来选择是否进入的,因此这个引脚也要根据板子的情况自定义。最后就是工程的Option里ROM起始地址及范围的设置(例如0x08000000和0x3000)。完成后就可以编译,烧到板子上了。

    用户的程序也需要修改,打开项目,修改ROM的起始地址为0x08003000,把大小从0x80000改为0x7D000(这里用的是stm32f103zet6,512K的内部FLASH)。资料上提到需要将调用函数NVIC_SetVectorTable()的参数进行修改,但是在我的工程里并没有调用这个函数,而是直接操作寄存器,因此需要修改的是宏定义VECT_TAB_OFFSET,将其从0x0改为0x3000。另外,为了后面产生.dfu文件,需要在Option中设置编译生成Hex文件。

    然后安装DfuSe,用DFU File Manager把用户程序的Hex文件转换为.dfu后缀的文件。连接好USB线,按下板上的按键并上电,如果一切正常则PC会识别新设备。安装好驱动程序后,打开DfuSe Demostration软件,就可以看到已连接设备了。接下来下载过程都是很简单的。

    不过,在我第一次下载好程序,板子重新上电后,stm32并没有成功运行用户程序,在Debug中发现固件没有被全部烧写进FLASH。后来在DfuSe Demostration中找到了原因,在Actions一栏中的Internl FLASH只有128个扇区,每个扇区1K,而我的固件有150K左右。经过摸索,才发现这关于Internal FLASH的描述是由板上的DFU固件提供的,在usb_desc的字符串DFU_StringInterfaceX中修改。修改后,重新下载固件,并烧写用户程序,运行一切正常。

   

posted @ 2014-02-16 00:49  Ilmen  阅读(13359)  评论(2编辑  收藏  举报