<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      HAL庫(kù)DMA框架

      介紹HAL庫(kù)中外設(shè)如何與DMA建立連接

      外設(shè)句柄結(jié)構(gòu)體中包含有DMA句柄,如ADC

      typedef struct __ADC_HandleTypeDef {
        // ADC_TypeDef                   *Instance;        /*!< Register base address */
        // ADC_InitTypeDef               Init;             /*!< ADC required parameters */
        DMA_HandleTypeDef             *DMA_Handle;         /*!< Pointer DMA Handler */
        // HAL_LockTypeDef               Lock;             /*!< ADC locking object */
        // __IO uint32_t                 State;            /*!< ADC communication state */
        // __IO uint32_t                 ErrorCode;        /*!< ADC Error code */
      }ADC_HandleTypeDef;
      

      DMA句柄中包含中斷回調(diào)函數(shù)的函數(shù)指針接口,以及該父對(duì)象指針

      typedef struct __DMA_HandleTypeDef
      
      {
        // DMA_Channel_TypeDef        *Instance;       /*!< Register base address */
        // DMA_InitTypeDef            Init;             /*!< DMA communication parameters */
        // HAL_LockTypeDef            Lock;           /*!< DMA locking object  */
        // __IO HAL_DMA_StateTypeDef  State;               /*!< DMA transfer state  */
        void    *Parent;       /*!< Parent object state    */
        void   (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma);    
        void   (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); 
        void   (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);    
        void   (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); 
        // __IO uint32_t              ErrorCode;            
        // DMA_TypeDef                *DmaBaseAddress;     
        // uint32_t                   ChannelIndex;        
      } DMA_HandleTypeDef;
      

      在外設(shè)初始化時(shí),會(huì)對(duì)DMA進(jìn)行初始化,同時(shí)將兩者進(jìn)行關(guān)聯(lián)。這樣通過(guò)外設(shè)句柄就能操作DMA句柄

      #define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
      	do                                                               \
          {                                                                \
              (__HANDLE__)->__PPP_DMA_FIELD__ = &(__DMA_HANDLE__);         \
              (__DMA_HANDLE__).Parent = (__HANDLE__);                      \
          } while (0U)
                                
      __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
      
      

      在外設(shè)啟用DMA發(fā)送或接收時(shí),收發(fā)函數(shù)內(nèi)部會(huì)對(duì)外設(shè)掛載的DMA設(shè)置回調(diào)函數(shù),而這里使用的函數(shù)實(shí)體來(lái)自于外設(shè)預(yù)留的、關(guān)于DMA中斷的回調(diào)函數(shù)。

      HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) {
      	// ...
      	
          /* Set the DMA transfer complete callback */
          hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
          /* Set the DMA half transfer complete callback */
          hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
          /* Set the DMA error callback */
          hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
          /* Start the DMA channel */
          HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
          
          // ...
      }
      

      賦值的回調(diào)函數(shù)為 ADC_DMAConvCplt ,其內(nèi)部調(diào)用了 HAL_ADC_ConvCpltCallbackHAL_ADC_ConvCpltCallback 才是最后用戶需要實(shí)現(xiàn)的。

      void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma) {
        /* Retrieve ADC handle corresponding to current DMA handle */
        ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
      
        /* Update state machine on conversion status if not in error state */
        if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
        {
          /* Update ADC state machine */
          SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
      
      	// ...
      	
          /* Conversion complete callback */
      #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
          hadc->ConvCpltCallback(hadc);
      #else
          HAL_ADC_ConvCpltCallback(hadc);
      #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
        }
        else
        {
          /* Call DMA error callback */
          hadc->DMA_Handle->XferErrorCallback(hdma);
        }
      }
      
      __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
      {
        UNUSED(hadc);
      }
      

      DMA 中斷被啟動(dòng),并且掛載回調(diào)函數(shù)后,會(huì)在中斷中自動(dòng)運(yùn)行。

      void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
      {
        uint32_t flag_it = hdma->DmaBaseAddress->ISR;
        uint32_t source_it = hdma->Instance->CCR;
      
        /* Half Transfer Complete Interrupt management ******************************/
        if (((flag_it & (DMA_FLAG_HT1 << hdma->ChannelIndex)) != RESET) && ((source_it & DMA_IT_HT) != RESET))
        {
      	// ...
          if(hdma->XferHalfCpltCallback != NULL) {
            hdma->XferHalfCpltCallback(hdma); /* Half transfer callback */
          }
        }
      
        /* Transfer Complete Interrupt management ***********************************/
        else if (((flag_it & (DMA_FLAG_TC1 << hdma->ChannelIndex)) != RESET) && ((source_it & DMA_IT_TC) != RESET))
        {
          // ...
          if(hdma->XferCpltCallback != NULL) {
            hdma->XferCpltCallback(hdma);/* Transfer complete callback */
          }
        }
      
        /* Transfer Error Interrupt management **************************************/
        else if (( RESET != (flag_it & (DMA_FLAG_TE1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_TE)))
        {
      	// ...
          if (hdma->XferErrorCallback != NULL) {
            hdma->XferErrorCallback(hdma);/* Transfer error callback */
          }
        }
        return;
      }
      
      
      void DMA1_Channel1_IRQHandler(void)
      {
        HAL_DMA_IRQHandler(&hdma_adc1);
      }
      
      posted @ 2025-11-04 22:48  落子葉初LQ  閱讀(7)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 东京热人妻中文无码| 一区二区中文字幕久久| 国精偷拍一区二区三区| 人妻人人澡人人添人人爽人人玩| 一个色综合亚洲热色综合| 泰来县| 高清中文字幕一区二区| 国产稚嫩高中生呻吟激情在线视频| 亚洲V天堂V手机在线| 免费看黄色亚洲一区久久| 92国产福利午夜757小视频| 精品久久久久无码| 中文字幕人妻无码一区二区三区 | 欧洲精品码一区二区三区| 把女人弄爽大黄A大片片| 精品国产中文字幕第一页| 最新国产麻豆AⅤ精品无码| 国产一区日韩二区欧美三区| 国产精品尤物乱码一区二区| 欧美视频专区一二在线观看| 久久精品国产亚洲av麻豆长发| 国产一级区二级区三级区| 国产成AV人片久青草影院| 国产av午夜精品福利| 色九九视频| 亚洲理论在线A中文字幕| 国产欧美日韩亚洲一区二区三区| 日韩大片在线永久免费观看网站| 在线免费成人亚洲av| 亚洲综合一区无码精品| 亚洲国产片一区二区三区| 中文成人无字幕乱码精品区| 日韩人妻精品中文字幕专区| 色窝窝免费播放视频在线| 丰满爆乳一区二区三区| 国产成人av综合色| 一区二区三区四区亚洲自拍| 国产精品一区二区三区激情| 国产乱码精品一区二三区| 国产亚洲人成网站在线观看| 人人入人人爱|