你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030C8T6 CUBEMX Hal库 SPI1 DMA发送完成标志怎么获取

[复制链接]
OasisDong 提问时间:2019-3-25 16:19 /
       MCU:STM32F030C8T6。
       MXcube 版本号:如图片所示。
       请问 有SPI DMA发送完成中断吗?或者怎么通过查询方式获取SPI DMA发送完成标志?
      
CubeMX版本号.png
收藏 评论5 发布时间:2019-3-25 16:19

举报

5个回答
衔胆栖冰 回答时间:2019-3-25 22:32:05
用dma空闲中断

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

OasisDong 回答时间:2019-3-26 08:14:59
//以下是   stm32f0xx_hal_dma.h 的函数声明
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_DeInit (DMA_HandleTypeDef *hdma);

/* Input and Output operation functions *****************************************************/
HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, uint32_t CompleteLevel, uint32_t Timeout);
void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)( DMA_HandleTypeDef * _hdma));
HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID);

/* Peripheral State and Error functions ***************************************/
HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma);
uint32_t             HAL_DMA_GetError(DMA_HandleTypeDef *hdma);
找不到DMA空闲中断服务函数呢
OasisDong 回答时间:2019-3-26 08:19:52
这个是 stm32f0xx_hal_spi.h 的函数声明
HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi);
HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi);
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi);
void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi);

/* I/O operation functions  ***************************************************/
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,
                                          uint32_t Timeout);
HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,
                                             uint16_t Size);
HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData,
                                              uint16_t Size);
HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi);
HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi);
HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi);
/* Transfer Abort functions */
HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi);
HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi);

void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi);
void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi);

/* Peripheral State and Error functions ***************************************/
HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi);
uint32_t             HAL_SPI_GetError(SPI_HandleTypeDef *hspi);
看不出哪个是与DMA空闲中断有关的:
OasisDong 回答时间:2019-3-26 08:21:28
之前用标准库函数是有DMA空闲中断的,stm32cubeMX 生成的Hal库 找不到了?
衔胆栖冰 回答时间:2019-4-6 22:58:02
oasisdong 发表于 2019-3-26 08:21
之前用标准库函数是有DMA空闲中断的,stm32cubeMX 生成的Hal库 找不到了?


  1. /**
  2. * @brief This function handles DMA2 stream2 global interrupt.
  3. */
  4. void DMA2_Stream2_IRQHandler(void)
  5. {
  6.   /* USER CODE BEGIN DMA2_Stream2_IRQn 0 */

  7.   /* USER CODE END DMA2_Stream2_IRQn 0 */
  8.   HAL_DMA_IRQHandler(&hdma_spi1_rx);
  9.   /* USER CODE BEGIN DMA2_Stream2_IRQn 1 */

  10.   /* USER CODE END DMA2_Stream2_IRQn 1 */
  11. }
复制代码

②void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma):
  1. /* Transfer Complete Interrupt management ***********************************/
  2.   if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET)
  3.   {
  4.     if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET)
  5.     {
  6.       /* Clear the transfer complete flag */
  7.       regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex;
  8.       
  9.       if(HAL_DMA_STATE_ABORT == hdma->State)
  10.       {
  11.         /* Disable all the transfer interrupts */
  12.         hdma->Instance->CR  &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME);
  13.         hdma->Instance->FCR &= ~(DMA_IT_FE);
  14.         
  15.         if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL))
  16.         {
  17.           hdma->Instance->CR  &= ~(DMA_IT_HT);
  18.         }

  19.         /* Clear all interrupt flags at correct offset within the register */
  20.         regs->IFCR = 0x3FU << hdma->StreamIndex;

  21.         /* Process Unlocked */
  22.         __HAL_UNLOCK(hdma);

  23.         /* Change the DMA state */
  24.         hdma->State = HAL_DMA_STATE_READY;

  25.         if(hdma->XferAbortCallback != NULL)
  26.         {
  27.           hdma->XferAbortCallback(hdma);
  28.         }
  29.         return;
  30.       }

  31.       if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET)
  32.       {
  33.         /* Current memory buffer used is Memory 0 */
  34.         if((hdma->Instance->CR & DMA_SxCR_CT) == RESET)
  35.         {
  36.           if(hdma->XferM1CpltCallback != NULL)
  37.           {
  38.             /* Transfer complete Callback for memory1 */
  39.             hdma->XferM1CpltCallback(hdma);
  40.           }
  41.         }
  42.         /* Current memory buffer used is Memory 1 */
  43.         else
  44.         {
  45.           if(hdma->XferCpltCallback != NULL)
  46.           {
  47.             /* Transfer complete Callback for memory0 */
  48.             hdma->XferCpltCallback(hdma);
  49.           }
  50.         }
  51.       }
  52.       /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */
  53.       else
  54.       {
  55.         if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET)
  56.         {
  57.           /* Disable the transfer complete interrupt */
  58.           hdma->Instance->CR  &= ~(DMA_IT_TC);

  59.           /* Process Unlocked */
  60.           __HAL_UNLOCK(hdma);

  61.           /* Change the DMA state */
  62.           hdma->State = HAL_DMA_STATE_READY;
  63.         }

  64.         if(hdma->XferCpltCallback != NULL)
  65.         {
  66.           /* Transfer complete callback */
  67.           hdma->XferCpltCallback(hdma);
  68.         }
  69.       }
  70.     }
  71.   }
复制代码



评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版