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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2991|回復: 6
收起左側

32單片機軟件ROM自檢程序怎么寫?

[復制鏈接]
ID:404662 發表于 2023-2-13 15:42 | 顯示全部樓層 |閱讀模式
現在在做一款32位單片機軟件自檢程序,在做ROM的CRC校驗自檢時遇到問題,認證公司要求先把程序的CRC校驗值寫到FLASH固定地址里面(該地址不做CRC校驗),進入自檢的時候程序進行CRC計算,然后與放在FLASH固定地址的CRC比較來檢驗ROM區域的程序是否有異常變化,自己寫了程序應該是有BUG,有大佬提供一下例程不?

// 引用外部函數extern uint32_t iec60730_ram_march_bist_test(uint32_t addr);extern void iec60730_reg_r1_r4_bist_test(void);extern void iec60730_reg_r0_bist_test(void);extern void iec60730_reg_r8_r12_bist_test(void);extern void iec60730_reg_sp_bist_test(void);extern void iec60730_reg_spec_bist_test(void);extern void iec60730_reg_lr_bist_test(void);extern void iec60730_pc_test(void);extern CPUStatus STL_RunTimeCPUTest(void);void PC_Test_Func1(void)__attribute__((section(".ARM.__at_0x00003ff0"))); //地址以4為單位遞增,不然編譯不通過,函數聲明需要放在文件最上面聲明void PC_Test_Func2(void)__attribute__((section(".ARM.__at_0x0000400c"))); const  uint32_t  CRC_Result __attribute__((at(0x00007F8C))) = 0x00006EFF;uint32_t RamTestResult = 0;uint32_t CpuTestResult = 0;uint32_t crcResult = 0;/*flash self test*/static uint32_t _FLASH_CRC;// 棧底數據__IO uint32_t StackOverFlowPtrn[4]   __attribute__((section("STACK_BOTTOM"), zero_init));// 每次校驗的數據量#define ROM_BIST_SIZE           8 /*  8 bytes every time */#define ROM_START (0x0)#define FLASH_ROM_START_ADDR (0x0)#define FLASH_ROM_SIZE       (20480)//(32*1024)//#define FLASH_ROM_SIZE       (32*1024)#define ROM_END   ((uint32_t)(FLASH_ROM_SIZE - 1))#define ROM_SIZE  ((uint32_t)ROM_END - (uint32_t)ROM_START + 1)static volatile uint32_t hw_crc,sw_crc;// bref: 測試flash// para:// note:static void ROM_Test(void){        stl_uint8_t* p_flash_start_addr = (stl_uint8_t*)FLASH_ROM_START_ADDR;        iec_test_result.rom_test_result = IEC_TEST_SUCCESS;                CRC_Init();        /*open crc apb clock*/        SYS_EnablePeripheralClk(SYS_CLK_CRC_MSK);        /* use hardware CRC16 to calculate expected crc first,                  then verify if the CRC code calculated by software is same with expected crc */           hw_crc = IEC60730_HardwareCRC16Gen(p_flash_start_addr, ROM_SIZE);        if(IEC60730_TEST_NORMAL != IEC60730_SoftwareCRC16Test(p_flash_start_addr, ROM_SIZE, hw_crc)){                iec_test_result.rom_test_result = IEC_TEST_FAIL;        }        // 使用過硬件CRC 完成一個完整的校驗 選喲重新初始化        CRC_Init();        /* use software CRC16 to calculate expected crc first,                  then verify if the CRC code calculated by hardware is same with expected crc */        sw_crc = IEC60730_SoftwareCRC16Gen(p_flash_start_addr, ROM_SIZE);        if(IEC60730_TEST_NORMAL != IEC60730_HardwareCRC16Test(p_flash_start_addr,ROM_SIZE, sw_crc)){                iec_test_result.rom_test_result = IEC_TEST_FAIL;        }                // 記錄整個flash 區域的校驗值        _FLASH_CRC = hw_crc;        crcResult = CRC_Result;        if(crcResult == sw_crc)//_FLASH_CRC CRC_Result        {                iec_test_result.rom_test_result = IEC_TEST_SUCCESS;        }        else        {                iec_test_result.rom_test_result = IEC_TEST_FAIL;        }        }
回復

