2017-10-19 38 views
0

私はSTM32L442KCを使用するプロジェクトを開発していますが、USBデバイスモードが切断されている(USBケーブルが抜かれている)と検出できません。STM32L442のUSB切断を検出しました

USB切断を検出するにはどうすればよいですか?何か中断はありますか?または、いくつかの旗を確認する必要がありますか?


アップデート:以下

はSTM32CubeMXによって生成されたIRQハンドラです。 HAL_PCD_DisconnectCallbackコールバックおよびHAL_PCD_SuspendCallbackは、ケーブルが接続されていないときは呼び出されません。 STM32 F7で

void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) 
{ 
    uint32_t wInterrupt_Mask = 0; 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_CTR)) 
    { 
    /* servicing of the endpoint correct transfer interrupt */ 
    /* clear of the CTR flag into the sub */ 
    PCD_EP_ISR_Handler(hpcd); 
    } 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_RESET)) 
    { 
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET); 
    HAL_PCD_ResetCallback(hpcd); 
    HAL_PCD_SetAddress(hpcd, 0); 
    } 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_PMAOVR)) 
    { 
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVR);  
    } 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_ERR)) 
    { 
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR); 
    } 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_WKUP)) 
    { 

    hpcd->Instance->CNTR &= ~(USB_CNTR_LPMODE); 

    /*set wInterrupt_Mask global variable*/ 
    wInterrupt_Mask = USB_CNTR_CTRM | USB_CNTR_WKUPM | USB_CNTR_SUSPM | USB_CNTR_ERRM \ 
     | USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_RESETM; 

    /*Set interrupt mask*/ 
    hpcd->Instance->CNTR = wInterrupt_Mask; 

    /* enable L1REQ interrupt */ 
    if (hpcd->Init.lpm_enable ==1) 
    { 
     wInterrupt_Mask |= USB_CNTR_L1REQM; 

     /* Enable LPM support and enable ACK answer to LPM request*/ 
     USB_TypeDef *USBx = hpcd->Instance; 
     hpcd->lpm_active = ENABLE; 
     hpcd->LPM_State = LPM_L0; 

     USBx->LPMCSR |= (USB_LPMCSR_LMPEN); 
     USBx->LPMCSR |= (USB_LPMCSR_LPMACK); 
    } 

    if(hpcd->LPM_State == LPM_L1) 
    { 
     hpcd->LPM_State = LPM_L0; 
     HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L0_ACTIVE); 
    } 

    HAL_PCD_ResumeCallback(hpcd); 

    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP);  
    } 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_SUSP)) 
    {  
    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ 
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SUSP); 

    /* Force low-power mode in the macrocell */ 
    hpcd->Instance->CNTR |= USB_CNTR_FSUSP; 
    hpcd->Instance->CNTR |= USB_CNTR_LPMODE; 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_WKUP) == 0) 
    { 
     HAL_PCD_SuspendCallback(hpcd); 
    } 
    } 

    /* Handle LPM Interrupt */ 
    if(__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_L1REQ)) 
    { 
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_L1REQ);  
    if(hpcd->LPM_State == LPM_L0) 
    { 
     /* Force suspend and low-power mode before going to L1 state*/ 
     hpcd->Instance->CNTR |= USB_CNTR_LPMODE; 
     hpcd->Instance->CNTR |= USB_CNTR_FSUSP; 

     hpcd->LPM_State = LPM_L1; 
     hpcd->BESL = (hpcd->Instance->LPMCSR & USB_LPMCSR_BESL) >>2 ; 
     HAL_PCDEx_LPM_Callback(hpcd, PCD_LPM_L1_ACTIVE); 
    } 
    else 
    { 
     HAL_PCD_SuspendCallback(hpcd); 
    } 
    } 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_SOF)) 
    { 
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF); 
    HAL_PCD_SOFCallback(hpcd); 
    } 

    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_ESOF)) 
    { 
    /* clear ESOF flag in ISTR */ 
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF); 
    } 
} 
+0

どういう意味ですか? –

答えて

0

あなたは、ファイルusbd_conf.cで、機能void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)で切断を検出することができます。私はそれがL4で同じになることを願っています。

+0

彼はHALについて言及しなかった。 –

+0

JMA、PCDのIRQハンドラで更新します。 Peter、HALはSTM32CubeMXによって生成されます。 – Silas

+0

ごめんなさい@Silas、それは指摘していたものでしたが、今はそれを証明するためにHWを持っていません。 – JMA

関連する問題