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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求教STC15W4K32S4內部dataflash讀寫問題

[復制鏈接]
跳轉到指定樓層
樓主
求教,在讀出寫入到STC15W4K32S4內部dataflash的數據時,為什么定義成unsigned char和unsigned long型變量的數據會出錯?unsigned int變量讀出的數據是正確的,如下圖:

代碼如下:
  1. //main.c
  2. //=====================================================================================
  3. #include "main.h"
  4. #include <stdio.h>

  5. type_status status_test;
  6. void muc_init();
  7. void delay1s(void);
  8. void UART_init(void);

  9. /*****************************************************************************
  10. 函數名稱 : main()
  11. 功能描述 : 主函數
  12. 輸入參數 : 無
  13. 返回參數 : 無
  14. 使用說明 : 無
  15. *****************************************************************************/
  16. void main()
  17. {
  18.         muc_init();
  19.         Read_Flash(Flash_ADDR,(u8*)&status_test,sizeof(status_test));
  20.         printf("讀取flash十六進制a:0x%x\n",status_test.a);
  21.         printf("讀取flash十進制a:%d\n",status_test.a);
  22.         printf("讀取flash十六進制b:0x%x\n",status_test.b);
  23.         printf("讀取flash十進制b:%d\n",status_test.b);
  24.         printf("讀取flash十六進制c:0x%x\n",status_test.c);
  25.         printf("讀取flash十進制c:%d\n",status_test.c);        
  26.         Earse_Flash(Flash_ADDR);
  27.         while(1)
  28.         {
  29.                 status_test.a = 2;
  30.                 status_test.b = 3;
  31.                 status_test.c = 4;
  32.                 Write_Flash(Flash_ADDR,(u8*)&status_test, sizeof(status_test));
  33.                 while(1);

  34.         }
  35. }

  36. /*****************************************************************************
  37. 函數名稱 : gpio()
  38. 功能描述 : IO口初始化
  39. 輸入參數 : 無
  40. 返回參數 : 無
  41. 使用說明 : 無
  42. *****************************************************************************/
  43. void gpio()
  44. {
  45.         P0M1 = 0x00;
  46.         P0M0 = 0x00;
  47.         
  48.   P3M1 = 0x00;
  49.   P3M0 = 0x00;

  50.   P1M1 = 0x00;
  51.   P1M0 = 0x00;

  52.   P5M1 = 0x00;
  53.   P5M0 = 0x00;
  54. }

  55. /*****************************************************************************
  56. 函數名稱 : muc_init
  57. 功能描述 : mcu初始化
  58. 輸入參數 : 無
  59. 返回參數 : 無
  60. 使用說明 : 無
  61. *****************************************************************************/
  62. void muc_init()
  63. {
  64.         gpio();
  65.         UART_init();
  66. }

  67. /*****************************************************************************
  68. 函數名稱 : UART_init
  69. 功能描述 : UART初始化
  70. 輸入參數 : 無
  71. 返回參數 : 無
  72. 使用說明 : 無
  73. *****************************************************************************/
  74. void UART_init(void)
  75. {                  
  76.         //下面代碼設置定時器1
  77.         TMOD = 0x20;        // 0010 0000 定時器1工作于方式2(8位自動重裝方式)
  78.         TH1  = 0xFD;        // 波特率:9600 /11.0592MHZ
  79.         TL1  = 0xFD;        // 波特率:9600 /11.0592MHZ
  80.         TR1  = 1;
  81.         //下面代碼設置定串口
  82.         AUXR = 0x00;             // 很關鍵,使用定時器1作為波特率發生器,S1ST2=0
  83.         SCON = 0x50;         // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接受)
  84.         TI=1;                        // 很關鍵,使用printf函數時必須有此命令
  85. }
  86. //==========================================================================================
  87. //main.h
  88. //==========================================================================================
  89. #ifndef __MAIN_H__
  90. #define __MAIN_H__

  91. //==============================================================================
  92. typedef unsigned char u8;
  93. typedef unsigned int u16;
  94. typedef unsigned long u32;

  95. //==============================================================================

  96. #include "STC15W4K.H"
  97. #include "flash.h"
  98. //==============================================================================
  99. //管腳定義
  100. //==============================================================================

  101. sbit led1 = P1^2; //open指示燈
  102. sbit led2 = P1^3; //stop指示燈
  103. sbit led3 = P1^4; //close指示燈

  104. sbit rs_signal = P1^5; //雨滴傳感器信號

  105. sbit ocp = P1^6; //過流保護

  106. sbit in1 = P1^7;
  107. sbit in2 = P5^4; //馬達正反轉控制

  108. sbit sw_open = P3^5;
  109. sbit sw_stop = P3^4;
  110. sbit sw_close  = P3^3;

  111. sbit rx_out = P3^2; //433MHz解碼

  112. sbit p06 = P0^6;
  113. sbit p07 = P0^7;

  114. //==============================================================================
  115. //變量定義
  116. //==============================================================================

  117. typedef struct
  118. {
  119.         u8 a;  
  120.         u16 b;
  121.         u32 c;
  122. } type_status;

  123. extern type_status status_test;

  124. #endif
  125. //==============================================================================
  126. //flash.c
  127. //==============================================================================
  128. #include "flash.h"

  129. /*****************************************************************************
  130. 函數名稱 : IapIdle
  131. 功能描述 : 關閉IAP
  132. 輸入參數 : 無
  133. 返回參數 : 無
  134. *****************************************************************************/
  135. static void IapIdle(void)
  136. {
  137.         IAP_CONTR = 0x00;                  //關閉IAP功能
  138.         IAP_CMD = 0x00;                    //清除命令寄存器
  139.         IAP_TRIG = 0x00;                   //清除觸發寄存器
  140.         IAP_ADDRH = 0xff;               //將地址設置到非IAP區域
  141.         IAP_ADDRL = 0xff;
  142. }
  143. /*****************************************************************************
  144. 函數名稱 : IapReadByte
  145. 功能描述 : 從ISP/IAP/EEPROM區域讀取一字節
  146. 輸入參數 : addr:起始地址
  147. 返回參數 : 無
  148. *****************************************************************************/
  149. static u8 IapReadByte(u16 addr)
  150. {
  151.         u8 dat;                       //數據緩沖區

  152.         IAP_CONTR = ENABLE_IAP;         //使能IAP
  153.         IAP_CMD = CMD_READ;             //設置IAP命令
  154.         IAP_ADDRL = addr;               //設置IAP低地址
  155.         IAP_ADDRH = addr >> 8;          //設置IAP高地址
  156.         IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  157.         IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  158.         _nop_();                        //等待ISP/IAP/EEPROM操作完成
  159.         _nop_();
  160.         _nop_();
  161.         _nop_();
  162.         dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數據
  163.         IapIdle();                      //關閉IAP功能

  164.         return dat;                     //返回
  165. }
  166. /*****************************************************************************
  167. 函數名稱 : IapProgramByte
  168. 功能描述 : 寫一字節數據到ISP/IAP/EEPROM區域
  169. 輸入參數 : addr:起始地址/dat:待寫入數據
  170. 返回參數 : 無
  171. *****************************************************************************/
  172. static void IapProgramByte(u16 addr, u8 dat)
  173. {
  174.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  175.     IAP_CMD = CMD_PROGRAM;          //設置IAP命令
  176.     IAP_ADDRL = addr;               //設置IAP低地址
  177.     IAP_ADDRH = addr >> 8;          //設置IAP高地址
  178.     IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數據
  179.     IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  180.     IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  181.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  182.                 _nop_();
  183.                 _nop_();
  184.                 _nop_();
  185.     IapIdle();
  186. }
  187. /*****************************************************************************
  188. 函數名稱 : IapEraseSector
  189. 功能描述 : 扇區擦除
  190. 輸入參數 : addr:起始地址
  191. 返回參數 : 無
  192. *****************************************************************************/
  193. static void IapEraseSector(u16 addr)
  194. {
  195.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  196.     IAP_CMD = CMD_ERASE;            //設置IAP命令
  197.     IAP_ADDRL = addr;               //設置IAP低地址
  198.     IAP_ADDRH = addr >> 8;          //設置IAP高地址
  199.     IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  200.     IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  201.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  202.                 _nop_();
  203.                 _nop_();
  204.                 _nop_();
  205.     IapIdle();
  206. }
  207. /*****************************************************************************
  208. 函數名稱 : Write_Flash
  209. 功能描述 : 對Flash進行字節編程
  210. 輸入參數 : Addr_Obj:FLASH的目標起始地址
  211.            Addr_Sour:寫入的源數據
  212.            Length:寫入的字節數
  213. 返回參數 : SUCCESS:寫入成功
  214.             ERROR:寫入失敗
  215. 使用說明 : 無
  216. *****************************************************************************/
  217. u8 Write_Flash(u16 Addr_Obj,u8 *Addr_Sour,u16 Length)
  218. {
  219.         u16 i;
  220.         for(i = 0; i < Length; i ++)
  221.         {
  222.                 IapProgramByte(Addr_Obj,*Addr_Sour);
  223.                 Addr_Obj ++;
  224.                 Addr_Sour ++;
  225.         }
  226.         return SUCCESS;
  227. }
  228. /*****************************************************************************
  229. 函數名稱 : Earse_Flash
  230. 功能描述 : 對Flash擦除
  231. 輸入參數 : Addr_Obj:FLASH的目標起始地址
  232. 返回參數 : SUCCESS:擦除成功
  233.             ERROR:擦除失敗
  234. 使用說明 : 無
  235. *****************************************************************************/
  236. u8 Earse_Flash(u16 Addr_Obj)
  237. {
  238.         IapEraseSector(Addr_Obj);
  239.         
  240.         return SUCCESS;
  241. }
  242. /*****************************************************************************
  243. 函數名稱 : Read_Flash
  244. 功能描述 : 讀取FLASH的數據
  245. 輸入參數 : ulAddress:FLASH的起始地址
  246.                                          pulData:源數據
  247.            Length:讀取的字節數
  248. 返回參數 : true:讀取成功
  249.            false:讀取失敗
  250. *****************************************************************************/
  251. u8 Read_Flash(u16 ulAddress,u8 *pulData,u16 Length)
  252. {
  253.         u16 i;
  254.         for(i = 0; i < Length; i ++)
  255.         {
  256.                 *pulData = IapReadByte(ulAddress);
  257.                 ulAddress ++;
  258.                 pulData ++;
  259.         }
  260.                
  261.         return SUCCESS;
  262. }
  263. //==============================================================================
  264. //flash.h
  265. //==============================================================================
  266. #ifndef __USER_FLASH_H__
  267. #define __USER_FLASH_H__

  268. //==============================================================================
  269. //頭文件包含
  270. //==============================================================================
  271. #include "main.h"
  272. #include <intrins.h>
  273. //==============================================================================
  274. //常量定義
  275. //==============================================================================
  276. #define CMD_IDLE    0               //空閑模式
  277. #define CMD_READ    1               //IAP字節讀命令
  278. #define CMD_PROGRAM 2               //IAP字節編程命令
  279. #define CMD_ERASE   3               //IAP扇區擦除命令
  280. #define ENABLE_IAP  0x82            //if SYSCLK<20MHz

  281. #define         Flash_ADDR                                         0x0000

  282. #define                SUCCESS                                                        1
  283. #define                ERROR                                                                0


  284. /*****************************************************************************
  285. 函數名稱 : write_flash
  286. 功能描述 : 對Flash進行字節編程
  287. 輸入參數 : Addr_Sour:寫入的源數據
  288.            Addr_Obj:FLASH的目標起始地址
  289.            Length:寫入的字節數
  290. 返回參數 : SUCCESS:寫入成功
  291.             ERROR:寫入失敗
  292. 使用說明 : 無
  293. *****************************************************************************/
  294. u8 Write_Flash(u16 Addr_Obj,u8 *Addr_Sour,u16 Length);

  295. /*****************************************************************************
  296. 函數名稱 : Earse_Flash
  297. 功能描述 : 對Flash擦除
  298. 輸入參數 : Addr_Obj:FLASH的目標起始地址
  299. 返回參數 : SUCCESS:擦除成功
  300.             ERROR:擦除失敗
  301. 使用說明 : 無
  302. *****************************************************************************/
  303. u8 Earse_Flash(u16 Addr_Obj);

  304. /*****************************************************************************
  305. 函數名稱 : Read_Flash
  306. 功能描述 : 讀取FLASH的數據
  307. 輸入參數 : pulData:源數據
  308.            ulAddress:FLASH的起始地址
  309.            Length:讀取的字節數
  310. 返回參數 : true:讀取成功
  311.            false:讀取失敗
  312. *****************************************************************************/
  313. u8 Read_Flash(u16 ulAddress,u8 *pulData,u16 Length);

  314. #endif
  315. //==============================================================================
