久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1779|回復: 4
打印 上一主題 下一主題
收起左側

關于單片機iap程序地址跳轉問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:974783 發表于 2021-11-29 10:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
通過iap將用戶程序寫入eeprom讀出也是正確的,但是程序并沒有跳轉,請各位大佬幫忙看看,謝謝各位!!!單片機型號:stc8f1k17s2 EEPROM:自定義大小為4k  flash:17k
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. //測試工作頻率為 11.0592MHz

  4. #define FOSC 11059200UL//晶振值
  5. //#define baud 9600
  6. #define BRT (65536 - FOSC / baud / 4)//重載值

  7. #define APP 0x3400//用戶程序地址

  8. sfr WDT_CONTR        = 0xC1;

  9. sfr AUXR = 0x8e;
  10. sfr T2H = 0xd6;
  11. sfr T2L = 0xd7;
  12. sfr P3M0 = 0xb2;
  13. sfr P3M1 = 0xb1;
  14. sbit rts=P3^3;
  15. sfr P_SW1 = 0xa2;

  16. sfr P1M0=0x92;
  17. sfr P1M1=0x91;
  18. sbit red=P1^7;



  19. sfr IAP_DATA = 0xC2;
  20. sfr IAP_ADDRH = 0xC3;
  21. sfr IAP_ADDRL = 0xC4;
  22. sfr IAP_CMD = 0xC5;
  23. sfr IAP_TRIG = 0xC6;
  24. sfr IAP_CONTR = 0xC7;
  25. #define WT_30M 0x80
  26. #define WT_24M 0x81
  27. #define WT_20M 0x82
  28. #define WT_12M 0x83
  29. #define WT_6M 0x84
  30. #define WT_3M 0x85
  31. #define WT_2M 0x86
  32. #define WT_1M 0x87
  33. unsigned char xdata buf2[1024];
  34. //unsigned char buf[34];//接收
  35. unsigned char buft[32];//={0x75,0x92,0x80,0xe4,0xf5,0x91,0xd2,0x97,0x80,0xfe};
  36. bit flagtxd=0;
  37. int rlen=0;
  38. int  z=0,z1=0,z2=0;
  39. char k=0,s=0,y=0;
  40. unsigned char w=0,g=0;
  41. int data_len=0;
  42. char flagrxd=0,flagrxd_end=0;
  43. int addr=0x0000,add=0x0000,add3=0x0000;
  44. bit cnt88=0,cnt99=0;
  45. int j=0;

  46. void IapIdle();//iap初始化
  47. char IapRead(unsigned int addr);//iap讀數據
  48. void IapProgram(unsigned int addr, unsigned char dat);//iap寫數據
  49. void IapErase(unsigned int addr);//iap擦除頁

  50. void ea_on();//開總中斷
  51. void ea_off();//關總中斷
  52. void configuart(int baud);//串口配置,baud為波特率
  53. void uartinit();//串口初始化配置
  54. void uart_interrupt_on();//串口中斷打開
  55. void uart_interrupt_off();//串口中斷關閉
  56. void uart_t(unsigned char *buft,char len);//串口發送
  57. void uart_rt(unsigned char *buf,char len);
  58. char uart_len(char *bufr,char len);//讀取串口數據的長度
  59. void max485(bit x);//max485x為0接收為1發送

  60. void (*isp)()=APP;//指向用戶函數
  61. void iapwrite(unsigned char *buf,char len);//iap寫程序
  62. void iapr(unsigned char *buft,char len);
  63.                                    
  64. void main()
  65. {
  66.         P3M0=0x08;
  67.         P3M1=0x00;

  68.         P1M0=0x00;
  69.         P1M1=0x00;

  70.         red=0;
  71. //        for(g=0;g<=200;g++)
  72. //        {
  73. //                _nop_();
  74. //        }
  75.                            

  76.         ea_on();//開總中斷
  77.         max485(0);        //max485為接收
  78.         //max485(1);//max485為發送
  79.         uartinit();//串口初始化
  80.         configuart(9600);//波特率
  81.          uart_interrupt_on();//串口中斷開
  82.         
  83. //        iapr(buf,12);
  84. //        EA=1;

  85. //        red=1;
  86. //        uart_t(buft,3);
  87.         IapErase(0x0000);
  88.         _nop_();
  89.         _nop_();
  90.         _nop_();
  91.         IapErase(0x0200);
  92.         _nop_();
  93.         _nop_();
  94.         _nop_();
  95.         IapErase(0x0400);
  96.         _nop_();
  97.         _nop_();
  98.         _nop_();
  99. //        z=0x0000;
  100. //        for(s=0;s<=data_len;s++)
  101. //        {
  102. //                w=IapRead(z);
  103. //                buft[s]=w;
  104. //                z++;
  105. //        }        
  106.         uart_t(buft,10);
  107.         while(1)
  108.         {
  109.                 if(cnt99==1)
  110.                 {
  111.                         if(cnt88==1)
  112.                         {                                                               
  113.                                 add=0x0000;
  114.                                 for(j=1;j<data_len;j++)
  115.                                 {
  116. //                                        if((add%512)==0)
  117. //                                        {
  118. //                                                IapErase(addr);
  119. //                                                _nop_();
  120. //                                                _nop_();  
  121. //                                                addr=addr+512;
  122. //                                        }
  123.                                         z=buf2[j];
  124.                                         IapProgram(add,z);
  125.                                         _nop_();
  126.                                         _nop_();
  127.                                         add++;
  128.                                 }

  129.                                 z=0x0000;
  130.                                 for(k=0;k<100;k++)
  131.                                 {
  132.                                         for(s=0;s<10;s++)
  133.                                         {
  134.                                                 w=IapRead(z);
  135.                                                 buft[s]=w;
  136.                                                 z++;
  137.                                         }
  138.                                         uart_t(buft,10);
  139.                                 }
  140.                                 cnt99=0;
  141.                                 cnt88=0;
  142.                                 isp();
  143.                         }

  144.                 }

  145.         
  146.                         
  147.                
  148.         }                                                
  149. }

  150. void IapIdle()
  151. {
  152. IAP_CONTR = 0; //關閉 IAP 功能
  153. IAP_CMD = 0; //清除命令寄存器
  154. IAP_TRIG = 0; //清除觸發寄存器
  155. IAP_ADDRH = 0x80; //將地址設置到非 IAP 區域
  156. IAP_ADDRL = 0;
  157. }

  158. char IapRead(unsigned int addr)
  159. {
  160. char dat;

  161. IAP_CONTR = WT_12M; //使能 IAP
  162. IAP_CMD = 1; //設置 IAP 讀命令
  163. IAP_ADDRL = addr; //設置 IAP 低地址
  164. IAP_ADDRH = addr >> 8; //設置 IAP 高地址
  165. IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
  166. IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
  167. _nop_();
  168. dat = IAP_DATA; //讀 IAP 數據
  169. IapIdle(); //關閉 IAP 功能
  170. return dat;
  171. }

  172. void IapProgram(unsigned int addr,unsigned char dat)
  173. {
  174. IAP_CONTR = WT_12M; //使能 IAP
  175. IAP_CMD = 2; //設置 IAP 寫命令
  176. IAP_ADDRL = addr; //設置 IAP 低地址
  177. IAP_ADDRH = addr >> 8; //設置 IAP 高地址
  178. IAP_DATA = dat; //寫 IAP 數據
  179. IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
  180. IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
  181. _nop_();
  182. IapIdle(); //關閉 IAP 功能
  183. }

  184. void IapErase(unsigned int addr)
  185. {
  186. IAP_CONTR = WT_12M; //使能 IAP
  187. IAP_CMD = 3; //設置 IAP 擦除命令
  188. IAP_ADDRL = addr; //設置 IAP 低地址
  189. IAP_ADDRH = addr >> 8; //設置 IAP 高地址
  190. IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
  191. IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
  192. _nop_(); //
  193. IapIdle(); //關閉 IAP 功能
  194. }


  195. void ea_on()//開總中斷
  196. {
  197.         EA=1;
  198. }

  199. void ea_off()//關總中斷
  200. {
  201.         EA=0;
  202. }

  203. void configuart(int baud)//串口配置,baud為波特率
  204. {
  205.          
  206.         T2L =(65536 - FOSC / baud / 4);
  207.         T2H =(65536 - FOSC / baud / 4)>> 8;
  208.         AUXR = 0x15;//定時器2作波特率發生器

  209. }

  210. void uartinit()//串口初始化配置
  211. {
  212.         P_SW1 = 0x40; //RXD_2/P3.6, TXD_2/P3.7
  213.         SCON = 0x50;//設置串口為模式1可變波特率8位數據方式

  214. }

  215. void uart_interrupt_on()//串口中斷打開
  216. {
  217.         ES=1;
  218. }
  219.         
  220. void uart_interrupt_off()//串口中斷關閉
  221. {
  222.         ES=0;
  223. }

  224. void uart_t(unsigned char *buft,char len)//發送
  225. {
  226.                 int i;
  227.                 max485(1);        
  228.                 for(i=0;i<len;i++)
  229.                 {
  230.                         flagtxd=0;
  231.                         SBUF=*buft++;
  232.                         while(!flagtxd);
  233. //                        {
  234. //                                if(flag0_5s==1)
  235. //                                {
  236. //                                        flag0_5s=0;
  237. //                                        break;
  238. //                                }
  239. //                        }        

  240.                 }
  241.                 max485(0);

  242. }

  243. void uart_rt(unsigned char *buf,char len)//發送
  244. {
  245.                 int i;
  246.                 max485(1);        
  247.                 for(i=0;i<len;i++)
  248.                 {
  249.                         flagtxd=0;
  250.                         SBUF=*buf++;
  251.                         while(!flagtxd);
  252. //                        {
  253. //                                if(flag0_5s==1)
  254. //                                {
  255. //                                        flag0_5s=0;
  256. //                                        break;
  257. //                                }
  258. //                        }        

  259.                 }
  260.                 max485(0);

  261. }


  262. void max485(bit x)
  263. {
  264.         rts=x;
  265. }

  266. void iapwrite(unsigned char *buf,char len)
  267. {

  268.         IapErase(0x0000);
  269.         _nop_();
  270.         _nop_();
  271.         _nop_();
  272. //        IapErase(0x1005);
  273. //        _nop_();
  274. //        _nop_();
  275. //        _nop_();
  276.         if((buf[0]==0x99))//&&(buf[1]=0x03))
  277.         {        
  278.                
  279.                 unsigned char i=0,k=0;
  280.                 unsigned int j=APP;
  281.                 for(i=1;i<=len;i++)
  282.                 {
  283.                         k=buf[i];
  284.                         IapProgram(j,k);
  285.                         _nop_();
  286.                         _nop_();
  287.                         j++;
  288.                 }
  289.         }
  290. }
  291.                         
  292. void iapr(char *buft,char len)
  293. {
  294.         char i=0,x=0;
  295.         int j=APP;
  296.         for(i=0;i<=len;i++)
  297.         {
  298.                 x=IapRead(j);
  299.                 buft[i]=x;
  300.                 j++;
  301.         }
  302. }


  303. void uart_interrupt() interrupt 4//串口中斷
  304. {
  305.         if(RI) //接收到字節
  306.         {
  307.                 RI=0;//軟件清零接收中斷標志位
  308.                 buf2[rlen]=SBUF;
  309.                 if(rlen<1000)
  310.                 {                        
  311.                         if(buf2[rlen]==0x99)
  312.                         {
  313.                                 if(buf2[rlen-1]==0x99)
  314.                                 {
  315.                                         if(buf2[rlen-2]==0x99)
  316.                                         {
  317.                                                 cnt99=1;
  318.                                                 rlen=0;
  319.                                         }
  320.                                 }
  321.                         }
  322.                         if(buf2[rlen]==0x88)
  323.                         {
  324.                                 if(buf2[rlen-1]==0x88)
  325.                                 {
  326.                                         if(buf2[rlen-2]==0x88)
  327.                                         {
  328.                                                 cnt88=1;
  329.                                                 data_len=rlen-2;
  330. //                                                rlen=0;
  331.                                         }
  332.                                 }
  333.                         }
  334.                         rlen++;
  335.                         
  336.                 }
  337.                 else
  338.                 rlen=0;        
  339.                
  340.                         

  341.         
  342.                
  343.         }
  344.         if(TI)//發送字節
  345.         {
  346.                                 TI=0;//軟件清零發送中斷標志位

  347.                         flagtxd=1;//發送完成標志               
  348.         }
  349. }

