STM32的启动模式
2019-09-06 来源:eefocus
刚开始接触STM32,最先遇到的问题就是下载程序。我按照教程,使用串口下载,感觉很简单。但是,最近需要使用LCD12864,就把以前的MSP430上的程序移植了一下,结果我发现了一个奇怪的现象,每次下载完程序后,断电,再上电后,液晶屏就不再显示了。这让我感到无比的头疼,因为我总以为是我的程序有问题,反反复复修改了好多遍,经过几个小时的调试,我最终找到了问题的缘由:那就是启动模式。
STM32不同于51或者430的地方是,它有两个管脚:BOOT0,BOOT1用来控制单片机上电复位后启动的位置。如下图所示:
● 第一种启动方式是最常用的用户FLASH启动,正常工作就在这种模式下,STM32的FLASH可以擦出10万次,所以不用担心芯片哪天会被擦爆!
● 第二种启动方式是系统存储器启动方式,即我们常说的串口下载方式(ISP),不建议使用这种,速度比较慢。STM32 中自带的BootLoader就是在这种启动方式中,如果出现程序硬件错误的话可以切换BOOT0/1到该模式下重新烧写Flash即可恢复正常。
● 第三种启动方式是STM32内嵌的SRAM启动。该模式用于调试。
由于我手头上有一个串口转USB模块,索性就拿它来给STM32F103下载程序了。我也没有深入研究启动模式到底是干什么的。这就是造成我后面问题的罪魁祸首。
在系统上电的时候,cpu首先根据这两个脚来确定是哪种模式的启动,然后就是把相应模式的起始地址映射到0地址处,并从0地址处开始执行。
在芯片出厂时,ST烧写了一个bootloader到rom中,也就是system memory。这个bootloader的主要任务就是通过uart1下载程序到内置flash中去。工作流程如下:
1) Bootloader是在System Memory,这个区域必须通过设置Boot1和Boot0引脚才能启动,正常工作状态下,这部分区域是被隔离开的,自动被绕开,Bootloader绝对不占用任何用户程序的资源。
简单地说:当你要使用ISP烧写数据到Flash时,需要设置Boot1和Boot0启动System Memory中的Bootloader;这时候bootleader会帮助你将程序烧写到Flash中去,烧写完成后,再重新设置Boot1和Boot0启动(将boot1和boot0都置0)Flash中你自己的程序,进入正常操作。
2)STM32中的Bootloader使用USART1做为通信端口,它使用8个数据位、1个停止位和偶校验,具有自动波特率检测功能。
由此可见,使用ISP下载还是比较麻烦的。看来以后,还是得多看看原理,再下手,不然埋下的隐患自己都发现不了。