前面記錄了空調(diào)控制的各個(gè)模塊的開發(fā)過程,這篇帖子對于之前的開發(fā)過程做一個(gè)總結(jié)。包含電路介紹、過程演示以及固件,開頭主要介紹Flash的操作。
確認(rèn)存儲使用的FLash地址
1、查看Flash:
借助Jlink查看Flash的數(shù)據(jù)。
連接芯片:
讀取整片F(xiàn)lash:
查看Data Flash區(qū)域:
寫Flash的程序無法運(yùn)行:R_FLASH_LP_bgo_example()。野火以及官方的資料使用的Flash都是基于外部Flash的,參考意義有限。最終參考FPS包自帶的例程進(jìn)行Flash的操作。
2、參考例程讀寫 Data Flash
當(dāng)前方案:采用系統(tǒng)的API加入延時(shí)后,F(xiàn)lash寫入成功(寫入地址:0x4010_0000U):
Flash操作關(guān)鍵代碼(注意:去掉了擦除檢查,加上了延時(shí)!):
void R_FLASH_LP_basic_example (void)
{
/* Initialize p_src to known data */
vTaskDelay (10);
for (uint32_t i = 0; i < TRANSFER_LENGTH; i++)
{
g_src = (uint8_t) ('A' + (i % 26));
}
/* Open the flash lp instance. */
err = R_FLASH_LP_Open(&g_flash0_ctrl, &g_flash0_cfg);
assert(FSP_SUCCESS == err);
vTaskDelay (10);
/* Erase 1 block of data flash starting at block 0. */
err = R_FLASH_LP_Erase(&g_flash0_ctrl, FLASH_DF_BLOCK_0, 1);
assert(FSP_SUCCESS == err);
vTaskDelay (10);
/* Write 32 bytes to the first block of data flash. */
err = R_FLASH_LP_Write(&g_flash0_ctrl, (uint32_t) g_src, FLASH_DF_BLOCK_0, TRANSFER_LENGTH);
assert(FSP_SUCCESS == err);
vTaskDelay (10);
memcpy((uint32_t)g_dest, FLASH_DF_BLOCK_0, FLASH_LP_EXAMPLE_WRITE_SIZE);
///< 將數(shù)據(jù)使用串口發(fā)送出去
buff_len = FLASH_LP_EXAMPLE_WRITE_SIZE;//strlen(g_dest);
err = R_SCI_UART_Write(&g_uart0_ctrl, g_dest, buff_len);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
}
3、采用共用體存儲浮點(diǎn)型數(shù)據(jù)
參考:https://code84.com/454972.html
4、當(dāng)前存儲遇到的問題
存儲數(shù)據(jù)讀取數(shù)據(jù)有問題,寫入數(shù)據(jù)讀取回來的數(shù)據(jù)匹配不上。
存取的數(shù)據(jù)為:
讀取的數(shù)據(jù):
首先定位:保存數(shù)據(jù)(進(jìn)行Flash寫操作)其實(shí)已經(jīng)出問題了:
修改代碼后,當(dāng)前保存的數(shù)據(jù)沒有問題:
解碼的數(shù)據(jù) | 保存的數(shù)據(jù) |
---|---|
保存數(shù)據(jù)到127時(shí)出錯(cuò)(讀取回來的數(shù)據(jù)為144):
定位到原因:當(dāng)前數(shù)據(jù)量太大了,1片扇區(qū)為1024字節(jié),1個(gè)溫度數(shù)據(jù)就高達(dá)600個(gè)字節(jié),每次默認(rèn)只擦除1個(gè)扇區(qū),所以在1K地址外的數(shù)據(jù)沒有擦除就執(zhí)行了寫入,發(fā)生錯(cuò)誤。
5、設(shè)置每一個(gè)電平的時(shí)間為32bit,使用4字節(jié)存儲
26攝氏度的命令存儲地址:
實(shí)際上,按照高電平+低電平的存儲,每一條控制命令的存儲字節(jié)為1200字節(jié)(后面想辦法再壓縮)。
1個(gè)電平存儲的時(shí)間使用32bit數(shù)據(jù)來存儲,也就是4字節(jié)存儲。當(dāng)前默認(rèn)1條命令為139個(gè)PWM,為了預(yù)留部分空間,每一條命令分配15024字節(jié)進(jìn)行存儲。
當(dāng)前在Data Flash中,開辟了3塊區(qū)域,分別存儲2條溫度指令,以及1條關(guān)機(jī)指令。
6、溫度控制邏輯
1、解碼溫度數(shù)據(jù),測試命令能夠成功控制空調(diào);可以成功控制,將數(shù)據(jù)保存到Flash,溫度控制的時(shí)候?qū)?shù)據(jù)讀取出來,等待信號控制。
2、大于27攝氏度,打開空調(diào);溫度低于26攝氏度,關(guān)閉空調(diào)。
保存溫度數(shù)據(jù):
選擇保存數(shù)據(jù)的地址:
7、系統(tǒng)構(gòu)成
整個(gè)系統(tǒng)為了后期可以方便增加或者減少模塊,所有采用杜邦線連接各個(gè)模塊。因?yàn)?a href="http://www.wenjunhu.com/tags/紅外/" target="_blank">紅外發(fā)射模塊的有效距離小于3米,所以使用了延長線-模塊如前面介紹。
引腳分配:
紅外接收GPIO引腳:P102 -INPUT;
紅外發(fā)射GPIO引腳:P213 -PWM;
固件代碼:
oled12864.zip(60.26 KB)
oled12864 - code.zip(9.43 MB)
-
電路
+關(guān)注
關(guān)注
172文章
5950瀏覽量
172594 -
FlaSh
+關(guān)注
關(guān)注
10文章
1640瀏覽量
148307 -
空調(diào)控制
+關(guān)注
關(guān)注
0文章
18瀏覽量
10961
發(fā)布評論請先 登錄
相關(guān)推薦
評論