|
开启TC发送完成中断,TE传输错误中断,DME直接模式错误中断和FIFO错误中断
#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE)
#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE)
#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE)
#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE)
#define DMA_IT_FE ((uint32_t)0x00000080U)
最后还有个HT半传输中断,这个根据用户时候注册的半传输回调函数决定。
- /**
- * @brief Start the DMA Transfer with interrupt enabled.
- * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
- * the configuration information for the specified DMA Stream.
- * @param SrcAddress: The source memory Buffer address
- * @param DstAddress: The destination memory Buffer address
- * @param DataLength: The length of data to be transferred from source to destination
- * @retval HAL status
- */
- HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
- {
- HAL_StatusTypeDef status = HAL_OK;
- /* Check the parameters */
- assert_param(IS_DMA_BUFFER_SIZE(DataLength));
- /* Check the DMA peripheral handle */
- if(hdma == NULL)
- {
- return HAL_ERROR;
- }
- /* Process locked */
- __HAL_LOCK(hdma);
- if(HAL_DMA_STATE_READY == hdma->State)
- {
- /* Change DMA peripheral state */
- hdma->State = HAL_DMA_STATE_BUSY;
- /* Initialize the error code */
- hdma->ErrorCode = HAL_DMA_ERROR_NONE;
- /* Disable the peripheral */
- __HAL_DMA_DISABLE(hdma);
- /* Configure the source, destination address and the data length */
- DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
- if(IS_D2_DMA_INSTANCE(hdma) != RESET) /* D2 Domain DMA : DMA1 or DMA2 */
- {
- /* Enable Common interrupts*/
- MODIFY_REG(((DMA_Stream_TypeDef *)hdma->Instance)->CR, (DMA_IT_TC | DMA_IT_TE | DMA_IT_DME | DMA_IT_HT), (DMA_IT_TC | DMA_IT_TE | DMA_IT_DME));
- ((DMA_Stream_TypeDef *)hdma->Instance)->FCR |= DMA_IT_FE;
- if(hdma->XferHalfCpltCallback != NULL)
- {
- /*Enable Half Transfer IT if corresponding Callback is set*/
- ((DMA_Stream_TypeDef *)hdma->Instance)->CR |= DMA_IT_HT;
- }
- }
- else /* D3 Domain BDMA */
- {
- /* Enable Common interrupts*/
- MODIFY_REG(((BDMA_Channel_TypeDef *)hdma->Instance)->CCR, (BDMA_CCR_TCIE | BDMA_CCR_HTIE | BDMA_CCR_TEIE), (BDMA_CCR_TCIE | BDMA_CCR_TEIE));
- if(hdma->XferHalfCpltCallback != NULL)
- {
- /*Enable Half Transfer IT if corresponding Callback is set*/
- ((BDMA_Channel_TypeDef *)hdma->Instance)->CCR |= BDMA_CCR_HTIE;
- }
- }
- /* Check if DMAMUX Synchronization is enabled*/
- if((hdma->DMAmuxChannel->CCR & DMAMUX_CxCR_SE) != 0U)
- {
- /* Enable DMAMUX sync overrun IT*/
- hdma->DMAmuxChannel->CCR |= DMAMUX_CxCR_SOIE;
- }
- if(hdma->DMAmuxRequestGen != 0U)
- {
- /* if using DMAMUX request generator, enable the DMAMUX request generator overrun IT*/
- /* enable the request gen overrun IT*/
- hdma->DMAmuxRequestGen->RGCR |= DMAMUX_RGxCR_OIE;
- }
- /* Enable the Peripheral */
- __HAL_DMA_ENABLE(hdma);
- }
- else
- {
- /* Process unlocked */
- __HAL_UNLOCK(hdma);
- /* Set the error code to busy */
- hdma->ErrorCode = HAL_DMA_ERROR_BUSY;
- /* Return error status */
- status = HAL_ERROR;
- }
- return status;
- }
复制代码
|
|