完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
10个回答
|
|
1.首先 ,你先写个正常的IAP程序 ,假设FLASH 地址范围是4000-FFFF 不去改任何地址。 假设你Code占用FLASH 为 4000-6000 ,然后 先写你的IAP程序, 把数据保存到 B000,用工具读取FLASH 查看写 没问题 没问题 没问题。。。这是最基本的FLASH写,先吧这个做好(用 FET MSP 软件)。
2.然后,你写个正常的点灯程序测试没问题之后。 3.你用IAP程序 ,你把link文件里面吧4000改成B000(把相关的 数据都要去修改) ,意思是 代码存放位置是B000-FFFF。 这个是IAP程序的存储地址。 你打开生成的txt 程序 文件开头就是 @B000 这个是 程序的启动地址 ,最下面 @FFE0 这个是默认的中断地址对应-Z(CODE)INTVEC=FFE0-FFFF(中断区)-Z(CODE)RESET=FFFE-FFFF(复位) 这样,你把 你的程序用IAP下载到4000的地址,在查看是否成功。 4.把点灯程序 地址改为 4000-AFFF(相关的也要改,先不要用任何中断), 你打开生成的txt 程序 文件开头就是 @4000 这个是 程序的启动地址 ,最下面 @AFE0 这个是默认的中断地址对应-Z(CODE)INTVEC=AFE0-AFFF(中断区)-Z(CODE)RESET=AFFE-AFFF(复位) 5.用你修改过地址的IAP 程序 下载这个点灯程序。下载完成后 mov 一下 PC 指向 AFFE ,正常情况下 指针指向 AFFE 后复位 PC 会指向 4000地址去运行, 6.都好了之后可以用中断了。 1)简单的东西可以使用位置定义,IAP和APP定义变量 在同一个地址,然后在IAP里面执行中断,例如计数什么的,你通过指针就可以在APP里面获取。(最好流出一段RAM 做地址定位) 例如: //-Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=1100-38FF (正常的) -Z(DATA)DATA16_I,DATA16_Z,DATA16_N,DATA16_HEAP+_DATA16_HEAP_SIZE=1300-38FF(例如保留1100-1300用代码去访问,程序 不会再这里面分配数据) 2)复杂点的 用中断调转 比如 FFE0出的中断 进入中断了 你直接 br &0xAFE0 跳转到你的虚拟中断地址,在APP里面 写处理函数就行了。其他中断都是一样的操作,只要你地址不写错。 |
|
|
|
向量表在顶头0xFFFF
|
|
|
|
这是真实地址,你把链接文件改成假设 DFFF你再boot里面做中断跳转
|
|
|
|
谢谢指导
|
|
|
|
这个是 IAP的
//-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=4000-FFDF -Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=F000-FFDF // ------------------------------------- // Code // //-Z(CODE)CSTART,ISR_CODE,CODE_ID=4000-FFDF //-P(CODE)CODE=4000-FFDF -Z(CODE)CSTART,ISR_CODE,CODE_ID=F000-FFDF //数据 变量存储位置 -P(CODE)CODE=F000-FFDF //代码 存储位置 // ------------------------------------- // Interrupt vectors // -Z(CODE)INTVEC=FFE0-FFFF -Z(CODE)RESET=FFFE-FFFF 这个是APP的 //-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=4000-FFDF -Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=4000-EFDF // ------------------------------------- // Code // //-Z(CODE)CSTART,ISR_CODE,CODE_ID=4000-FFDF //-P(CODE)CODE=4000-FFDF -Z(CODE)CSTART,ISR_CODE,CODE_ID=4000-EFDF -P(CODE)CODE=4000-EFDF // ------------------------------------- // Interrupt vectors // -Z(CODE)INTVEC=EFE0-EFFF -Z(CODE)RESET=EFFE-EFFF |
|
|
|
修改了link文件后,本身代码里面要添加什么东西吗?
|
|
|
|
[C] 纯文本查看 复制代码
#if __VER__ < 200#pragma codeseg(UPDATECODE) //在IAR2.0以下的程序定位函数#endif#include |
|
|
|
7楼里面关于iap的代码是哪些呢?函数前面monitor 和__monitor 是把函数放特定地址的意思吗?
#if __VER__ < 200 monitor void RTU_Update_Usart(void) #else __monitor void RTU_Update_Usart(void)@"UPDATECODE" #endif |
|
|
|
[C] 纯文本查看 复制代码
//为防止更新过程中 传输终止,把初始PC改成 Port_Update()的入口 //这样当传输终止或者突然断电导致程序重新启动的 程序将从 Net_Update() 开始执行 *(int *)0xFFFE=0xFFD0;//此数据为Net_Update()的入口 //*(long *)0xFFD0=0x0A004031;//mov.w #0A00,SP; *(long *)0xFFD0=0x39004031; //*(long *)0xFFD4=0x115A12B0;//CALL Update_Upadte; *(long *)0xFFD4=0x406E12B0; 另一个帖子中这三句话比较难理解,下面是作者说的话: 这个不难,思路就是把你的更新程序强制编译到固定地址空间,主程序判断条件进入更新程序后,更新程序擦除主程序区,然后外部接收要更新的代码往里写就行了,当然,更新程序所在空间是不能擦除的。 如果考虑更新过程中更新失败的情况,那你就要了解430的启动过程,在进入更新程序的时候,先将要复位要执行的指令写到中断向量区,如果更新不成功,那么每次上电让它强制进你的更新程序,知道更新完毕。 你需要了解的有启动过程、中断向量等。给你三句关键程序,结合启动过程好好研究研究吧 *(int *)0xFFFE=0xFFD0;//430复位去0XFFFE取指令,这地址值是多少就跳到多少地址执行下一条指令,即复位后去0XFFFD取指令 *(long *)0xFFD0=0x0A004031;//mov.w #0A00,SP;//在下一条指令的地方写入要执行的指令,这是固定的,执行完后地址偏移4继续执行 *(long *)0xFFD4=0x117c12B0;//这句的意思就是第三条指令要调用更新程序了,117c就是更新程序的主函数所在的地址,12B0是调用函数指令 下面就开始IAP吧...... 这样即使更新过程断了,下次上电还是会进入更新程序的直到更新完毕,细节地方自行研究 |
|
|
|
谢谢大神的指导,写的非常详细,步骤也很清晰,再次感谢您的回答,让我学到了很多
|
|
|
|
只有小组成员才能发言,加入小组>>
3035个成员聚集在这个小组
加入小组2931 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3608 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2344 浏览 1 评论
4809 浏览 1 评论
2574 浏览 1 评论
1332浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3611浏览 2评论
2931浏览 1评论
1519浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 02:33 , Processed in 1.457454 second(s), Total 66, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号