keil从非0x08000000地址调试STM32单片机程序方法

news2024/11/28 14:19:15

  在使用stm32单片机的串口IAP升级功能时,需要调试bootloader程序和app程序,一般bootloader的程序都是从0x08000000地址开始运行的,使用keil软件可以直接进行仿真,但是如果调试app程序的话,由于它不是从0x08000000地址开始的,使用keil仿真的时候,仿真不了。为了可以直接使用keil仿真APP程序,在网上找了好多方法,不过好多方法都讲的比较凌乱,看起来也不方便。下面就将自己总结的2种方法分享出来。

  所用到的程序源码下载连接如下: https://download.csdn.net/download/qq_20222919/87872428

方法一:通过先下载bootloader的程序仿真APP程序。

bootloader程序

  先看一下bootloader的程序

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "stmflash.h"
#include "iap.h"
int main ( void )
{
    u8 bit_new = 0;					//接收到程序标志
    u8 bit_10s = 0;
    u16 oldcount = 0;				//老的串口接收数据值
    u16 applenth = 0;				//接收到的app代码长度
    u8 t = 0, clearflag = 0;

    SystemInit();
    NVIC_PriorityGroupConfig ( NVIC_PriorityGroup_2 ); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init ( 115200 );	//串口初始化为115200
    delay_init();	   	 	//延时初始化

	printf ( "bootloader is running!\r\n" );
    while ( 1 )
    {
        if ( USART_RX_CNT )
        {
            if ( oldcount == USART_RX_CNT ) //新周期内,没有收到任何数据,认为本次数据接收完成.
            {
                applenth = USART_RX_CNT;
                oldcount = 0;
                USART_RX_CNT = 0;
                printf ( "用户程序接收完成!\r\n" );
                printf ( "代码长度:%dBytes\r\n", applenth );
            }
            else oldcount = USART_RX_CNT;
        }

        if ( applenth != 0 )
        {
            if ( ( ( * ( vu32* ) ( 0X20001000 + 4 ) ) & 0xFF000000 ) == 0x08000000 ) //判断是否为0X08XXXXXX.
            {
                iap_write_appbin ( FLASH_APP1_ADDR, USART_RX_BUF, applenth ); //更新FLASH代码
                printf ( "固件更新完成!\r\n" );
                bit_new = 1;
            }
            applenth = 0;
        }

        if ( ( bit_10s == 30 ) || ( bit_new == 1 ) )
        {
            bit_10s = 0;
            bit_new = 0;
            //执行FLASH中的代码

            if ( ( ( * ( vu32* ) ( FLASH_APP1_ADDR + 4 ) ) & 0xFF000000 ) == 0x08000000 ) //判断是否为0X08XXXXXX.
            {
                printf ( "开始执行FLASH用户代码!!\r\n\r\n" );
                iap_load_app ( FLASH_APP1_ADDR ); //执行FLASH APP代码
            }

            //执行SRAM中的代码
//            if(((*(vu32 *)(0X20001000 + 4)) & 0xFF000000) == 0x20000000) //判断是否为0X20XXXXXX.
//            {
//                printf("开始执行SRAM用户代码!!\r\n");
//                iap_load_app(0X20001000);//SRAM地址
//            }
        }
        t++;
        delay_ms ( 10 );
        if ( t == 20 )
        {
            bit_10s++;
            if ( clearflag )
            {
                clearflag--;
                if ( clearflag == 0 )
                    printf ( "清除显示!\r\n" ); //清除显示
            }
        }
    }
}

  在bootloader中一直等待串口发送升级文件,当串口接收完升级文件之后,才会跳转到flash中执行APP代码。bootloader代码地址设置如下:
在这里插入图片描述
在这里插入图片描述
  当使用keil调试bootloader代码时,是可以正常调试的。
在这里插入图片描述

APP程序

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

int main ( void )
{
    SCB->VTOR = FLASH_BASE | 0x5000;
    SystemInit();
    uart_init ( 115200 );	//串口初始化为115200
    delay_init();
    LED_Init();
    delay_ms( 500 );
    printf ( "\r\n\r\napp is running!\r\n" );

    while ( 1 )
    {
        delay_ms ( 500 );
        LED = !LED;
        printf ( "led flashing !\r\n" );
    }
}

  进入APP程序之后,首先设置地址的偏移量。然后在APP程序中让LED灯闪烁,然后打印信息。APP的地址设置如下:
在这里插入图片描述
在这里插入图片描述
  此时如果直接用keil单步调试APP程序,会发现程序不能进入到main函数中。
在这里插入图片描述

  程序虽然一直在运行,但是却不能跳转到main函数中来,这是因为程序上电后直接运行bootloader程序,而在bootloader程序中会一直等待串口数据,所以不会跳转到APP程序中来。如果想要程序跳转到APP中来,那么就需要用串口助手发送APP程序。