復制代碼
望各位高人幫忙指導一下,感謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2020-6-11 10:16 | 只看該作者
不是很明白樓主的問題。STC單片機的內置EEPROM是按扇區劃分的,每個扇區容量512字節,寫數據之前要把整個扇區擦除,哪怕只寫一個字節。多字節數據只能按字節逐一寫入。int型和long型數據得事先分解后才能正確寫入。一次最多只能寫512字節。讀取EEPROM中數據也是按字節逐一讀出,再將原int型和long型數據按寫入時分解方式逆操作還原。
回復

使用道具 舉報

板凳
ID:155507 發表于 2020-6-11 10:50 | 只看該作者
不是內部dataflash讀寫問題

是printf()函數的問題




回復

使用道具 舉報

地板
ID:125243 發表于 2020-6-11 11:51 | 只看該作者
angmall 發表于 2020-6-11 10:50
不是內部dataflash讀寫問題

是printf()函數的問題

確實是打印的問題,非常感謝!!!!!!
回復

使用道具 舉報

5#
ID:125243 發表于 2020-6-11 11:57 | 只看該作者
wulin 發表于 2020-6-11 10:16
不是很明白樓主的問題。STC單片機的內置EEPROM是按扇區劃分的,每個扇區容量512字節,寫數據之前要把整個扇 ...

