STM32启动模式及API

发布者:ananan一二三四五最新更新时间:2021-06-08 来源: eefocus关键字:STM32  启动模式  API 手机看文章 扫描二维码
随时随地手机看文章

简介:我们玩ARM9,一般都是在内存里调试程序,速度飞快。STM32下也可以这样,虽说现在的flash寿命已经很长了,但flash中调试烧录程序还是一个很慢的过程,有时候程序上一个小小的改动要花上几倍的时间下载代码,这确实是不能忍受的。


我们也可以在开发STM32时,在内存中调试程序。


{STM32这颗Cortex-M3控制器,与其他许多ARM一样,提供了BOOT0和BOOT1两个管脚用于启动选择。


BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。(用于串口ISP) BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。在芯片上电复位时,BOOT0和BOOT1两个管脚的状态将决定芯片从何处启动。


1.当BOOT0和BOOT1均设置为逻辑1时,系统将从内置SRAM中启动,这是代码内存调试的第一个条件。 }经多次确认,BOOT0和BOOT1状态与内存中调试无直接联系

2.然后,我们需要在代码中设置正确的中断向量表位置。中断向量表通常被放置在用户程序的开始,所以flash中运行时,向量表位于0x08000000处,而当代码被放置在SRAM中运行时,他的位置就成了0x20000000。在初始化NVIC时,我们可以放置如下代码,定义向量表的位置

NVIC_SetVectorTable(0x20000000 , 0x0); 或 NVIC_SetVectorTable(0x08000000 , 0x0);

3. 在编译器中,要进行正确的设置。这里以IAR 5.4为例说明。 3.1. 工程选项中Linker项,Config选项卡中,指定Linker Configuration File为stm32f10x_ram.icf, 该文件在FWLIB安装包中可以获得,IAR4和5分别有不同的配置文件。 3.2. 同样是工程选项中Debug项,Download选项卡中,去掉所有钩子,不下载代码到flash.


经过以上步骤,代码就可以在内存中调试,下载速度飞快,调试速度也比flash中快了不少!



IAP在线升级


1.boot程序


(1)IROM1 起始地址:0x8000000


(2)关键代码


#define ApplicationAddress0x8003000


if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); }


1,JumpAddress=*(vu32*)(ApplicationAddress+4);是把用户代码的复位地址赋值给JumpAddress。

2,__MSR_MSP(*(vu32*)ApplicationAddress);是把用户代码的堆栈地址写入堆栈指针

3,Jump_To_Application()是把用户代码的复位地址付给PC指针


if(((*(vu32*)ApplicationAddress)&0x2FFE0000)==0x20000000) 这句话的意思是把用户代码的首地址里面的数据拿出来,看看是不是以0x20000000开头。


(X & 0x2FFE0000 ) == 0x20000000 意思是说X是不是在0x20000000与0x2001FFFF之间,即栈顶是不是在以0x20000000开始的128K 前面说了用户代码的首地址放的是堆栈指针,而堆栈应该指向RAM,而RAM的首地址是0x20000000,所以这句话用来判断是不是已经有一个正确的堆栈指针地址写在了用户代码的首地址,进一步可以推测是不是有一个正确的用户代码写在了用户代码区,如果已经写入了,就可以跳过去运行,如果没有写入,就不跳过去。这是DEMO程序的判断逻辑,可以这样用,也可以不这样用。


2.APP程序


(1)IROM1 起始地址:0x8003000


(2)关键代码


#define VECT_TAB_OFFSET 0x3000 (修改地方) //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); //中断向量表映射

关键字:STM32  启动模式  API 引用地址:STM32启动模式及API

上一篇:关于STM32主存储块擦除编程操作的一些疑问
下一篇:ARM嵌入式开发--STM32时钟设置

推荐阅读最新更新时间:2024-11-09 13:06

