if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)和if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)分析
首先要清楚:0x8000000是Flash的起始地址,0x20000000是SRAM的起始地址。jump2app()是一个虚拟函数(函数指针)
(*(vu32*)(0X20001000+4))== (*(__IO uint32_t*)(0X20001000+4))
==(*(volatile unsigned int*)(0X20001000+4))
(*(vu32*)(0X20001000+4)) 通过内存寻址访问地址为(0x20001000 + 4)中的值
(0X20001000+4)只是一个常量;
(volatile unsigned int*)(0X20001000+4) 将0x20001000 + 4这个常量强制转化成volatile unsigned int类型的指针;
(*(volatile unsigned int*)(0X20001000+4)) 相对于取0x20001000 + 4地址处的值
程序设置把串口接收来的数据从0x20001000开始存储,第一个4个字节为栈顶地址,第二个4字节为复位中断向量的入口地址,接下来+8,将会是NMI中断服务函数的入口地址, +12,将会是HardFault的服务函数入口地址...
STM32程序地址从 0X08000000 开始 执行,PC机也是从硬盘上的 0X08000000 地址开始执行。前四个字节是栈顶地址main()函数式主函数,也有个栈顶地址,其他函数一样,在调用跳转之前,将其对应的函数栈地址保存起来。 BootLoader程序先烧进Flash里,它的栈顶地址从0X08000000开始,4字节栈顶地址数据空间,然后是各种中断服务地址。。。
当收到APP程序时(它自己已经定义好了,收到APP文件后写道0X08000000+N这个地址上),它要把APP程序写到0X08000000+N上,因此,它需要首先判断一下APP程序在MDK中编译生成.bin文件后否是遵循这个0X08000000+N这个地址。如果和Bootloader要求的一样,那么就是正确的文件。
而appxaddr存放的是用户程序Flash的首地址,(*(volatile u32*)appxaddr)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff区间中。
注:这里面的(0X20001000+4)和我们在SRAM里的起始地址 0X20001000 有什么关系呢?
我们选择0X20001000,就是留下SRAM区域的前4K SRAM给IAP程序使用。
关键字:STM32 串口 IAP 地址
引用地址:
STM32串口IAP实验中的地址问题
推荐阅读最新更新时间:2024-11-12 01:26
ARM串口设置参数解释
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 获取和设置终端属性,行控制,获取和设置波特率 SYNOPSIS 总览 #include termios.h #include unistd.h int tcgetattr(int int tcsetattr(int fd, int optional_actions, struct termios *termios_p); int tcsendbreak(in
[单片机]
STM32——PWM基本知识及配置过程
将通用定时器分为四个部分: 1,选择时钟 2,时基电路 3,输入捕获 4,输出比较 本节定时器PWM输出主要涉及到定时器框图右下方部分,即输出比较部分 和上一讲相同,时基时钟来源于内部默认时钟 对此有疑问请参考 : 定时器中断实验 中 定时器时钟选择部分 和 定时器时钟来源部分 什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 PWM工作过程 每个定时器有四个通道,每一个通道都有一个捕获比较寄存器, 将寄存器
[单片机]
STM32开发板显示界面添加状态栏
需要完成的主要工作有: 1) 划分显示位置 2) 绘制状态栏背景 3) 绘制电池图标:一共7种图标baticos 4) 绘制时间:只显示时和分 5) 循环检测时间变化,并更改显示时间数值,同步判断电池电量,绘制相应图标 源文件:satusbar.c #include includes.h #include rtc.h const u8* baticos = { 0:/STATUSBAR/BAT/battery0.bmp , 0:/STATUSBAR/BAT/battery1.bmp , 0:/STATUSBAR/BAT/battery2.bmp , 0:/STATUSBAR/BAT/battery3.
[单片机]
S3C2440开发板的学习使用(一)----串口的安装
一、串口连接 1、板上有USB转UART芯片PL2303HX,可以通过MINI USB口,使用一根USB转MINI USB线连接到笔记本上。 2、Windows下安装USB转串口驱动程序PL2303_Prolific_DriverInstaller_v1.5.0.exe。 3、下载串口工具软件SecureCRT,设置波特率和COM口,即可通过串口读写。 UART简介:http://blog.csdn.net/GQ1900/article/details/51885259 UART和RS232、RS485的关系:http://blog.csdn.net/chun_1959/article/details/4505
[单片机]
怎么写stm8的IAP升级的bootloader和app
因为之前写个stm32的IAP升级程序,所以我总结了做IAP升级的三个主要的难点: 1、如何设置中断向量,也就是说中断向量的重定向 2、如何配置程序的起始地址 3、如何从IAP跳转到APP程序 4、使用库函数要注意的地方(防止被坑) 说文章的时候我已经完成了一个最简单的IAP升级程序,可以通过串口接收bin文件写入到flash里面,然后再运行。 1、如何设置中断向量,也就是说中断向量的重定向 stm8不像stm32那样有个一寄存器管理着中断向量的地址,所以stm32的中断可以任意设置(符合要求的情况之下),但是stm8的中断向量表是固定的 在0X8000地址,不能修改,所以BOOT区不能开中断,否则会和APP区的中断打架,但是AP
[单片机]
STM32时钟模块 STM32F103RCT6
跟51相比较STM32的时钟模块变得比较复杂起来这主要得益于STM强大的各种功能。对于不同的模块需要用到的时钟频率是不一样的。而较高的频率会造成更多的能量的浪费。以下是我在学习STM32过程中的总结。 首先我们要明白各个时钟模块的时钟来源。下面这张图是我调用了原子哥的参考手册里面的图。 首先我们来聊一下时钟的来源(图中标红了的5个数据),时钟源一共有5个。其中的PLLCLK(图中的5号时钟源)是从其他的时钟源转换过来的。下面我分别对这5个时钟源进行一下讲解。 (1)HSI图中的1号时钟源,是内部高速时钟。其时钟频率为8MHZ (2)HSE为高速外部时钟,可以接4-16MHZ的晶振(芯片PD0和PD1
[单片机]
STM32 定时器浅谈_1
看了整整一周的定时器,整理一下一周来学习笔记. 定时器的组成包括四部分:时钟选择单元,时基单元 ,输入捕获 ,输出比较! 一,时钟选择单元: 内部时钟(CK_INT) 外部时钟模式1:外部引脚输入 外部时钟模式2:外部触发输入ETR 内部触发输入(ITRX):定时器级联 二,时基单元组成 CNT计数器 :向上、 向下、中央对齐 三种计数方 PSC预分频寄存器 ARR自动重装载寄存器 三,输入捕获单元 此处应注意的是实际采样频率F = 1/2*Fdts { 香侬采样定理} 并在滤波电路处进行高频滤波,即一些高频波在滤波电路被滤掉 捕获通
[单片机]
STM32 SWD下载出现no target connect解决方法
一、问题再现 二、问题原因 程序中把 swd 下载那两个下载引脚给复用了,然后st-link 就无法通过下载引脚,连接你的单片机了,所以就显示无法检测到目标。 三、解决方法 第一种: STEP1: BOOT0引脚拉高使用ISP下载模式. STEP2: 用STM32 ST-LINK Utility连接芯片,然后Target- Erase Chip。 STEP3: 再次进入keil界面,拉低BOOT0,点击LOAD即可下载! 第二种: 可以按住复位按键,单击下载 然后立即松开复位 就可以下载程序。 这是单片机启动过程 单片机上电复位后执行的是内部的启动程序 还没有执行你 自己的程序 所以开始都是默认状
[单片机]