123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #include "board.h"
- /**
- * 读取flash一个字
- *
- * @author Lim (2023/3/15)
- *
- * @param pos
- *
- * @return uint32_t
- */
- uint32_t hw_flash_read_word(uint32_t pos)
- {
- return *(vu32*)pos;
- }
- /**
- * 读取硬件参数保存部分,要求数据指针地址是4字节对齐
- *
- * @author lxz (2019/5/30/周四)
- *
- * @param data
- *
- * @return int
- */
- int hw_flash_read(uint32_t pos, void *data, uint32_t length) {
- uint32_t *dat = data;
- int size = 0;
- for (size = 0; size < length; size++) {
- *dat = hw_flash_read_word(pos + size);
- dat++;
- }
- return size;
- }
- /**
- * 写入硬件参数部分,要求数据指针地址是4字节对齐
- *
- * @author lxz (2019/5/30/周四)
- *
- * @param data
- *
- * @return int
- */
- int hw_flash_write(uint32_t pos, void *data, uint32_t length) {
- int size = 0;
- uint32_t *ptr = data;
- //开始编写参数
- INTX_DISABLE();
- fmc_unlock();
- for (size = 0; size < length; size++) {
- if (fmc_word_program(pos,*ptr) != FMC_READY)
- {
- break;
- }
- ptr++;
- pos += 4;
- }
- fmc_lock();
- INTX_ENABLE();
- return length;
- }
- /**
- * 擦除地址所在的扇区
- *
- * @author lxz
- *
- * @param pos
- */
- void hw_flash_erase(uint32_t pos) {
- INTX_DISABLE();
- fmc_unlock();
- fmc_page_erase(pos & 0xFFFFF400U);
- fmc_lock();
- INTX_ENABLE();
- }
- /**
- * 检查指定的空间是否能写入
- *
- * @author lxz (2019/5/31/周五)
- *
- * @param pos 必须保证32字节对齐的地址
- * @param length
- *
- * @return int
- */
- int hw_flash_data_is_valid(uint32_t pos, uint32_t length) {
- length = (length + 3) / 4;
- while (length > 0) {
- if (hw_flash_read_word(pos) != 0xFFFFFFFF) {
- break;
- }
- length--;
- pos += 4;
- }
- return length;
- }
|