------------230303更新--------------------
經(jīng)過(guò)這兩天的測(cè)試,F(xiàn)LASH讀數(shù)據(jù)異常問(wèn)題可穩(wěn)定復(fù)現(xiàn),復(fù)現(xiàn)過(guò)程如下:
新建一個(gè)工程,新建關(guān)于FLASH操作的文件,包含兩個(gè)函數(shù):一個(gè)向指定地址寫數(shù)據(jù),一個(gè)讀指定地址數(shù)據(jù)。
在main.c中,先向指定地址寫數(shù)據(jù)01,然后讀該地址數(shù)據(jù),之后再向該地址寫數(shù)據(jù)02,最后讀該地址數(shù)據(jù)并打印輸出。
理論上打印輸出值應(yīng)該為02,但實(shí)際打印輸出值為01。
相關(guān)代碼如下:
FLASH操作文件的兩個(gè)函數(shù):
void Flash_save(u16 dat) {
? ? FLASH_Unlock_Fast();
? ? FLASH_ErasePage_Fast(0x0800E080);
? ? FLASH_BufReset();
? ? FLASH_BufLoad(0x0800E080, dat, 0, 0, 0);
? ? FLASH_ProgramPage_Fast(0x0800E080);
? ? FLASH_Lock_Fast();
}
//讀取指定地址的半字(16位數(shù)據(jù))
uint16_t FLASH_ReadHalfWord(uint32_t address) {
? ? return *(__IO uint16_t*) address;
}
MAIN.C的相關(guān)代碼:
int main(void) {
? ? GPIO_InitTypeDef GPIO_t;
? ? u16 n1, n2;
? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
? ? Delay_Init();
? ? USART_Printf_Init(9600);
? ? //485設(shè)置為輸出模式
? ? GPIO_t.GPIO_Mode = GPIO_Mode_Out_PP;
? ? GPIO_t.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_t.GPIO_Pin = GPIO_Pin_8;
? ? GPIO_Init(GPIOA, &GPIO_t);
? ? GPIO_SetBits(GPIOA, GPIO_Pin_8);
? ? printf("SystemClk:%d\r\n", SystemCoreClock);
? ? printf("This is printf example\r\n");
? ? n2 = 0;
? ? Flash_save(0x01);
? ? while(1)
? ? {
? ? ? ? if (n2 < 1000)
? ? ? ? {
? ? ? ? ? ? ++n2;
? ? ? ? ? ? printf("test flash save read\r\n");
? ? ? ? ? ? Delay_Ms(3000);
? ? ? ? ? ? //n1 = *(u16 *)(0x0800E080);
? ? ? ? ? ? n1 = FLASH_ReadHalfWord(0x0800e080);
? ? ? ? ? ? Flash_save(0x20);
? ? ? ? ? ? //n1 = *(u16 *)(0x0800E080);
? ? ? ? ? ? n1 = FLASH_ReadHalfWord(0x0800e080);
? ? ? ? ? ? printf("n1=:%d\r\n",n1);
? ? ? ? }
? ? }
}
--------------------------------------------以下是原問(wèn)題描述----------------------------------------------------------
使用CH32V103C8T6,通過(guò)RS485通訊發(fā)送指令修改RS485通訊地址,寫完數(shù)據(jù)之后馬上讀取以驗(yàn)證寫數(shù)據(jù)是否成功,但讀出的數(shù)據(jù)仍是寫之前的舊的485地址。開(kāi)始以為是寫數(shù)據(jù)失敗,但通過(guò)讀地址指令讀出來(lái)的地址又是更改后的地址,在OLED顯示界面調(diào)取485地址,也是寫后的新地址。
但是在處理485通訊的函數(shù)內(nèi),寫完485地址,馬上去讀寫入后的地址,讀出來(lái)的卻始終是原來(lái)的舊地址。
程序部分代碼如下:
if (regValue[0] == 0 || regValue[0] > 247) //按協(xié)議,地址范圍在1-247
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? Flash_Save_RS485ID(regValue[0]);
????????????//測(cè)試用,正式版刪除
? ? ? ? ? ? tx_buf[2] = msg_t->rx_buf[2];
? ? ? ? ? ? tx_buf[3] = msg_t->rx_buf[3];
? ? ? ? ? ? regValue[1] = FLASH_ReadHalfWord(SIMD_RS485_BASE_ADDR);??
? ? ? ? ? ? tx_buf[4] = regValue[1]>>8;
? ? ? ? ? ? tx_buf[5] = regValue[1];
? ? ? ? ? ? RS485_SendData(tx_buf, 6);
? ? ? ? ? ? return;
????????????//驗(yàn)證寫地址是否成功
? ? ? ? ? ? if (regValue[0] != *(u16 *) (SIMD_RS485_BASE_ADDR))
? ? ? ? ? ? ? ? return;
以上代碼寫數(shù)據(jù)是成功的,后續(xù)用讀485地址指令可以正常讀出更改后的新485地址,在OLED顯示界面調(diào)出485地址也是新的地址。
但在寫完后馬上讀數(shù)據(jù)以驗(yàn)證寫入是否成功的時(shí)候,讀出的數(shù)據(jù)卻始終是舊的數(shù)據(jù)。