Здравствуйте. Есть чип STM32F103T8Ux
Пишу для него бутлодер с использованием HAL.
И вроде все хорошо. Считывание работает а вот запись как попало.
Пишу через Win32DiskImager
При записи алгоритм простой. Считать всю страницу, изменить данные и записать всю страницу обратно. Но почему то при записи Win32DiskImager постоянно вываливается в ошибку. Хотя данные вроде бы в чип пишутся.
Что я делаю не так?
Вот код:
Код:
|
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
uint32_t i;
uint32_t dest_offset = FLASH_DISK_START_ADDRESS + (blk_addr * STORAGE_BLK_SIZ);
uint32_t page_begin = (dest_offset / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE;
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PAGEError = 0;
uint32_t* ptr = (uint32_t*) &page_buffer[0];
if (( STORAGE_BLK_NBR - blk_addr) ‹= 0)
return USBD_OK;
return USBD_OK; если ставить выход тут то все быстро и Win32DiskImager говори что все ок.
// read all page
// ну тут то вроде все правильно.. неужели чтение 1024 байта так много времени занимает ... (((
memset(page_buffer,0xff,FLASH_PAGE_SIZE);
memcpy(page_buffer, (__IO uint32_t*) page_begin, FLASH_PAGE_SIZE);
memcpy(page_buffer + (blk_addr * STORAGE_BLK_SIZ), buf, STORAGE_BLK_SIZ);
return USBD_OK; если ставить выход тут то Win32DiskImager всегда вываливается в ошибку.
switch (lun) {
case 0:
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = page_begin;
EraseInitStruct.NbPages = 1;
EraseInitStruct.Banks = FLASH_BANK_1;
HAL_FLASH_Unlock(); // Разблокируем флеш память
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) == HAL_OK) {
// думал что этот код медленно выполняется поэтому не успевает ответ послать но это не так
// for (i = 0; i ‹ FLASH_PAGE_SIZE; i += 8)
// {
// if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (__IO uint32_t*)(page_begin + i), *ptr) == HAL_OK) {
// ptr++;
// // Записываем значение переменной
// } else
// break;
// }
}
HAL_FLASH_Lock(); // Блокируем флеш память
break;
case 1:
break;
default:
return USBD_FAIL;
}
return (USBD_OK);
/* USER CODE END 7 */
} |
Я косяк ))) Неправильно сдвиги по страницам посчитал.
Вот правильный вариант:
Код:
|
uint32_t page_begin = (dest_offset / FLASH_PAGE_SIZE) * FLASH_PAGE_SIZE;
uint32_t page_offset = dest_offset % FLASH_PAGE_SIZE;
....
// read all page
memset(page_buffer, 0xff, FLASH_PAGE_SIZE);
memcpy(page_buffer, (__IO uint32_t*) page_begin, FLASH_PAGE_SIZE);
memcpy(page_buffer + page_offset, buf, STORAGE_BLK_SIZ); |