请添加图片描述

  当使用串口助手发送完升级文件之后,在bootloader程序中会直接跳转到APP程序所在的地址,这样才能单步调试APP程序。但是这样调试程序的太麻烦了,能不能不通过bootloader‘直接调试APP程序呢,当然是可以的。

方法二:通过配置文件直接仿真APP程序

  使用这种方法单片机中可以不烧写bootloader程序。首先看APP软件在keil中的配置,地址配置不变。
在这里插入图片描述
  在debug选项中,在初始化文件的位置处添加了一个配置文件。
在这里插入图片描述
  这个boot.bin文件和工程文件放在同一个目录下。
在这里插入图片描述
  新建一个记事本文件,将名称改为 boot.bin ,记得将记事本的后缀名改为ini,然后使用记事本打开boot.ini文件,再里面输入下面的内容。

FUNC void Setup (void) 
{ 
SP = _RDWORD(0x8005000);          // 堆栈指针 
PC = _RDWORD(0x8005004);          // PC 
_WDWORD(0xE000ED08, 0x8005000);   // 中断向量偏移地址 
} 
load %L incremental
Setup();
g, main                             //跳转到main  

  注意代码中的这三个地址值,这个值和APP程序的起始地址有关,根据自己的程序去修改这三个值。
在这里插入图片描述
  其他设置保持不变
在这里插入图片描述
  下面就可以通过keil软件直接单步调试APP程序了。
在这里插入图片描述

  单机仿真按钮进入仿真界面之后,会发现此时程序直接就跳转到了main函数之中,不需要借助bootloader程序跳转了。这样通过一个配置文件,直接通过配置文件就可以让keil软件直接跳转到main函数中了。
在这里插入图片描述

  使用这种方法调试APP程序时,可以不用烧写bootloader程序。但是单片机独立运行时,还是需要烧写bootloader程序的。这个配置文件只对keil仿真器起作用,只有在使用keil仿真时才会起作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java程序判断是否是回文

