2017-10-19 9 views
0

Je développe un projet qui utilise STM32L442KC et je ne peux pas détecter quand le mode périphérique USB est déconnecté (câble USB débranché).Détection de déconnexion STM32L442 USB

Que puis-je faire pour détecter la déconnexion USB? Y a-t-il une interruption? Ou dois-je vérifier un drapeau?


Mise à jour:

ci-dessous est le gestionnaire IRQ généré par STM32CubeMX. Il n'a pas le rappel HAL_PCD_DisconnectCallback et HAL_PCD_SuspendCallback n'est pas appelé lorsque le câble est débranché.

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

Que voulez-vous dire? –

Répondre

0

Dans STM32 F7 vous permet de détecter la déconnexion en fonction void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd), dans le fichier usbd_conf.c. J'espère que ce sera la même chose en L4.

+0

Il n'a pas mentionné le HAL. –

+0

JMA, je vais mettre à jour avec IRQ Handler de PCD. Peter, le HAL est le généré par STM32CubeMX. – Silas

+0

Je suis désolé @Silas, c'était quelque chose qui avait pointé, mais maintenant je n'ai pas le HW pour le prouver. – JMA