ЭсТиЭм HAL_ брыкается, не понятно почему
- Войдите на сайт для отправки комментариев
Пнд, 11/11/2019 - 07:19
Есть хал-овский драйвер, допиливаю до дабл-буффер - эстиэм обленилась в конец , не дописала. Так вот:
HAL_StatusTypeDef dbuff_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint8_t *pData2, uint16_t Size) { HAL_StatusTypeDef errorcode = HAL_OK; assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); __HAL_LOCK(hspi); if (hspi->State != HAL_SPI_STATE_READY) { errorcode = HAL_BUSY; goto error; } if ((pData == NULL) || (Size == 0U)) { errorcode = HAL_ERROR; goto error; } hspi->State = HAL_SPI_STATE_BUSY_RX; hspi->ErrorCode = HAL_SPI_ERROR_NONE; hspi->pRxBuffPtr = (uint8_t *)pData; hspi->RxXferSize = Size; hspi->RxXferCount = Size; hspi->RxISR = NULL; hspi->TxISR = NULL; hspi->TxXferSize = 0U; hspi->TxXferCount = 0U; CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) { CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); } else { SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) { CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); if ((hspi->RxXferCount & 0x1U) == 0x0U) { CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); hspi->RxXferCount = hspi->RxXferCount >> 1U; } else { SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; } } } HAL_DMA_RegisterCallback(hspi4.hdmarx, HAL_DMA_XFER_CPLT_CB_ID, SPI_RxCpltM0); HAL_DMA_RegisterCallback(hspi4.hdmarx, HAL_DMA_XFER_M1CPLT_CB_ID, SPI_RxCpltM1); __HAL_DMA_DISABLE_IT(hspi4.hdmarx, DMA_IT_HT); __HAL_DMA_DISABLE_IT(hspi4.hdmarx, DMA_IT_TC); // volatile uint32_t tmpreg = 0U; // tmpreg = (uint32_t)&hspi->Instance->DR; if (HAL_OK != HAL_DMAEx_MultiBufferStart_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)pData, (uint32_t)pData2, Size)) { SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); errorcode = HAL_ERROR; hspi->State = HAL_SPI_STATE_READY; goto error; } if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) { __HAL_SPI_ENABLE(hspi); } __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); error: __HAL_UNLOCK(hspi); return errorcode; } Вот проблемная часть:
if (HAL_OK != HAL_DMAEx_MultiBufferStart_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)pData, (uint32_t)pData2, Size))
как верху написано -всё работает, но если оптимизирую
volatile uint32_t tmpreg = 0U;
tmpreg = (uint32_t)&hspi->Instance->DR;
if (HAL_OK != HAL_DMAEx_MultiBufferStart_IT(hspi->hdmarx, tmpreg, (uint32_t)pData, (uint32_t)pData2, Size))
то сразу посылает на "гоу ту", стерва. Чего я не догоняю?
Волшебник, может потому, что переменная tmpreg локальная, а в функцию можно только глобальные класть?
Не-а. Вот функция для ЦАП-а:
ф. бизинес что ей впаривают, ну если тип совпадает 32-беззнак.
Чего то с лабелами и гоу ту, по стилю в эстиэм какие то лошары драйвер на бюйсике писали. Могу и не оптимизировать, или условия на гоу-ту послать и как в цап-е - без кондиционно вызвать и проверки от дурака самому послать на гоу-ту.
Мне просто любопытно, как этот бэйсик-стиль нтегрирован в С++