使用道具 舉報

ID:996773 發表于 2023-2-15 16:14 | 顯示全部樓層
程序rom還能自檢?本人才疏學淺,一般單片機程序稍大一些1k起步,再大幾十k夠大了,如何自檢每個字節

甚至每個位能無差錯?用什么原理,拭目以待等候高手出現
回復

使用道具 舉報

ID:1044091 發表于 2023-2-15 16:53 | 顯示全部樓層
STP ISP 在讀入hex文件那一刻,已經對整個hex進行校驗計算了。
捕獲.PNG
回復

使用道具 舉報

ID:89217 發表于 2023-2-15 22:19 | 顯示全部樓層
理論上只要程序正常運行,程序就是對的,如果還要較驗的話有什么意義?會不會被人故意刁難?

回復

使用道具 舉報

ID:1044091 發表于 2023-2-15 23:15 來自手機 | 顯示全部樓層
我自己寫的eeprom連續讀寫代碼,每次存入12個字節。第一位是序號,第2~11位是數據,第12位是校驗位。讀的時候校驗一次,有問題就讀默認數據。目的是為了防止eeprom寫入錯誤,比如存儲單元損壞,或寫入時意外斷電等。雖然幾率很小,但有預案總比沒有強。
回復

使用道具 舉報

ID:1044091 發表于 2023-2-16 19:27 | 顯示全部樓層
按照我的理解,所謂校驗就是按地址順序讀出這段數據,然后計算(比如累加求和),再與已存在的校驗位比較,一致就是哪都沒錯往下走;不一致就報錯或者B計劃。應該幾句代碼就搞定了,為何被你寫的如此復雜?
回復

使用道具 舉報

ID:496636 發表于 2023-2-19 00:11 | 顯示全部樓層
CRC較驗啊,浙大中控,在工程師站編好程序后,編譯下載到控制站,下載好后,再回讀,進行CRC較驗,得到CRC較驗值與編譯好后下載前計算出來的CRC較驗值進行比較,如果相等,下載到控制站的程序無誤。
同時,這次回讀生成的CRC較驗值將保存起來,下次編譯后要下載的時候,將當前的程序的CRC較驗值與上次保存的CRC值比較,如果相等,提示程序沒有變化,無須下載,如果不相等,提示下載后會改變原來的程序,是否繼續。
CRC較驗就是用商定好的一個數據作為除數,待較驗的數據作為被除數,進行除法運算,除法運算的時候沒有進位和借位
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品不卡一区二区三区 | 国产激情偷乱视频一区二区三区 | 一道本不卡视频 | 成人av片在线观看 | 国产精品入口麻豆www | 欧美做暖暖视频 | 中文二区 | 久久综合九九 | 亚洲国产一区二区三区四区 | 精品成人av | 国产xxxx岁13xxxxhd | 亚洲国产一区在线 | 欧美一级免费片 | 欧美另类视频在线 | 欧美激情在线观看一区二区三区 | 日本在线精品视频 | 成年人免费看 | 一级黄色片日本 | 免费视频一区二区三区在线观看 | 久草.com| 每日更新av| 免费观看一级特黄欧美大片 | 免费日本视频 | 中文字幕在线免费视频 | 成人在线视频一区 | 欧美成人久久 | 中文字幕国产一区 | 亚洲一区二区视频在线播放 | 成年人黄色一级毛片 | 国产精品中文字幕在线 | 成人av激情 | 日韩欧美亚洲综合 | 亚洲美女网站 | 国产欧美精品一区二区 | 欧美日韩国产精品一区 | 91看片在线观看 | 国内精品一区二区 | 99re在线 | 福利精品| 日韩网站免费观看 | 视频一区中文字幕 |