Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 21.01.2019, 12:20  
worldmasters
Гражданин KAZUS.RU
 
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
worldmasters на пути к лучшему
По умолчанию Проблема с бутлодером

Здравствуйте. Есть чип 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);
Реклама:

Последний раз редактировалось worldmasters; 21.01.2019 в 13:44.
worldmasters вне форума  
Непрочитано 21.01.2019, 13:54  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,853 раз(а) в 2,924 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проблема с бутлодером

worldmasters, "маловато будет"(c)
Кроме самого кода, нужны подробности о возникающей ошибке.
Неплохо бы и на сам обмен между ПК и МК посмотреть.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с FT232BM (FT232BL) anbsoft Микроконтроллеры, АЦП, память и т.д 27 07.08.2010 09:33
Проблема с DC/DC locostudy Источники питания и свет 2 03.11.2008 12:10
p30f6010A проблема с переключением состояния портов Ilya Микроконтроллеры, АЦП, память и т.д 8 22.09.2008 09:14
FT232BM проблема с прошивкой EEPROM zms2003 Микроконтроллеры, АЦП, память и т.д 3 27.06.2008 07:18
Проблема с ЛСД Zemlyanov Делимся опытом 4 12.01.2007 20:53


Часовой пояс GMT +4, время: 10:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot