Microchip
直播中

张依弛

7年用户 168经验值
私信 关注
[问答]

pic18f Mcc生成的引导加载程序是否可以直接跳转到应用程序

大家好,我们的团队正在尝试合并应用程序和mcc生成的引导加载程序。结果很好,我们可以通过引导加载程序和我们编写的主机应用程序来更新应用程序。但是有一个新特性是我们的客户需要的。我们的新目标是:在更新期间和之后更新,不要丢失在一个特殊的GPIO引脚上的状态,但是对我来说很难。我已经尝试过一些实现,但是它们都不能工作。这是我们的工作流程:在应用程序中,一旦它接收到一个更新命令,它将禁用中断,并转到BOOTLOADER_Initialize()地址,可以在引导加载器项目的映射文件中找到。s BOOTLOADER_Initialize()地址。BOOTLOADER_Initialize()将检查更新标志(由用户定义),如果需要更新,引导加载程序将转到Run_Bootloader(),这是一个while循环。这次,引导加载程序将不再进入Run_Bootloader()并将使用STKPTR=0x00;asm(“pagesel”str(NEW_RESET_VECTOR));asm(“go to”str(NEW_RESET_VECTOR));跳转到应用程序地址。非常顺利。但现在我想保存一个gpio管脚状态。如果我修改Check_Device_Reset()到omet.,那么这段代码将破坏while 1循环。我使用调试模式检查引导加载程序是否跳转到应用程序。看起来是这样,但是应用程序失去了它的特性,比如中断或gpio。我的问题是:我们有可能跳过新更新的应用程序而不重置吗?

回帖(6)

陈晨

2020-4-22 10:20:02
验证你的应用程序正在设置每一件事。它不应该假设任何在重置值。RESET将所有寄存器设置为已知状态。
举报

史娟

2020-4-22 10:52:49
你好,Redliu,1)你能给我们简单的内存引导程序和应用程序驻留的地图吗?2)“NexOrtheta向量”的物理地址是什么?3)当你跳转到应用程序时,你会跳转到应用程序的C运行时初始化(CRT0/CRT1)吗?我只是想知道,如果您跳转到错误的地址,您是否可能无意中绕过了在应用程序的“main()”函数之前执行的C运行时初始化。
举报

李顺正

2020-4-22 11:01:53
引导加载程序位于0x0000上应用程序位于0x8000上,因此引导加载程序中的NEW_RESET_VECTOR是0x8000。ON,跳到引导加载程序的ReSETHY向量是0x224。
举报

史娟

2020-4-22 11:17:28
你好,Redliu,我想你需要提供一些更明确的细节,以便论坛社区帮助你。1)首先,你使用的是PIC18部分?2)你能再解释一下新的要求吗?你到底想坚持什么——输入引脚还是输出引脚的状态?你提到的GPIO引脚,但它可以是输入或输出-这是什么?3)如果你觉得一个SFR寄存器(LATX或TrISX)正在被修改,你总是可以设置一个断点来停止对该寄存器的写入。4)你能显示你觉得没有按预期工作的代码片段吗?最好的问候,肯
举报

更多回帖

发帖
×
20
完善资料,
赚取积分