1 问题 利用java程序判断是否是回文。 2 方法 利用函数库,将输入的字符串倒置,看倒置后的字符串和原来的字符串是否一样,然后得出结论。 package practice; import java.util.Scanner; public class Huiwen { public static void main(St…

【MySQL数据库 | 第五篇】DDl操作数据库

目录 🤔DDL介绍: 🤔语法详解: 1.查询: 1.查询所有数据库: 示例:查询自带数据库 2.查询当前数据库: 2.创建: 示例:创建一个名字叫做itcast的数据库&…

第一期丨INTERSPEECH 2023 论文预讲会

INTERSPEECH 2023 论文预讲会是由CCF语音对话与听觉专委会、语音之家主办,旨在为学者们提供更多的交流机会,更方便、快捷地了解领域前沿。活动将邀请 INTERSPEECH 2023 录用论文的作者进行报告交流。 INTERSPEECH 2023 论文预讲会第一期邀请到清华大学和…

【新版】系统架构设计师 - 系统工程与信息系统基础

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 系统工程与信息系统基础考点摘要系统工程概念系统工程方法生命周期阶段及方法 信息系统诺兰模型信息系统的生命周期信息系统的建设原则信息系统的开发方法信息系统的分类信息化系统业务处理系统【…

【高危】Apache Cassandra 存在越权漏洞导致远程命令执行

漏洞描述 Apache Cassandra 是 Apache 基金会的一个分布式 Nosql 数据库。 Apache Cassandra 的受影响版本中,由于没有对JMX/nodetool权限的用户做限制,当启动FQL/Audit日志时,拥有 JMX/nodetool 权限的攻击者可以以 cassandra 的身份权限执…

QMediaPlayer 打包解码器注意事项

程序打包注意事项 如果需要把我们的程序进行打包,给客户安装使用,那么还需要引导客户额外安装LAVFilters,显得比较麻烦。接下来,介绍,如何将解码器打包进安装包。 1、QMediaPlayer找到解码器的原理 先来看看解码器&am…

Android 各版本特性

一:介绍 我们可以看到Android版本对应的Api版本 二:Android 6.0 (API 23) Google I/O 2015大会如约已于2015年5月28日举行。在发布会上代号为“Marshmallow(棉花糖)”的安卓6.0系统正式推出。 Android …

LVS简介及LVS-NAT负载均衡群集的搭建(要像记得回家的路一样记得理想和远方)

文章目录 一、LVS群集的简介1.群集的含义和应用场景2.性能扩展方式群集的分类负载均衡(LB)高可用(HA)高性能运算(HPC) 二、LVS负载均衡群集简介及搭建1.负载均衡群集架构第一层,负载调度器&…

Linux - sudo:/etc/sudoers 可被任何人写

错误如下: sudo: /etc/sudoers 可被任何人写 sudo: 没有找到有效的 sudoers 资源,退出 sudo: 无法初始化策略插件 需求就是除了root账号,别的账号也能执行mkdir等命令 1. 先用root把 chmod 777 /etc/sudoers 设置可修改 2. 添加一条 xxx…

JIRA维护记——使用原实例位置恢复数据

一、出现问题 昨天下班了,同事反馈Jira又不能使用了。想都不用想,肯定是磁盘空间不足了,因为已经出现过几次了。之前都是清理一下磁盘空间即可,都不用重启Jira。 今天一上班就开始清理磁盘空间,把一些日志啊&#xf…

数据在内存中的存储(打入“内部”深度剖析哦)

前面的文章介绍中,只对整数在内存中的存储进行了简单介绍,可是只了解这么一点点是远远不够的呢,这篇文章呢就对数据在内存中的存储的几个重难点进行了详细的介绍哦,希望对爱学习的小伙伴们有所帮助~ 目录 一.数据类型…

【Protobuf速成指南】Message中如何定义“数组”?

文章目录 2.0一、字段规则1.1 规则1.2 改进1.3 消息类型作为字段类型 二、repeated字段使用方式三、Contact2.01.write.cc2.read.cc3. 查看二进制信息①hexdump② --decode选项 2.0 本系列文章将通过对通讯录项目的不断完善,带大家由浅入深的学习Protobuf的使用。这…

win10的另一种美化字体的方式,使用noMeiryoUI

目录 1. 前提2. 字体选择3. 查看已经安装的字体并查看效果4. 安装软件修改系统字体5. 修改浏览器字体 1. 前提 21年的时候写了一篇文章,《Windows10下美化字体,达到类似mac的效果》,当时还很迷恋macType这个软件的使用,觉得好牛逼…

Linux——安装VMwaretools实现文件共享功能

作为一个Linux初学者,应该熟悉相关的文件下载和安装以及简单的配置命令,下面通过安装一个VMwaretools来实现window环境和Linux环境下文件的共享功能的实现。 一、安装VMwaretools 点击重新安装后,会在桌面上看到有一个光盘,则代表…

单片机的基础知识和原理

单片机是一种集成了中央处理器(CPU)、内存、输入/输出(I/O)端口和其他外设的小型计算机系统。它通常用于嵌入式系统,如家电、汽车电子、工业控制等领域。 下面是单片机的基础知识和原理的概述: 架构&…

Linux系统安装——VMware15.5安装centos7.6 (附资料下载+联网配置+踩坑总结)

一、安装虚拟机VMware15.5 VMware虚拟机安装Win10,安装包秘钥/系统镜像/激活工具如下:(主要这个地址不限速,方便!) https://www.123pan.com/s/g520Vv-Dg2id (遇到会拦截下载任务的浏览器,直接换浏览器下载即可&#xf…

【LVS负载均衡群集】

目录 一、企业群集应用概述1、群集的含义2、企业群集分类3、负载均衡群集架构1、负载均衡的结构2、负载均衡群集工作模式分析 二、LVS的三种工作模式1、NAT 模式地址转换 2、TUN模式IP隧道 3、DR模式直接路由 三、实战NAT模式 LVS负载均衡群集部署1.部署共享存储(NF…

将安全性置于首位:考试系统源码的安全漏洞和防护措施

在当今数字化时代,考试系统源码的安全性已经成为了一个至关重要的问题。随着更多人开始远程学习和在线考试,考试系统的安全漏洞也越来越容易被利用。因此,在开发和使用考试系统源码应用程序时,保护用户数据和系统资源免受攻击是至…

思维导图整理,100个好看实用的模板分享

思维导图是一款有效提升工作和生活效率的生产力工具,受到全球千万用户的喜爱。 它帮助我们将所需的信息以图形的形式呈现,更加便于我们的记忆。头脑风暴帮助我们捕捉灵感,激发 我们更多的想象力。 它可以应用在我们生活以及工作的方方面面。项…

卡尔曼滤波与组合导航原理(七)平方根Kalman滤波:Potter平方根滤波、SVD分解滤波、UD分解滤波、平方根信息滤波SRIKF

文章目录 一、平方根滤波基本形式二、Potter平方根滤波1、方差阵的量测更新2、方差阵的时间更新3、Potter平方根滤波流程4、向量量测情况下的方差阵量测更新 三、奇异值(SVD)分解滤波1、时间更新方差方程的SVD分解2、量测更新方差方程的SVD分解3、SVD分解…