Страница 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
Re: stm32f051 (или другой) запись получение файла и запись
Добавлено: Пн июн 05, 2017 23:42:36
briareus
решена задача
под виндами буфер мешал
реализовал свой протокол и все взлетело
всем спасибо