Страница 1 из 1

stm32f051 (или другой) запись получение файла и запись

Добавлено: Вт июл 05, 2016 23:08:44
briareus
привет
подскажите может есть где примерчик как получать по USART файл и записывать его во Flash (получается я хочу получать файл и прошивать часть АРМа).
с USART'ом я работать умею (точнее отправляю текст и получаю его обратно), но никак не могу смекнуть как поступать в случае передачи файла (динамически надо переменную под передачу делать?).
и потом еще не могу уразуметь как записывать получаемый файл во Flash
пока вот такой набросок по записи:
void WriteToFlash(unsigned char data){
HAL_FLASH_Unlock();
HAL_FLASH_Program_IT(FLASH_TYPEERASE_PAGES TYPEERASEDATA_WORD, 0x800A000, 0xffff);
HAL_FLASH_Program_IT(TYPEPROGRAMDATA_WORD, &data, ControllerConfig.powerBias);
HAL_FLASH_Lock();
}

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Пт авг 05, 2016 15:05:09
briareus
и с UART, как оказалось, я не умею
данные получаю и потом отправляю
но на комп приходит не все
да еще и с отставанием в одну отсылку

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Пт авг 05, 2016 15:11:22
briareus
где я тут напортачил?
Спойлер

Код: Выделить всё

#define USART_BUFFER_SIZE												16
unsigned char usartBuf[USART_BUFFER_SIZE]; 

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
	uint16_t len = huart->RxXferSize;
	uint8_t *d = huart->pRxBuffPtr;
	
	if((uint32_t)huart->Instance == (uint32_t)USART1){
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
		
		// ЕСЛИ счетчик получателя обнулился, то данные получены все и
			if(huart->RxXferCount == 0){
				// передаем данные обратно отправителю
					HAL_UART_Transmit_IT(&huart1, &usartBuf[0], USART_BUFFER_SIZE);
				
				HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
			}
	}
	
	// инициализируем получатель для получения новой порции данных
	HAL_UART_Receive_IT(huart, &usartBuf[0], USART_BUFFER_SIZE);
}

void UartReceive(void){
  static uint8_t * pRxBuffPtr;
  static int UartInit=0;
  if (!UartInit) {
    pRxBuffPtr = &usartBuf[0]; // получаем указатель на данные
		// передаем в получатель указатель на данные и допустимый размер для данных
		HAL_UART_Receive_IT(&huart1, pRxBuffPtr, USART_BUFFER_SIZE);
    UartInit = 1;
  }
  // проверяем, если у нас адрес на данные изменился, то 
  while (pRxBuffPtr != huart1.pRxBuffPtr) {
    // инкрементим адрес
    pRxBuffPtr++;
		// И ЕСЛИ адрес сохраненный ранее РАВЕН адресу последней ячейки массива, то
    if (pRxBuffPtr == &usartBuf[0] + USART_BUFFER_SIZE) {
			// заменяем адрес на начальную ячейку
      pRxBuffPtr = &usartBuf[0];
    }
  }
}
на картинке во вложении розовым - отправленная последовательность на АРМ
черным - принятая от АРМа

куда теряются и почему сразу все не передается?

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Сб авг 06, 2016 13:07:25
dosikus
Ключевое слово -hal.

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Чт авг 18, 2016 16:51:20
briareus
но hal ведь сам производитель делает
и полагаю наиболее актуальное, чем spl

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Чт авг 18, 2016 19:39:58
dosikus
И кал и спл в топку, скачайте сниппетсы и смотрите примеры кода в конце RM ...

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Вт авг 30, 2016 20:09:32
briareus
dosikus писал(а):, скачайте сниппетсы и смотрите примеры кода в конце RM ...
не вижу, они точно на сайте st ?

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Пн сен 19, 2016 07:30:58
dosikus
Хоть и поздно, но ...

http://www.st.com/content/st_com/en/pro ... tId=LN1898

Изображение

Re: stm32f051 (или другой) запись получение файла и запись

Добавлено: Пн июн 05, 2017 23:42:36
briareus
решена задача
под виндами буфер мешал
реализовал свой протокол и все взлетело

всем спасибо