diff --git a/Makefile b/Makefile index 96a72d2..c9c229f 100644 --- a/Makefile +++ b/Makefile @@ -119,6 +119,7 @@ bsp/can/bsp_can.c \ bsp/usart/bsp_usart.c \ bsp/usb/bsp_usb.c \ bsp/log/bsp_log.c \ +bsp/log/bsp_flash.c \ bsp/bsp_init.c \ modules/algorithm/controller.c \ modules/algorithm/kalman_filter.c \ diff --git a/bsp/log/bsp_flash.c b/bsp/log/bsp_flash.c new file mode 100644 index 0000000..dfdf9a9 --- /dev/null +++ b/bsp/log/bsp_flash.c @@ -0,0 +1,289 @@ +#include "bsp_flash.h" +#include "main.h" +#include "string.h" + +static uint32_t ger_sector(uint32_t address); + +/** + * @brief erase flash + * @param[in] address: flash address + * @param[in] len: page num + * @retval none + */ +/** + * @brief 擦除flash + * @param[in] address: flash 地址 + * @param[in] len: 页数量 + * @retval none + */ +void flash_erase_address(uint32_t address, uint16_t len) +{ + FLASH_EraseInitTypeDef flash_erase; + uint32_t error; + + flash_erase.Sector = ger_sector(address); + flash_erase.TypeErase = FLASH_TYPEERASE_SECTORS; + flash_erase.VoltageRange = FLASH_VOLTAGE_RANGE_3; + flash_erase.NbSectors = len; + + HAL_FLASH_Unlock(); + HAL_FLASHEx_Erase(&flash_erase, &error); + HAL_FLASH_Lock(); +} + +/** + * @brief write data to one page of flash + * @param[in] start_address: flash address + * @param[in] buf: data point + * @param[in] len: data num + * @retval success 0, fail -1 + */ +/** + * @brief 往一页flash写数据 + * @param[in] start_address: flash 地址 + * @param[in] buf: 数据指针 + * @param[in] len: 数据长度 + * @retval success 0, fail -1 + */ +int8_t flash_write_single_address(uint32_t start_address, uint32_t *buf, uint32_t len) +{ + static uint32_t uw_address; + static uint32_t end_address; + static uint32_t *data_buf; + static uint32_t data_len; + + HAL_FLASH_Unlock(); + + uw_address = start_address; + end_address = get_next_flash_address(start_address); + data_buf = buf; + data_len = 0; + + while (uw_address <= end_address) + { + + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,uw_address, *data_buf) == HAL_OK) + { + uw_address += 4; + data_buf++; + data_len++; + if (data_len == len) + { + break; + } + } + else + { + HAL_FLASH_Lock(); + return -1; + } + } + + HAL_FLASH_Lock(); + return 0; +} + +/** + * @brief write data to some pages of flash + * @param[in] start_address: flash start address + * @param[in] end_address: flash end address + * @param[in] buf: data point + * @param[in] len: data num + * @retval success 0, fail -1 + */ +/** + * @brief 往几页flash写数据 + * @param[in] start_address: flash 开始地址 + * @param[in] end_address: flash 结束地址 + * @param[in] buf: 数据指针 + * @param[in] len: 数据长度 + * @retval success 0, fail -1 + */ +int8_t flash_write_muli_address(uint32_t start_address, uint32_t end_address, uint32_t *buf, uint32_t len) +{ + uint32_t uw_address = 0; + uint32_t *data_buf; + uint32_t data_len; + + HAL_FLASH_Unlock(); + + uw_address = start_address; + data_buf = buf; + data_len = 0; + while (uw_address <= end_address) + { + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,uw_address, *data_buf) == HAL_OK) + { + uw_address += 4; + data_buf++; + data_len++; + if (data_len == len) + { + break; + } + } + else + { + HAL_FLASH_Lock(); + return -1; + } + } + + HAL_FLASH_Lock(); + return 0; +} + + +/** + * @brief read data for flash + * @param[in] address: flash address + * @param[out] buf: data point + * @param[in] len: data num + * @retval none + */ +/** + * @brief 从flash读数据 + * @param[in] start_address: flash 地址 + * @param[out] buf: 数据指针 + * @param[in] len: 数据长度 + * @retval none + */ +void flash_read(uint32_t address, uint32_t *buf, uint32_t len) +{ + memcpy(buf, (void*)address, len *4); +} + + +/** + * @brief get the sector number of flash + * @param[in] address: flash address + * @retval sector number + */ +/** + * @brief 获取flash的sector号 + * @param[in] address: flash 地址 + * @retval sector号 + */ +static uint32_t ger_sector(uint32_t address) +{ + uint32_t sector = 0; + if ((address < ADDR_FLASH_SECTOR_1) && (address >= ADDR_FLASH_SECTOR_0)) + { + sector = FLASH_SECTOR_0; + } + else if ((address < ADDR_FLASH_SECTOR_2) && (address >= ADDR_FLASH_SECTOR_1)) + { + sector = FLASH_SECTOR_1; + } + else if ((address < ADDR_FLASH_SECTOR_3) && (address >= ADDR_FLASH_SECTOR_2)) + { + sector = FLASH_SECTOR_2; + } + else if ((address < ADDR_FLASH_SECTOR_4) && (address >= ADDR_FLASH_SECTOR_3)) + { + sector = FLASH_SECTOR_3; + } + else if ((address < ADDR_FLASH_SECTOR_5) && (address >= ADDR_FLASH_SECTOR_4)) + { + sector = FLASH_SECTOR_4; + } + else if ((address < ADDR_FLASH_SECTOR_6) && (address >= ADDR_FLASH_SECTOR_5)) + { + sector = FLASH_SECTOR_5; + } + else if ((address < ADDR_FLASH_SECTOR_7) && (address >= ADDR_FLASH_SECTOR_6)) + { + sector = FLASH_SECTOR_6; + } + else if ((address < ADDR_FLASH_SECTOR_8) && (address >= ADDR_FLASH_SECTOR_7)) + { + sector = FLASH_SECTOR_7; + } + else if ((address < ADDR_FLASH_SECTOR_9) && (address >= ADDR_FLASH_SECTOR_8)) + { + sector = FLASH_SECTOR_8; + } + else if ((address < ADDR_FLASH_SECTOR_10) && (address >= ADDR_FLASH_SECTOR_9)) + { + sector = FLASH_SECTOR_9; + } + else if ((address < ADDR_FLASH_SECTOR_11) && (address >= ADDR_FLASH_SECTOR_10)) + { + sector = FLASH_SECTOR_10; + } + else if ((address < ADDR_FLASH_SECTOR_12) && (address >= ADDR_FLASH_SECTOR_11)) + { + sector = FLASH_SECTOR_11; + } + else + { + sector = FLASH_SECTOR_11; + } + + return sector; +} + +/** + * @brief get the next page flash address + * @param[in] address: flash address + * @retval next page flash address + */ +/** + * @brief 获取下一页flash地址 + * @param[in] address: flash 地址 + * @retval 下一页flash地址 + */ +uint32_t get_next_flash_address(uint32_t address) +{ + uint32_t sector = 0; + + if ((address < ADDR_FLASH_SECTOR_1) && (address >= ADDR_FLASH_SECTOR_0)) + { + sector = ADDR_FLASH_SECTOR_1; + } + else if ((address < ADDR_FLASH_SECTOR_2) && (address >= ADDR_FLASH_SECTOR_1)) + { + sector = ADDR_FLASH_SECTOR_2; + } + else if ((address < ADDR_FLASH_SECTOR_3) && (address >= ADDR_FLASH_SECTOR_2)) + { + sector = ADDR_FLASH_SECTOR_3; + } + else if ((address < ADDR_FLASH_SECTOR_4) && (address >= ADDR_FLASH_SECTOR_3)) + { + sector = ADDR_FLASH_SECTOR_4; + } + else if ((address < ADDR_FLASH_SECTOR_5) && (address >= ADDR_FLASH_SECTOR_4)) + { + sector = ADDR_FLASH_SECTOR_5; + } + else if ((address < ADDR_FLASH_SECTOR_6) && (address >= ADDR_FLASH_SECTOR_5)) + { + sector = ADDR_FLASH_SECTOR_6; + } + else if ((address < ADDR_FLASH_SECTOR_7) && (address >= ADDR_FLASH_SECTOR_6)) + { + sector = ADDR_FLASH_SECTOR_7; + } + else if ((address < ADDR_FLASH_SECTOR_8) && (address >= ADDR_FLASH_SECTOR_7)) + { + sector = ADDR_FLASH_SECTOR_8; + } + else if ((address < ADDR_FLASH_SECTOR_9) && (address >= ADDR_FLASH_SECTOR_8)) + { + sector = ADDR_FLASH_SECTOR_9; + } + else if ((address < ADDR_FLASH_SECTOR_10) && (address >= ADDR_FLASH_SECTOR_9)) + { + sector = ADDR_FLASH_SECTOR_10; + } + else if ((address < ADDR_FLASH_SECTOR_11) && (address >= ADDR_FLASH_SECTOR_10)) + { + sector = ADDR_FLASH_SECTOR_11; + } + else /*(address < FLASH_END_ADDR) && (address >= ADDR_FLASH_SECTOR_23))*/ + { + sector = FLASH_END_ADDR; + } + return sector; +} diff --git a/bsp/log/bsp_flash.h b/bsp/log/bsp_flash.h new file mode 100644 index 0000000..ed4a83f --- /dev/null +++ b/bsp/log/bsp_flash.h @@ -0,0 +1,80 @@ +#ifndef _BSP_FLASH_H +#define _BSP_FLASH_H +#include "main.h" + +/* Base address of the Flash sectors */ +#define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base address of Sector 0, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base address of Sector 1, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base address of Sector 2, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base address of Sector 3, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base address of Sector 4, 64 Kbytes */ +#define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base address of Sector 5, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base address of Sector 6, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base address of Sector 7, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base address of Sector 8, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base address of Sector 9, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base address of Sector 10, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base address of Sector 11, 128 Kbytes */ + +#define FLASH_END_ADDR ((uint32_t)0x08100000) /* Base address of Sector 23, 128 Kbytes */ + + +#define ADDR_FLASH_SECTOR_12 ((uint32_t)0x08100000) /* Base address of Sector 12, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_13 ((uint32_t)0x08104000) /* Base address of Sector 13, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_14 ((uint32_t)0x08108000) /* Base address of Sector 14, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_15 ((uint32_t)0x0810C000) /* Base address of Sector 15, 16 Kbytes */ +#define ADDR_FLASH_SECTOR_16 ((uint32_t)0x08110000) /* Base address of Sector 16, 64 Kbytes */ +#define ADDR_FLASH_SECTOR_17 ((uint32_t)0x08120000) /* Base address of Sector 17, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_18 ((uint32_t)0x08140000) /* Base address of Sector 18, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_19 ((uint32_t)0x08160000) /* Base address of Sector 19, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_20 ((uint32_t)0x08180000) /* Base address of Sector 20, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_21 ((uint32_t)0x081A0000) /* Base address of Sector 21, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_22 ((uint32_t)0x081C0000) /* Base address of Sector 22, 128 Kbytes */ +#define ADDR_FLASH_SECTOR_23 ((uint32_t)0x081E0000) /* Base address of Sector 23, 128 Kbytes */ + + + +/** + * @brief erase flash + * @param[in] address: flash address + * @param[in] len: page num + * @retval none + */ +void flash_erase_address(uint32_t address, uint16_t len); + +/** + * @brief write data to one page of flash + * @param[in] start_address: flash address + * @param[in] buf: data point + * @param[in] len: data num + * @retval success 0, fail -1 + */ +int8_t flash_write_single_address(uint32_t start_address, uint32_t *buf, uint32_t len); + + +/** + * @brief write data to some pages of flash + * @param[in] start_address: flash start address + * @param[in] end_address: flash end address + * @param[in] buf: data point + * @param[in] len: data num + * @retval success 0, fail -1 + */ +int8_t flash_write_muli_address(uint32_t start_address, uint32_t end_address, uint32_t *buf, uint32_t len); + +/** + * @brief read data for flash + * @param[in] address: flash address + * @param[out] buf: data point + * @param[in] len: data num + * @retval none + */ +void flash_read(uint32_t address, uint32_t *buf, uint32_t len); + +/** + * @brief get the next page flash address + * @param[in] address: flash address + * @retval next page flash address + */ +uint32_t get_next_flash_address(uint32_t address); +#endif