復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:313048 發表于 2021-11-29 11:56 | 只看該作者
STC的IAP我沒用過,STM的我試過,說說我的看法,你首先確定你的數據沒錯,其次是確實程序有跑到跳轉的函數那里。先確定數據正確了,然后確定程序跑到了跳轉的位置,然后再考慮跳轉后程序不跑的問題。
回復

使用道具 舉報

板凳
ID:301191 發表于 2021-11-29 22:25 | 只看該作者
頂一下
回復

使用道具 舉報

地板
ID:624769 發表于 2021-11-29 22:33 | 只看該作者

通過iap將用戶程序寫入eeprom讀出也是正確的,但是程序并沒有跳轉,

eeprom 讀寫正確,   和  程序跳轉  有什么關聯? 從你的代碼中看不出來。
另外,C語言有   跳轉   這個操作么? 我一直以為  匯編才有   跳轉。
回復

使用道具 舉報

5#
ID:81196 發表于 2021-11-30 17:15 | 只看該作者
跳轉前是需要吧硬件看門狗關閉的,而且跳轉前你需要檢測棧頂信息是否正確,數據包數和字節數是否校驗通過。跳轉偏移量是否與你的KEIL里設置的一致(如果不一致,那么跳過去不是你寫入新APP的首地址那也肯定運行不起來)。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久日韩精品一区二区三区 | 99日韩 | 中文字幕成人av | 欧美一级片在线 | 日本在线网站 | 亚洲va中文字幕 | 久久国产精品无码网站 | 欧美中文字幕一区二区三区亚洲 | 成人天堂噜噜噜 | 亚洲高清一区二区三区 | 久久久网| 国产精品日韩在线观看 | 亚洲精品亚洲人成人网 | 国产精品不卡 | 真人一级毛片 | 国产精品免费av | 成人av资源在线 | 亚洲风情在线观看 | 欧美一级欧美三级在线观看 | 一区二区三区国产 | 五月综合激情婷婷 | 久久精品一区二区三区四区 | 狠狠操狠狠操 | 狠狠做深爱婷婷综合一区 | 欧美激情欧美激情在线五月 | 日韩在线免费 | 亚洲欧美日韩一区二区 | 久久区二区 | 天天视频成人 | 免费久久网站 | 日韩成人免费视频 | 九九九久久国产免费 | 一区二区三区四区在线视频 | 国产成人99久久亚洲综合精品 | 91视频a| 亚洲精品一区中文字幕乱码 | 亚洲国产成人av | 欧美日韩一区二区在线 | 亚洲国产精品视频 | 精久久| 中文字幕高清av |