реклама на сайте
подробности

 
 
> STM32: HardFault
k000858
сообщение Mar 27 2014, 04:16
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Реализую 1-wire на UART+DMA, камень STM32F407
Делается все на фирменных ST библиотеках HAL (новые SPL)

После вызова функции HAL_UART_Receive_DMA(&UartHandle, (uint8_t *)ds18b20_buf_rx, sizeof(ds18b20_buf_rx)); попадаю в хардфаулт.
uint8_t ds18b20_buf_rx[8];

часть внутренностей функции:
Код
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  uint32_t *tmp;
  tmp = (uint32_t*)&pData;
}


Прерывание происходит на строчке tmp = (uint32_t*)&pData;

Как так?

точно такая же функция на отправку работает нормально...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k000858
сообщение Mar 28 2014, 01:07
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Проблема решилась. пошагал отладчиком и все такое.
после того как сделал структуры (для инициализации DMA на Tx и RX и тд) глобальными (видимо стека не хватало на локальные переменные) и изменил порядок вызова функций все задышало. + для работы новых HAL библиотек необходимо юзать прерывания для dma. ну в общем там ни мало особенностей появилось по сравнению со стрыми SPL
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 28 2014, 03:39
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(k000858 @ Mar 28 2014, 03:07) *
Проблема решилась. пошагал отладчиком и все такое.
А не могли бы вы выложить весь текст функции HAL_UART_Receive_DMA()? А то тут уже пошли теологические споры и было бы хорошо поставить жирную точку.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
k000858
сообщение Mar 28 2014, 04:00
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Цитата(Сергей Борщ @ Mar 28 2014, 07:39) *
А не могли бы вы выложить весь текст функции HAL_UART_Receive_DMA()? А то тут уже пошли теологические споры и было бы хорошо поставить жирную точку.

на самом деле в самой функции ошибки нет. все работает корректно с передачей вышеописанных переменных.


Код
/**
  * @brief  Receives an amount of data in non blocking mode.
  * @param  huart: UART handle
  * @param  pData: Pointer to data buffer
  * @param  Size: Amount of data to be received
  * @note   When the UART parity is enabled (PCE = 1) the data received contain the parity bit.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  uint32_t *tmp;
  uint32_t tmp1 = 0;
  
  tmp1 = huart->State;    
  if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_TX))
  {
    if((pData == NULL ) || (Size == 0))
    {
      return HAL_ERROR;
    }
    
    /* Process Locked */
    __HAL_LOCK(huart);
    
    huart->pRxBuffPtr = pData;
    huart->RxXferSize = Size;
    
    huart->ErrorCode = HAL_UART_ERROR_NONE;
    /* Check if a transmit rocess is ongoing or not */
    if(huart->State == HAL_UART_STATE_BUSY_TX)
    {
      huart->State = HAL_UART_STATE_BUSY_TX_RX;
    }
    else
    {
      huart->State = HAL_UART_STATE_BUSY_RX;
    }
    
    /* Set the UART DMA transfer complete callback */
    huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt;
    
    /* Set the UART DMA Half transfer complete callback */
    huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt;
    
    /* Set the DMA error callback */
    huart->hdmarx->XferErrorCallback = UART_DMAError;

    /* Enable the DMA Stream */
    tmp = (uint32_t*)&pData;
    HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t*)tmp, Size);
    
    /* Enable the DMA transfer for the receiver request by setting the DMAR bit
    in the UART CR3 register */
    huart->Instance->CR3 |= USART_CR3_DMAR;
    
    /* Process Unlocked */
    __HAL_UNLOCK(huart);
    
    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}


причина хардфаулта крылась либо в использовании локальных структур (а размер у них не малый), что негативно сказывалось на стеке, либо в некорректном порядке инициализации.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- k000858   STM32: HardFault   Mar 27 2014, 04:16
- - Сергей Борщ   Сама по себе строчка некриминальна. Надо пройтись ...   Mar 27 2014, 04:55
- - ISK2010   Может вы хотели написать "tmp = (uint32_t*)pD...   Mar 27 2014, 05:01
- - k000858   это не я написал, это библиотека от ST сейчас убр...   Mar 27 2014, 05:38
- - KnightIgor   Цитата(k000858 @ Mar 27 2014, 05:16) Реал...   Mar 27 2014, 08:17
|- - Сергей Борщ   Цитата(KnightIgor @ Mar 27 2014, 10:17) В...   Mar 27 2014, 11:03
|- - KnightIgor   Цитата(Сергей Борщ @ Mar 27 2014, 12:03) ...   Mar 27 2014, 18:55
|- - aaarrr   Цитата(KnightIgor @ Mar 27 2014, 22:55) 1...   Mar 27 2014, 19:19
|- - jcxz   Цитата(KnightIgor @ Mar 28 2014, 00:55) Т...   Mar 27 2014, 23:53
|- - Сергей Борщ   Цитата(k000858 @ Mar 28 2014, 06:00) на с...   Mar 28 2014, 05:08
- - k000858   ну библы новые, может причешут! зато удалось р...   Mar 28 2014, 05:39
- - Golikov A.   ну не за пол дня, а за сутки все таки... тем более...   Mar 28 2014, 09:22
|- - jcxz   Цитата(Golikov A. @ Mar 28 2014, 15:22) л...   Mar 28 2014, 10:10
- - DASM   За это и можно ненавидеть язык С. В fault на ровно...   Mar 28 2014, 14:09
- - Genadi Zawidowski   HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)...   Mar 29 2014, 06:43
- - RusikOk   Цитата(k000858 @ Mar 27 2014, 07:16) Реал...   Sep 3 2016, 19:59
|- - k000858   Цитата(RusikOk @ Sep 3 2016, 22:59) как у...   Sep 7 2016, 12:17
|- - RusikOk   Цитата(k000858 @ Sep 7 2016, 15:17) да, в...   Sep 7 2016, 22:38
|- - k000858   Цитата(RusikOk @ Sep 8 2016, 01:38) подел...   Sep 8 2016, 07:28
|- - RusikOk   Цитата(k000858 @ Sep 8 2016, 10:28) поста...   Sep 10 2016, 09:01
|- - k000858   Цитата(RusikOk @ Sep 10 2016, 12:01) будж...   Sep 13 2016, 04:19
- - RusikOk   схема мне не нужна. главное что все построено на U...   Sep 13 2016, 05:20
|- - k000858   Цитата(RusikOk @ Sep 13 2016, 08:20) схем...   Sep 13 2016, 09:02
- - IgorC   проект на CubeMx? как делали изменение скорости по...   Feb 11 2017, 09:56
- - RusikOk   Цитата(IgorC @ Feb 11 2017, 12:56) но хот...   Feb 11 2017, 10:50


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 16:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.02014 секунд с 7
ELECTRONIX ©2004-2016