求教,在讀出寫入到STC15W4K32S4內部dataflash的數據時,為什么定義成unsigned char和unsigned long型變量的數據會出錯?unsigned int變量讀出的數據是正確的,如下圖:
6bdffd461334bfadaf6e6ee35d6fd245_171203aqi313hrci1x2w39.png (336.56 KB, 下載次數: 20)
下載附件
2020-6-10 21:49 上傳
代碼如下:
- //main.c
- //=====================================================================================
- #include "main.h"
- #include <stdio.h>
- type_status status_test;
- void muc_init();
- void delay1s(void);
- void UART_init(void);
- /*****************************************************************************
- 函數名稱 : main()
- 功能描述 : 主函數
- 輸入參數 : 無
- 返回參數 : 無
- 使用說明 : 無
- *****************************************************************************/
- void main()
- {
- muc_init();
- Read_Flash(Flash_ADDR,(u8*)&status_test,sizeof(status_test));
- printf("讀取flash十六進制a:0x%x\n",status_test.a);
- printf("讀取flash十進制a:%d\n",status_test.a);
- printf("讀取flash十六進制b:0x%x\n",status_test.b);
- printf("讀取flash十進制b:%d\n",status_test.b);
- printf("讀取flash十六進制c:0x%x\n",status_test.c);
- printf("讀取flash十進制c:%d\n",status_test.c);
- Earse_Flash(Flash_ADDR);
- while(1)
- {
- status_test.a = 2;
- status_test.b = 3;
- status_test.c = 4;
- Write_Flash(Flash_ADDR,(u8*)&status_test, sizeof(status_test));
- while(1);
- }
- }
- /*****************************************************************************
- 函數名稱 : gpio()
- 功能描述 : IO口初始化
- 輸入參數 : 無
- 返回參數 : 無
- 使用說明 : 無
- *****************************************************************************/
- void gpio()
- {
- P0M1 = 0x00;
- P0M0 = 0x00;
-
- P3M1 = 0x00;
- P3M0 = 0x00;
- P1M1 = 0x00;
- P1M0 = 0x00;
- P5M1 = 0x00;
- P5M0 = 0x00;
- }
- /*****************************************************************************
- 函數名稱 : muc_init
- 功能描述 : mcu初始化
- 輸入參數 : 無
- 返回參數 : 無
- 使用說明 : 無
- *****************************************************************************/
- void muc_init()
- {
- gpio();
- UART_init();
- }
- /*****************************************************************************
- 函數名稱 : UART_init
- 功能描述 : UART初始化
- 輸入參數 : 無
- 返回參數 : 無
- 使用說明 : 無
- *****************************************************************************/
- void UART_init(void)
- {
- //下面代碼設置定時器1
- TMOD = 0x20; // 0010 0000 定時器1工作于方式2(8位自動重裝方式)
- TH1 = 0xFD; // 波特率:9600 /11.0592MHZ
- TL1 = 0xFD; // 波特率:9600 /11.0592MHZ
- TR1 = 1;
- //下面代碼設置定串口
- AUXR = 0x00; // 很關鍵,使用定時器1作為波特率發生器,S1ST2=0
- SCON = 0x50; // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接受)
- TI=1; // 很關鍵,使用printf函數時必須有此命令
- }
- //==========================================================================================
- //main.h
- //==========================================================================================
- #ifndef __MAIN_H__
- #define __MAIN_H__
- //==============================================================================
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- //==============================================================================
- #include "STC15W4K.H"
- #include "flash.h"
- //==============================================================================
- //管腳定義
- //==============================================================================
- sbit led1 = P1^2; //open指示燈
- sbit led2 = P1^3; //stop指示燈
- sbit led3 = P1^4; //close指示燈
- sbit rs_signal = P1^5; //雨滴傳感器信號
- sbit ocp = P1^6; //過流保護
- sbit in1 = P1^7;
- sbit in2 = P5^4; //馬達正反轉控制
- sbit sw_open = P3^5;
- sbit sw_stop = P3^4;
- sbit sw_close = P3^3;
- sbit rx_out = P3^2; //433MHz解碼
- sbit p06 = P0^6;
- sbit p07 = P0^7;
- //==============================================================================
- //變量定義
- //==============================================================================
- typedef struct
- {
- u8 a;
- u16 b;
- u32 c;
- } type_status;
- extern type_status status_test;
- #endif
- //==============================================================================
- //flash.c
- //==============================================================================
- #include "flash.h"
- /*****************************************************************************
- 函數名稱 : IapIdle
- 功能描述 : 關閉IAP
- 輸入參數 : 無
- 返回參數 : 無
- *****************************************************************************/
- static void IapIdle(void)
- {
- IAP_CONTR = 0x00; //關閉IAP功能
- IAP_CMD = 0x00; //清除命令寄存器
- IAP_TRIG = 0x00; //清除觸發寄存器
- IAP_ADDRH = 0xff; //將地址設置到非IAP區域
- IAP_ADDRL = 0xff;
- }
- /*****************************************************************************
- 函數名稱 : IapReadByte
- 功能描述 : 從ISP/IAP/EEPROM區域讀取一字節
- 輸入參數 : addr:起始地址
- 返回參數 : 無
- *****************************************************************************/
- static u8 IapReadByte(u16 addr)
- {
- u8 dat; //數據緩沖區
- IAP_CONTR = ENABLE_IAP; //使能IAP
- IAP_CMD = CMD_READ; //設置IAP命令
- IAP_ADDRL = addr; //設置IAP低地址
- IAP_ADDRH = addr >> 8; //設置IAP高地址
- IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
- IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
- _nop_(); //等待ISP/IAP/EEPROM操作完成
- _nop_();
- _nop_();
- _nop_();
- dat = IAP_DATA; //讀ISP/IAP/EEPROM數據
- IapIdle(); //關閉IAP功能
- return dat; //返回
- }
- /*****************************************************************************
- 函數名稱 : IapProgramByte
- 功能描述 : 寫一字節數據到ISP/IAP/EEPROM區域
- 輸入參數 : addr:起始地址/dat:待寫入數據
- 返回參數 : 無
- *****************************************************************************/
- static void IapProgramByte(u16 addr, u8 dat)
- {
- IAP_CONTR = ENABLE_IAP; //使能IAP
- IAP_CMD = CMD_PROGRAM; //設置IAP命令
- IAP_ADDRL = addr; //設置IAP低地址
- IAP_ADDRH = addr >> 8; //設置IAP高地址
- IAP_DATA = dat; //寫ISP/IAP/EEPROM數據
- IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
- IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
- _nop_(); //等待ISP/IAP/EEPROM操作完成
- _nop_();
- _nop_();
- _nop_();
- IapIdle();
- }
- /*****************************************************************************
- 函數名稱 : IapEraseSector
- 功能描述 : 扇區擦除
- 輸入參數 : addr:起始地址
- 返回參數 : 無
- *****************************************************************************/
- static void IapEraseSector(u16 addr)
- {
- IAP_CONTR = ENABLE_IAP; //使能IAP
- IAP_CMD = CMD_ERASE; //設置IAP命令
- IAP_ADDRL = addr; //設置IAP低地址
- IAP_ADDRH = addr >> 8; //設置IAP高地址
- IAP_TRIG = 0x5a; //寫觸發命令(0x5a)
- IAP_TRIG = 0xa5; //寫觸發命令(0xa5)
- _nop_(); //等待ISP/IAP/EEPROM操作完成
- _nop_();
- _nop_();
- _nop_();
- IapIdle();
- }
- /*****************************************************************************
- 函數名稱 : Write_Flash
- 功能描述 : 對Flash進行字節編程
- 輸入參數 : Addr_Obj:FLASH的目標起始地址
- Addr_Sour:寫入的源數據
- Length:寫入的字節數
- 返回參數 : SUCCESS:寫入成功
- ERROR:寫入失敗
- 使用說明 : 無
- *****************************************************************************/
- u8 Write_Flash(u16 Addr_Obj,u8 *Addr_Sour,u16 Length)
- {
- u16 i;
- for(i = 0; i < Length; i ++)
- {
- IapProgramByte(Addr_Obj,*Addr_Sour);
- Addr_Obj ++;
- Addr_Sour ++;
- }
- return SUCCESS;
- }
- /*****************************************************************************
- 函數名稱 : Earse_Flash
- 功能描述 : 對Flash擦除
- 輸入參數 : Addr_Obj:FLASH的目標起始地址
- 返回參數 : SUCCESS:擦除成功
- ERROR:擦除失敗
- 使用說明 : 無
- *****************************************************************************/
- u8 Earse_Flash(u16 Addr_Obj)
- {
- IapEraseSector(Addr_Obj);
-
- return SUCCESS;
- }
- /*****************************************************************************
- 函數名稱 : Read_Flash
- 功能描述 : 讀取FLASH的數據
- 輸入參數 : ulAddress:FLASH的起始地址
- pulData:源數據
- Length:讀取的字節數
- 返回參數 : true:讀取成功
- false:讀取失敗
- *****************************************************************************/
- u8 Read_Flash(u16 ulAddress,u8 *pulData,u16 Length)
- {
- u16 i;
- for(i = 0; i < Length; i ++)
- {
- *pulData = IapReadByte(ulAddress);
- ulAddress ++;
- pulData ++;
- }
-
- return SUCCESS;
- }
- //==============================================================================
- //flash.h
- //==============================================================================
- #ifndef __USER_FLASH_H__
- #define __USER_FLASH_H__
- //==============================================================================
- //頭文件包含
- //==============================================================================
- #include "main.h"
- #include <intrins.h>
- //==============================================================================
- //常量定義
- //==============================================================================
- #define CMD_IDLE 0 //空閑模式
- #define CMD_READ 1 //IAP字節讀命令
- #define CMD_PROGRAM 2 //IAP字節編程命令
- #define CMD_ERASE 3 //IAP扇區擦除命令
- #define ENABLE_IAP 0x82 //if SYSCLK<20MHz
- #define Flash_ADDR 0x0000
- #define SUCCESS 1
- #define ERROR 0
- /*****************************************************************************
- 函數名稱 : write_flash
- 功能描述 : 對Flash進行字節編程
- 輸入參數 : Addr_Sour:寫入的源數據
- Addr_Obj:FLASH的目標起始地址
- Length:寫入的字節數
- 返回參數 : SUCCESS:寫入成功
- ERROR:寫入失敗
- 使用說明 : 無
- *****************************************************************************/
- u8 Write_Flash(u16 Addr_Obj,u8 *Addr_Sour,u16 Length);
- /*****************************************************************************
- 函數名稱 : Earse_Flash
- 功能描述 : 對Flash擦除
- 輸入參數 : Addr_Obj:FLASH的目標起始地址
- 返回參數 : SUCCESS:擦除成功
- ERROR:擦除失敗
- 使用說明 : 無
- *****************************************************************************/
- u8 Earse_Flash(u16 Addr_Obj);
- /*****************************************************************************
- 函數名稱 : Read_Flash
- 功能描述 : 讀取FLASH的數據
- 輸入參數 : pulData:源數據
- ulAddress:FLASH的起始地址
- Length:讀取的字節數
- 返回參數 : true:讀取成功
- false:讀取失敗
- *****************************************************************************/
- u8 Read_Flash(u16 ulAddress,u8 *pulData,u16 Length);
- #endif
- //==============================================================================
復制代碼 望各位高人幫忙指導一下,感謝! |