刚开始接触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下载还是比较麻烦的。看来以后,还是得多看看原理,再下手,不然埋下的隐患自己都发现不了。
关键字:STM32 启动模式 下载程序
引用地址:
STM32的启动模式
推荐阅读最新更新时间:2024-11-11 03:38
STM32学习——MPU6050姿态传感器
STM32移植(抄)起来特别爽。。。 MPU6050简介 1.MPU6050是一款六轴(三轴加速度+三轴角速度(陀螺仪))传感器 2.MPU6050含有一个第二IIC接口,可用于连接外部磁力传感器 3.MPU6050自带数字运动处理器(DMP)通过主IIC接口,可以向CPU提供四元数,CPU可利用四元数得到欧拉角,避免了CPU通过原始数据进行姿态计算(DMP驱动库由官方提供,使用时需要改动) 4.据说stm32的硬件IIC接口存在bug,需要用软件模拟IIC时序 MPU6050初始化步骤 (1)初始化IIC接口 即SDA和SCL对应的GPIO (2)复位MPU6050 使MPU6050内部所有的寄存器恢复默认值,通过对电
[单片机]
MDK4.x(uvision 4.x)开发STM32入门工程的错误排除
一、用stm32f10x_lib.h文件时的问题 在用uvison 4.x(MDK4.x)建立一个开发STM32F103的工程:test.uvproj 在工程中加入源程序main.c文件,源代码内容如下: #include stm32f10x_lib.h int main(void) { return 0; } 编译会出现错误,使得入门者难以继续深入学习STM32。 错误提示的全部信息如下: test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o). 解决办法如下: 此问题错误
[单片机]
STM32原有的MDK工程下移植到GCC环境
1. 增加 STM32F429IGTx_FLASH.ld 这个文件存放芯片内存信息 STM32F429IGTx_FLASH.ld主要存放的是芯片内存的信息,堆栈大小,RAM,Flash大小, MEMORY{ }中存放的内存段,程序中有使用明确内存的地址的地方要在这里定义。 /* Entry Point */ ENTRY(Reset_Handler) /* Highest address of the user mode stack */ _estack = 0x20020000; /* end of RAM */ /* Generate a link error if heap and stack don&
[单片机]
如何在STM32上实现USB主机读写U盘文件
在项目应用中,经常会有对外交换数据的需求。USB接口读写U盘无疑是一种颇为方便的选择。在这一篇中,我们就来讨论如何在STM32上实现USB主机读写U盘文件的方法。 1、应用概述 在我们的产品上有这样一个需求,希望通过大容量的U盘存取数据。我们来分析一下这个需求的具体内容。 首先在硬件上我们需要有相应的USB端口,这一点在产品设计时就已经考虑并实现,所以硬件方面我们就不再过多的表述。 其次我们需要为这个USB的硬件接口编写驱动,就是实现USB端口的底层操作,如IO配置、终端处理等,这是移植的主要工作。 再者我们需要移植面向大容量存储的USB Host库,这也是我们需要做的工作之一。其实USB主机库本身并不需要
[单片机]
STM32学习笔记一时钟和定时器
由于近期在准备海洋航行器比赛,正好趁此机会学习一下ARM,看到周围很多同学都在使用32,所以我也买了一块STM32F103ZET6,准备好好地学习一下。 STM32的时钟系统相当的复杂,包含了5个时钟源,分别是HSI HSE LSI LSE PLL,HSI是高速内部时钟、RC振荡器,频率为8M,HSE是高速外部时钟,即晶振,我的核心板上晶振为8M。LSI为低速内部时钟、RC振荡器,频率40k,LSE为低速外部时钟,接32.768kHz晶振,作为RTC时钟源。PLL为锁相环倍频输出,最大不超过72M。 我在学习定时器时先看的是TIM3,它挂载在APB1分频器上,APB1上面挂载的是低速外设,APB2上挂载高速外设。 在
[单片机]
STM32 CAN总线调试经验
前言 STM32 CAN代码网上很多,但大都是讲如何配置的,对于一些原理以及注意事项没有很清楚的说明。在实际调试过程中,两个设备间的通信只要设备CAN的配置一样基本就可以调通,但在增加设备的过程中,很容易出现多设备无法通信的问题,这里主要就这一问题进行说明。 硬件 STM32F042G4 + MAX3051 测试过程 测试板回来后,两个设备间的通信轻松搞定,但在增加设备的过程中,增加的设备总是不能正常通信。详细比对了一下配置,也没有任何问题。后来,仔细研读MAX3051的芯片手册,得到以下几个重要信息: MAX3051有四种工作模式 高速模式:数据传输速率可达1Mbps,但抗干扰能力弱,需要双绞线 斜率控制:可
[单片机]
stm32使用中,printf函数不执行的问题
一、程序中已经添加了printf的库函数 #include“stdio.h” 二、stm32串口通讯测试没问题,此处可以通过调用 USART_SendData(USART1, 0xAA)函数来进行验证; 三、现象。printf函数无法工作 四、解决办法,使用自带的迷你库,就可以正常运行。
[单片机]
STM32 | 两块STM32之间的SPI主从通信实例
一、整体框图及说明 这里使用 STM32F429IGT6 作为主机,STM32F103ZET6 作为从机,都配置为全双工。本例要实现的功能就是主、从机之间的数据互传。 主机往从机发送的数据为: 从机往主机发送的数据为: 二、关键代码 主机关键代码: 从机关键代码: 可见,主机与从机的代码大多都一样。只是从机多了一步启动传输的操作,这一步很关键,少了这一步传输就不正常。这是为了制造主机发送的同时也要接收到数据的条件。这一点参考手册里也有相关说明: 此处,要营造这样的条件,必须先启动从机,然后再启动主机。只有保证主机发送的同时有接收到数据,才能保证其时序的正常,否则可能会产生数据错位,或者会产生多余数据
[单片机]