學習了,謝謝你的指導!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品精品国产色婷婷 | 中文字幕av亚洲精品一部二部 | 亚洲欧洲日韩精品 中文字幕 | 在线 丝袜 欧美 日韩 制服 | 中文字幕亚洲精品在线观看 | 亚洲福利一区二区 | 亚洲精品免费在线观看 | 永久精品 | 综合久久综合久久 | 亚洲国产一区二区三区在线观看 | 久久99蜜桃综合影院免费观看 | 亚洲一区不卡在线 | 国产成人免费 | 亚洲高清av在线 | 精品毛片 | 美女一区二区在线观看 | 午夜伦理影院 | 黄色大片免费网站 | 国产精品免费视频一区 | 国产精品18久久久久久久 | 国产欧美精品区一区二区三区 | 欧美在线a | 午夜激情网 | 青青久久 | 国产欧美在线一区二区 | 九九九色 | h视频在线免费 | 国产一区二区三区亚洲 | 毛片入口 | 午夜专区 | 亚洲精品www久久久久久广东 | 日韩av一区二区在线观看 | 国产日韩精品在线 | 国产精品日韩在线观看一区二区 | 亚洲精品亚洲人成人网 | 国产精品一区二区视频 | 久久av一区二区三区 | 欧美一区二区成人 | 国产午夜精品理论片a大结局 | 国产精品久久久久久久7电影 | 日韩一区二区成人 |