完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
某次程序编译后程序出现了异常,程序大约如下void CommandExecute(UINT16 temp)[ UINT16 addr16; EA = 0; if(FlashFailed == 0xFF) //120912 如果之前未写入重试清除/写入损坏的次数,表示次数为0 FlashFailed = 0; HalFlashErase(61); for (addr = 0x1E800; addr < 0x1F000; addr=addr+128) //120912 根据清除地址检查是否清空 [ ] EA = 1;] void HalFlashErase(UINT8 pg)[ while (FCTL & 0x80); FADDRH = pg << 1; asm("NOP"); FWT = 0x2A; FCTL = 0x01; asm("NOP"); while (FCTL & 0x80); asm("NOP");]
发现到在HalFlashErase()之后R7寄存器异常被更改了(addr16被分配到R6和R7,所以addr16就被更改了) 以下附上我debug模式下的图片 可以看到图1的时候尚未进入HalFlashErase(),此时R7寄存器的值还是0x00 图2则是进入HalFlashErase()之后跳出来,R7寄存器的值居然被改变了,而且刚刚好就是FADDRH的值!!(我测试过几次不同的值,R7寄存器异常时值都会变成FADDRH的值) 程序运行时EA都是关闭的,所以不是被中断干扰,而且在执行HalFlashErase()的时候也没有使用到R7寄存器 最下面会附上IAR编译出来的Assembly code 注: FADDRH = pg << 1; 上面这行的下面若再加一个NOP(也就是两个NOP),或者是删除原本的NOP 程序不知为何就正常了,R7就没被更改了 这是不是编译器或是2430的flash controler有bug.....不知为何R7会被更改 图1. 图2. // 299 if(FlashFailed == 0xFF) //120912 如果之前未写入重试清除/写入损坏的次数,表示次数为0 MOV A,#0x1 LCALL ?XSTACK_DISP0_8 MOVX A,@DPTR XRL A,#0xff JNZ ??OadCommandExecute_40 // 300 FlashFailed = 0; CLR A MOVX @DPTR,A // 301 // 302 HalFlashErase(61); ??OadCommandExecute_40: ; Setup parameters for call to function HalFlashErase MOV R1,#0x3d LCALL HalFlashErase & 0xFFFF // 303 // 304 for (addr = 0x1E800; addr < 0x1F000; addr=addr+128) //120912 根据清除地址检查是否清空 MOV DPTR,#__Constant_1e800 MOV R0,#?V0 + 0 LCALL ?L_MOV_X / 146 /************************************************************************************************** // 147 * @fn HalFlashErase // 148 * // 149 * @brief This function erases the specified page of the internal flash. // 150 * // 151 * input parameters // 152 * // 153 * @param pg - A valid flash page number to erase. // 154 * // 155 * output parameters // 156 * // 157 * None. // 158 * // 159 * @return None. // 160 ************************************************************************************************** // 161 */ RSEG NEAR_CODE:CODE:NOROOT(0) // 162 ROOT void HalFlashErase(UINT8 pg) HalFlashErase: CFI Block cfiBlock3 Using cfiCommon0 CFI Function HalFlashErase // 163 [ ; Saved register size: 0 ; Auto size: 0 // 164 while (FCTL & 0x80);//120912 判断Flash控制器是否忙碌,如果忙碌就先等待 ??HalFlashErase_0: MOV A,0xae MOV C,0xE0 /* A */.7 JC ??HalFlashErase_0 // 165 FADDRH = pg << 1; MOV A,R1 CLR C RLC A MOV 0xad,A // 166 asm("NOP"); NOP // 167 FWT = 0x2A; MOV 0xab,#0x2a // 168 FCTL = 0x01; MOV 0xae,#0x1 // 169 asm("NOP"); //160523(0024_1) NOP // 170 while (FCTL & 0x80);//120912 判断Flash控制器是否完成清除Flash的动作,如果未完成就等待 ??HalFlashErase_1: MOV A,0xae MOV C,0xE0 /* A */.7 JC ??HalFlashErase_1 // 171 asm("NOP"); NOP // 172 ] RET CFI EndBlock cfiBlock3 |
|
相关推荐
1个回答
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
661 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
587 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1041 浏览 1 评论
720 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
516 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
150浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
115浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
119浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
117浏览 12评论
TPA6304-Q1: TPA6304 两片公用一组I2C的话,其中一片配置不成功怎么办
159浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 13:32 , Processed in 0.847136 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号