嵌入式学习⑤——STM32嵌入式应用系统设计
前言 这次嵌入式学习的主要内容为可视化的代码跟踪调试、简单的hex文件编译并在Proteus上仿真运行、最后使用Altium Designer 进行原理图和PCB图的设计,都是我们学习STM32的工具。 一、基于跨平台多类型代码编辑器VScode 1.VScode的安装 从vscode官网下载最新版本,deb包下载地址:https://code.visualstudio.com/docs?dv=linux64 使用wget 下载地址 进行下载 安装:dpkg -i 安装包 安装成功后,执行code命令打开sacccaas界面 安装过程中由于安装包依赖关系而报错,解决方案如下: deb安装出现依赖问题可以执行
[单片机]
嵌入式学习⑤——<font color='red'>STM32</font>嵌入式应用系统设计
STM32_GPIO口
一、GPIO功能 1、输入浮空模式 浮空输入状态下,STM32读到的电平只根据IO端口的电平有关,如果不连接确定电平负载该引脚的电压也是不确定的 2、输入上拉模式 开启上拉时引脚默认电压为高电平,开启下拉时引脚默认电压是低电平 3、输入下拉模式 开启上拉时引脚默认电压为高电平,开启下拉时引脚默认电压是低电平 4、模拟输入模式 GPIO的引脚用于ADC电压采集的输入通道时,需要将GPIO设置为模拟输入模式 注意:除ADC和DAC要将IO配置为模拟通道其他外设功能一律要将IO配置为复用功能模式 5、开漏输出模式 如果微控制器要输出0,可以从IO口直接输出低电平,但如果微控制器想控制要输出1,那么如果电路上没有额外加
[单片机]
STM32_GPIO口
STM32中的SysTick时钟源来自哪里?
有位朋友在后台大概问了这样一个问题:STM32的SysTick时钟源是来自Cortex系统定时器吗? 引伸: 为什么STM32CubeMX中Cortex系统定时器可选择1分频(和8分频)? 1写在前面 看到这个问题,我在想,这位朋友可能没有认真看手册,同时也存在一个误区。 我顺便也搜索了一下,网上很多文章都说到:SysTick时钟源是来自Cortex系统定时器,就是那个有8分频的时钟 但是,我们实际应用中,SysTick时钟源真的是来自这个Cortex系统定时器吗? 2 SysTick时钟初始化代码 不管是使用标准外设库,还是HAL库,你初始化SysTick,都会调用内核中的SysTick_Config函数。 比如: Sy
[单片机]
<font color='red'>STM32</font>中的SysTick时钟源来自哪里?
STM32蜂鸣器音乐播放实例教程
本文用STM32单片机蜂鸣器来演奏音乐,用的开发软件是STM32CubeIDE。 蜂鸣器 有源蜂鸣器 内部有震荡源,只要通电就会有响声,但是声音频率固定。 无源蜂鸣器 内部不含振荡源,蜂鸣器管脚输出一定频率的信号,才能发声。 本实例中用到的是无源蜂鸣器,控制频率高低发出不同声调的声音。 电路原理图 由电路原理图可知,蜂鸣器在PB5管脚,以一定频率翻转PB5管脚的电平,可以使蜂鸣器发声。 STM32工程 打开STM32CubeIDE软件,新建STM32工程。关于STM32CubeIDE软件的使用方法,可以参考此文:STM32中PWM的配置与应用详解。 配置时钟。 项目设置。 设置调试模式。 开启PB5管脚。
[单片机]
<font color='red'>STM32</font>蜂鸣器音乐播放实例教程
Keil STM32调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
参考: 很郁闷,买来没多久的 STM32F4-DISCOVERY 就挂了? STM32F103RB Jlink调试的时候出现flash timeout.reset the target and try it again 看完以上网友的方案后本人使用FlyMcu读芯片,内容提示芯片被锁。遂想下载一个程序试试,不想程序可以下载,然后再读芯片时已正常。 返回Keil使用ST-Link也可正常使用。 从网友结论及本人测试,些次出现“flash timeout.reset the target and try it again”是由芯片被锁导至。 以下方法未试 问题已经解决了。是keil的环境没有设置好。导致程序进步去。应该是没有Re
[单片机]
Keil <font color='red'>STM32</font>调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
STM32串口之空闲中断
背景 在做Nbiot的一个路灯项目,NBiot模块一般都是串口接口,使用AT指令集,对接中国移动onenet平台。先用串口助手去测试,流程测试OK之后需要在MCU上重新写一遍。一开始用的STC15系列的MCU,然后跟平台之间对接协议很多,代码量较大,所以换到了STM32F1系列的MCU。 在STC15MCU上面通过串口接收数据只能老老实实用接收中断来做,每接收一帧数据都需要判断帧头帧尾,一帧结束再处理。之前就听说过STM32串口上面有帧中断,一直没有用过,然后才有了这篇博客。 备注:一帧数据是表示一个或多个字节组成的有含义的字符串。 STM32串口 IDLE中断 IDLE其实是 空闲的意思。IDLE中断叫空闲中断
[单片机]
<font color='red'>STM32</font>串口之空闲中断
如何利用PCB设计stm32单片机
单片机是现代电子产品中不可或缺的组成部分,它在自动化控制、通讯、仪器仪表、家电、安防等领域有着广泛的应用。而PCB(Printed Circuit Board)也是电子设计中不可或缺的一环,是来集成各种元器件的载体。那么,如何利用PCB设计stm32单片机呢?本文将为大家解答这个问题。 首先,我们需要明确stm32单片机的基本架构和性能特点。stm32单片机采用了Cortex-M内核架构,并具有低功耗、高速、低噪音等特点。在使用stm32单片机设计电路时,我们需要对其数据和控制信号进行充分的了解,从而根据自己项目的需求选择合适的芯片。 接下来,我们来介绍如何利用PCB设计stm32单片机。首先,我们需要通过软件绘制PCB电
[单片机]
stm32 系统滴答定时器
使用步骤: 1.设置SysTick定时器的时钟源。 2.设置SysTick定时器的重装初始值 --中断要打开中断使能 3.清零SysTick定时器当前计数器的值 4.打开SysTick定时器 库函数:SysTick.c 初始化函数: void SysTick_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us = SYSCLK / 8; //SYSCLK的8分频保存1us所需的计数次数 fac_ms = (u16)fac_us*1000; //每个ms需要的systick时钟数
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved