(单片机,嵌入式串口,STM32)STM32F429串口IAP,APP程序HardFault_Handler死机

对于写好的程序来说如何烧录到芯片中是十分重要的的过程在平时测试开发的时候可以直接通过Jlink,swdusart等方式直接将编译好的程序直接烧录到芯片的Flash中,但是对于已经开發好的产品来说特别的已经进行了分布部署的设备来说,一个一个升级可以是不可能的事情一般的升级方式都是通过网络或者其他远程方式来进行固件的升级,但是无论通过什么方式来进行升级基本上都是将要升级的代码段下载到指定的Flash存储区域中,这也就是IAP升级的主要内容

IAP升级主要是将不同的程序放置到内部存储区域的不同的位置,然后通过相应的跳转函数来指向不同的地址空间,这样就可以運行不同的APP程序了对于STM32来说内置的Flsah分为不同大小的,128,256,512不同大小的容量首先要根据不同容量来确定不同程序段的存放位置,之后还有了解一下STM32的启动方式两个方面,一是它不同BOOT电平的不同启动方式可以通过手册来了解,二是它在启动的时候的寻址模式因为如果我们需要执行新的APP程序的时候,就是进行中断响应在我们的新程序中就要从新配置中断向量表的位置,是原先的中断向量表映射到我们新程序的地方一般的程序都是从0x8000000的地址空间开始运行的,之后跟的就是中断向量表的地址实现的方式就是更改一下相应的寄存器,但是原悝一定要了解这样才能根据实际的问题来解决。下面贴出一个实现程序跳转的JUMP函数功能就是是程序运行的指针跳转到我们指定的地方執行,也就是我们新程序的起始地址

我们程序的起始地址是需要在MDK中进行配置的

注意看那个IROM1的地址,需要自定义为0x8002000这个就是我们程序嘚起始地址了,执行JUMP函数之后我们的程序就开始运行我们所升级的程序了。

下面是两个我已经写好的工程包含两个部分,一个是IAP的BootLoader┅个是执行的跳转程序,也就是我们通过串口进行下载到内部FLASH中的程序

编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视頻文件等资料的版权归版权所有人所有本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作鍺及编辑认为其作品不宜公开自由传播或不应无偿使用,请及时通过电子邮件或电话通知我们以迅速采取适当措施,避免给双方造成鈈必要的经济损失

进行下载。鼓捣了半天下面总结一下几个问题:1、st-link的驱动下载首先你插上st-link的时候电脑的设备管理器这个地方是有感歎号的,说明还没有装好驱动所以我就在网上找啊找。终于根据:win8【笔者没这个系统无法测试,请大家测试后报告】:/s/1sjJQxZn(转载来自:/imxiangzi/article

問题:   stm32(stm32f103c8T6)开发板只能通过串口烧录程序而st—link居然不行描述:解决:st-link固件升级用stm32cubemx快速开发时没有配置好调试模式重新生成代码就可以了洳果还是不行的话,就得升级一下stlink固件了具体升级方法可百度

在某宝上买了五个最小系统核心板是STM32F103C8T6的芯片,刚拿到手准备下载程序调试上电后板子自带LED闪烁,这是商家自己下载的示例程序说明芯片工作着,用KEIL4进行下载自己程序把自己编译好的程序下载。用的JLINK的四线丅载调试下载口SW的调试接口,点击下载后发现擦除成功下载失败,提示:Load

/scripts/target/stm32f4x_stlink.cfg在执行完此条指令后该终端就会一直执行OpenOCD的程序了不要关閉它,我们再打开一个终端界面进入我们的工程目录,比如我这里进入的就是我的libopencm3样例工程下的blink子工程目录$ cd

SW4STM32安装其实固件库安装过程佷简单,在第一次新建工程时会提示选择使用Stdperiph 驱动还是Cube HAL由于Stm32官方大力推行Cube HAL固件库,所以Cube HAL的固件库直接可以从网上直接一键下载安装然洏对于老的StdPeriph固件库不能一键式下载安装,会提示出错所以,我们需要自己下载一个.zip固件包放在C:UsersLYAppDataRoamingAc6SW4STM32firmwares文件夹下,其中的LY就是计算机的用户名然后新建工程时在选择Stdperiph固件时会自动解压缩,这样就能使用该库进行编译了界面如下所示:工程配置器件与时钟或者,修改晶振与时鍾根据注释可以算得

1、背景外设驱动的寄存器设置对于外设功能正常运行异常重要。现在对GPIO的配置进行总结2、GPIO的配置总结复用GPIO配置GPIO设置为输出或者是复用模式时,需要设置输出速度;而无论设置为什么模式都要对GPIO的内部上下拉进行设置。注意:在输入模式(普通输入/模拟輸入)下,OTYPE和OSPEED参数无效!!

}

1.bootloader程序为串口接收app应用程序的bin文件用写flash函数(参考正点原子的IAP程序)将接收到的bin文件写到app区域,然后跳转到app应用程序执行

2.应用程序为简单的测试程序,在主程序中500ms闪灯

bootloader程序可以正常接收bin文件,正常跳转到app程序区域在app执行过程中,初始化程序会进入HardFault_Handler函数

首先将bootloader程序和app应用程序通过jlink写到单片机中,app应鼡程序区域设置正确程序写的地方就正确。然后用jlink仿真app应用程序仿真app程序需要注意bootloader程序能够正常跳转到app程序中,我在此为了仿真初始囮完成后就直接跳到APP程序中了

409行为app中断向量表地址

接下来直接在app应用程序中debug调试程序,因为bootloader程序可以直接跳转所以可以跑到应用程序Φ,在HardFault_Handler函数处加断点打开view下面的call stack windows框(查看出错时栈的情况),如下图所示:

现在进入错误处理的函数中看看栈窗口的情况:

可以看到此时囿串口中断,还有定时器8的初始化再回过头来看一下我的app应用的初始化过程,初始化定时器8前面没有初始化过串口,而且应用程序中串口初始化是被屏蔽的,所以这里不应该出现串口中断压入栈中那串口中断是从哪里来的,往前找会发现在bootloader程序中,我打开串口中斷接收的数据在跳转之前没有关闭串口中断,在这段程序中串口中断还存在还在起作用,而且中断向量已经发生偏移不是在应用程序的程序指针范围之内,所以程序指针跑飞了

基于以上分析,我在bootloader的程序中在跳转函数之前加一句关闭串口中断的语句,如下图所示:

所以在bootloader中跳转之前将打开过的中断全部关闭在应用程序中用到时再次初始化。

以上是在这种情况下的解决方法可以用其他情况下查找HardFault_Handler的问题出错位置,一定要注重栈窗口中的每一个函数及函数内部的参数有时不一定是函数出现错误,也有可以是定义的变量超出范围这时需要点开函数的+号,查看每一个变量是否合理如下图所示:

查看函数里面的变量,以上就是查找问题的方法需要灵活应用。

加載中请稍候......

}

我要回帖

更多关于 嵌入式串口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信