那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用MM32F0270 USB從Suspend模式喚醒

jf_pJlTbmA9 ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2023-09-26 16:39 ? 次閱讀

在許多的PC的USB應用中,越來越多的需要使用低功耗功能,PC可結合USB提供一定的供電能力,使得外設在1.5W以內,可以不用其他單獨的外部供電;更巧妙的是PC可以進入Sleep,驅使USB外設也進入Suspend狀態,達到只提供2.5mA的供電需求,以達到低功耗的目的。靈動微電子推出的MM32F0270系列,支持多種靈活的低功耗模式,支持Suspend模式的USB Device模塊。USB外設支持 USB掛起 /恢復操作,可以通過停止MCU時鐘來實現降低功耗。

當USB設備處于掛起狀態時,它仍然為其D+或D-及上拉電阻器供電,以保持空閑狀態并保持其內部狀態,包括地址和配置。當它被USB總線上的恢復信號喚醒時,它不需要經歷重新枚舉過程。

USB總線上的恢復信號可以由主機和設備發送。遠程喚醒功能使USB設備能夠喚醒掛起的主機;例如,將鼠標連接到筆記本電腦時,您可以通過單擊鼠標來喚醒已經進入睡眠狀態的筆記本電腦(PC端需要配置為支持遠程喚醒)。遠程喚醒功能在枚舉階段在配置描述符中報告,并且可以使用標準 USB 請求啟用(或禁用)。

本文介紹了如何使用 MM32F0270的USB來實現通過接收USB的D+/D-信號在實現Suspend/Resume的狀態轉換。

1、MM32F0270 USB的簡要介紹

符合 USB 2.0全速設備的技術規范;

支持全速模式(12M)

包含四個獨立的通用端點和一個控制傳輸端點用于中斷傳輸和批量傳輸

控制、批量 、 中斷傳輸 最大可傳輸 64字節的包

CRC生成 /校驗, NRZI編碼 /解碼和位填充

支持 USB掛起 /恢復操作

支持 DMA傳輸

poYBAGIPK7yAVVvyAACZ9vN0WK4582.png 圖1 USB的功能框圖

2、USB的功能特性

2.1、MM32的USB具有以下特性

USB模塊可以為PC主機和微控制器提供一種符合USB規范的通信連接,用于兩者所實現的功能之間的連接。PC主機和微控制器之間通過數據緩沖區完成數據傳輸,USB模塊與PC主機通信,根據USB規范完成對令牌分組的檢測,對數據發送/接收和握手分組的處理。由硬件完成對包括CRC的生成和校驗等整個傳輸的格式。每一個端點都有一個64字節緩沖區描述塊,且該緩沖區是在USB模塊內部,不能直接被CPU訪問的。一個有效的功能/端點的令牌分組被USB模塊識別,當端點已配置完成后發生相關的數據傳輸。USB模塊與專用數據緩沖區的數據交換通過內部寄存器完成。在所有的數據傳輸完成后,根據需要的傳輸方向,發送或接收適當的握手分組。

數據傳輸完成時,USB模塊會觸發端點相關的中斷,通過讀取狀態寄存器或利用不同的中斷處理程序,可以確定:

主機請求的傳輸類型

哪個端點需要得到服務

正在進行的是哪種類型的服務

端點的應答

傳輸是否完成

USB模塊在不工作時,可以通過配置USB_POWER寄存器使 USB模塊處于SUSPEND模式(低功耗模式)。USB模塊在低功耗模式下,USB時鐘會減慢或停止且USB模塊不產生靜態電流功耗。USB模塊在低功耗模式下,可以通過USB線上數據傳輸將其喚醒,也可以通過軟件直接將其喚醒。或者通過將特定的中斷輸入源連接到喚醒引腳上,使系統立即恢復正常的時鐘,可以直接啟動或停止時鐘系統。

2.2、MM32F0270 USB用于掛起和恢復的USB總線狀態

USB 規范定義了與 USB 總線上的信號電壓相對應的總線狀態。

下圖為連接到D+的1.5 kΩ上拉電阻的全速總線。

poYBAGIPLAqAYYFmAAAwxsQ2EXY306.jpg

MM32F0270系列芯片內置1.5K上拉電阻。

下面介紹USB 總線如何定義掛起、恢復和空閑狀態的總線狀態。

設備的掛起

在USB系統中,正常狀態下PC,Hub或Root Hub會一直周期性地發送SOF包(Start Of Frame,全速USB每1ms發送一個,高速USB則是125μs發送一個)。根據USB協議,如果USB線上一直處于空閑(Idle)狀態超過3ms,設備應該把它當作一個掛起(Suspended)信號,要求設備在10ms內進入掛起狀態,并把設備所需的電流大小降到規定的值;對于low-power設備,要求是500μA,而對于high-power或支持遠程喚醒(remote wakeup)功能的設備是2.5mA。在掛起狀態中,設備必須繼續向數據項D+/D-的上拉電阻提供電壓以維持Idle狀態。

poYBAGIPLq2AVXeHAAASZhVC_-c413.jpg

設備的喚醒

設備處于掛起狀態時,任何總線上的活動(非空閑信號)都可以把設備喚醒/恢復,從而退出低功耗模式。同樣,設備也可以換醒host,比如電腦待機時通過USB鍵盤來換醒主機,這種功能稱之為“遠程喚醒”(remote wakeup),不在本文的討論范圍內。

因為設備掛起時處于全速信號,在當host需要把將設備退出suspend狀態時,需要先發送一個持續時間超過20ms的Fulll Speed K狀態。設備看到K狀態結束的1.3us內醒過來,而host需要在3ms內發送SOF信號以維持正常的高速信號模式,否則設備又將進入suspend。如下圖所示:

poYBAGIPLs6AM1zmAAAnTq4v-SQ493.jpg

下面是USB的數據狀態與信號的說明:

數據 J 和 K 狀態Data J and K states

對于全速總線段,J 狀態與差分 1 相同,即 D+ 為邏輯高電平時和 D- 為邏輯低電平,而 K 狀態與差分 0 相同,即當 D+ 為邏輯低電平且D- 是邏輯高電平。

空閑狀態Idle state

在空閑狀態下,對于全速總線段,D+ 比 D- 的電平高。

掛起狀態Suspend signal

由于當USB總線處于空閑狀態超過3 ms時進入掛起狀態,因此掛起狀態與空閑狀態相同或與全速總線段中的J狀態相同。

恢復信號Resume signal

當設備處于掛起狀態時,設備端口上的數據K狀態表示從掛起狀態恢復。這意味著恢復信號是全速段中從數據J狀態到數據K狀態的變化。

2.3、MM32F0270 USB支持從Suspend模式下喚醒

MM32F0270 可通過EXTI線 18連接到 USB總線掛起中斷實現USB從掛起狀態喚醒。

需要使用喚醒時,需要使能相應的USB中斷外,還需配置EXTI 18以使能相關的功能。

相關的寄存器與控制狀態位的控制與查詢,可以參考MM32F0270的用戶手冊。

3、USB進入Suspend與Res ume的軟硬件設計

3.1、在庫函數版本的樣例中可以通過如下順序初始化USB

a.配置系統時鐘為48MHz或96Mhz,使能GPIOA時鐘,使能USB時鐘

void USB_ClockConfig(void)
{
    USB_HSI48M_Config();
    Set_CRS();      // The calibration of vibration
    // Select USBCLK source
//    RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div2); //if SYSCLK is 96MHz
    // Enable USB clock
    RCC_APB1PeriphClockCmd(RCC_APB1ENR_USB, ENABLE);
}

b.配置USB D+和D-所需用到的GPIO引腳,使用GPIO_Configuration函數

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit( GPIO_InitStruct);
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);

    // USB_DISCONNECT used as USB pull-up
    GPIO_InitStruct.GPIO_Pin = USB_DISCONNECT_PIN;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_FLOATING;
    GPIO_Init(USB_DISCONNECT,  GPIO_InitStruct);
}

c.配置USB的中斷,調用USB_NVIC_Config函數

void USB_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStruct;

    NVIC_InitStruct.NVIC_IRQChannel = USB_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init( NVIC_InitStruct);
}

d.設置USB的時鐘,調用USB_ClockConfig

void USB_ClockConfig(void)
{
    USB_HSI48M_Config();
    Set_CRS();      // The calibration of vibration
    // Select USBCLK source
//    RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div2);
    // Enable USB clock
    RCC_APB1PeriphClockCmd(RCC_APB1ENR_USB, ENABLE);
}

e.設置USB 初始化

void USB_Init(void)
{
    pInformation =  Device_Info;
    pInformation->ControlState = 2;
    pProperty =  Device_Property;
    pUser_Standard_Requests =  User_Standard_Requests;
    // Initialize devices one by one
    pProperty->Init();
}

f.設定USB對應喚醒的EXTI參數

void USB1_WKUP_Init(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

    EXTI_InitStructure.EXTI_Line = EXTI_Line18;            
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init( EXTI_InitStructure);                        
}

g.中斷相應處理函數

void USB_Istr(void)
{
    __IO u16 wIstr;
    wIstr = _GetUSB_INT_STA();
    //USB->INT_STATE = wIstr;

    // fSuspendEnabled = 0;
    if(wIstr   USB_INT_STATE_RSTF) {
        _ClrUSB_INT_STA(USB_INT_STATE_RSTF) ;
        Device_Property.Reset();
    }
//…
    EXTI_ClearITPendingBit(EXTI_Line22);
}

3.2、實現main Demo功能的主要函數代碼

s32 main(void)
{
    GPIO_Configuration();
    USB_NVIC_Config();
    USB_ClockConfig();
    USB_Init();
    while(1) {
        if(bDeviceState == CONFIGURED) {
            if(!(_GetUSB_CTRL1() EP1_CTRL_TRANEN)) {
                UserToPMABufferCopy(gTableData, ENDP1, BUFF_SIZE);
                _SetUSB_CTRL1(EP1_CTRL_TRANEN | BUFF_SIZE) ; //Loop IN transmission
            }
        }
    }
}

配置好初始化USB收發的初始化操作后,PC端會發現USB HID枚舉成功;此時PC端進入待機模式,

poYBAGIPLwmANDGFAAAhuVnmhYE253.png

MCU的USB收到Suspend的命令后,執行:

void Suspend(void)
{

    if(bDeviceState == CONFIGURED) {
        //Frequency the bus clock 512
        USB->POWER  = ~USB_POWER_SUSP;

        bDeviceState = SUSPENDED;
        fSuspendEnabled = true;

        RCC->CFGR  = ~RCC_CFGR_HPRE;
        RCC->CFGR |=  RCC_CFGR_HPRE_DIV512;
        RCC->CR  = ~(0x1f << 26);

        RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div4);

        UART_DeInit(UART1);

    }

}

USB喚醒機制

USB設備進入掛起狀態之后,將由Resume信號進行喚醒。Resume信號可以由USB主機發起,也可以由USB設備本身觸發,但是只有USB主機可以結束Resume信號。

主機在掛起設備后可通過翻轉數據線上的極性并保持20ms來喚醒設備,并以低速EOP信號結尾。

如果設備支持遠程喚醒,設備可向主機發起遠程喚醒請求,前提是設備已進入idle狀態至少5ms,設備會驅動總線進入K狀態,如下圖,K狀態必須維持1ms-15ms之內,此信號會在1ms內被主機接管,主機會繼續驅動喚醒信號直到20ms,并以低速EOP信號結尾。

主機復位設備或者設備對自己強行復位,設備也會從掛起狀態切換到默認狀態。

MM32F0270 設備被喚醒后,如果喚醒中斷使能(比如使用PA0的EXTI0),則會進入喚醒中斷,退出低功耗模式,然后清除USB_POWER寄存器的SUSPEND位,退出強制掛起操作。

操作上體現為PC Host主機同按主機KeyBoard或鼠標按鍵實現退出睡眠狀態,從而喚醒MM32F0270的掛起狀態。

通過上述的步驟,簡單的演示了MM32F0270的USB 接收數據,通過數據幀中的Start Bit喚醒MCU的功能。

Demo程序可登錄MindMotion的官網下載MM32F0270 lib_Samples

工程路徑如下:

~ MM32F0270_SamplesLibSamplesUSB

來源:靈動MM32MCU

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17318

    瀏覽量

    352649
  • usb
    usb
    +關注

    關注

    60

    文章

    7980

    瀏覽量

    266095
  • 總線
    +關注

    關注

    10

    文章

    2903

    瀏覽量

    88395
  • 低功耗
    +關注

    關注

    10

    文章

    2418

    瀏覽量

    103896
收藏 人收藏

    評論

    相關推薦

    靈動微課堂 (第196講) | 使用MM32F0270 LPTIMSTOP模式喚醒

    了如何使用 MM32F0270的LPTIM來實現定時1sSTOP方式的低功耗模式喚醒。實現使用LPTIM1,在低功耗stop模式下定時1
    發表于 01-10 11:38

    靈動微課堂 (第197講) | MM32F0270 UART空閑中斷 + DMA接收不定長數據

    ,一旦接收的數據斷流,沒有接收到數據,即產生空閑中斷。MM32F0270系列的UART支持空閑中斷功能。相關的寄存器包括UART中斷狀態寄存器(UART_ISR)、 UART中斷使能寄存器
    發表于 01-10 11:42

    靈動微課堂 (第198講) | 使用MM32F0270 LPUART從低功耗模式喚醒

    了如何使用 MM32F0270的LPUART來實現通過接收外部UART的信號,觸發MCUSleep/DeepSleep低功耗模式喚醒。1MM32
    發表于 01-17 13:24

    靈動微課堂 (第199講) | 使用MM32F0270 USBSuspend模式喚醒

    時,設備端口上的數據K狀態表示掛起狀態恢復。這意味著恢復信號是全速段中數據J狀態到數據K狀態的變化。2.3MM32F0270 USB支持
    發表于 02-18 13:32

    靈動微課堂 (第200講) | 使用MM32F0270 定時器DMA方式輸出PWM

    MM32F0270的定時器TIM1、TIM2、TIM3、TIM15、TIM16/17有DMA模式,能夠在發生單個事件時生成多個DMA 請求。主要目的是在沒有軟件開銷的情況下,多次重新編程定時器的一部分
    發表于 02-18 13:36

    靈動微課堂 (第200講) | 使用MM32F0270 定時器DMA方式輸出PWM

    MM32F0270的定時器TIM1、TIM2、TIM3、TIM15、TIM16/17有DMA模式,能夠在發生單個事件時生成多個DMA 請求。主要目的是在沒有軟件開銷的情況下,多次重新編程定時器的一部分
    發表于 03-17 17:26

    MM32F013x——RTC鬧鐘定時喚醒

    本文將重點介紹如何在MM32F013x上通過內部RTC模塊的鬧鐘事件來喚醒處于停機模式下的MCU。
    發表于 02-08 17:02 ?17次下載
    <b class='flag-5'>MM32F</b>013x——RTC鬧鐘定時<b class='flag-5'>喚醒</b>

    MM32F0270 產品手冊(中文版)

    MM32F0270 產品手冊(中文版)
    發表于 02-23 18:36 ?0次下載
    <b class='flag-5'>MM32F0270</b> 產品手冊(中文版)

    MM32F0270 產品手冊(英文版)

    MM32F0270 產品手冊(英文版)
    發表于 02-23 18:37 ?0次下載
    <b class='flag-5'>MM32F0270</b> 產品手冊(英文版)

    MM32F0270 用戶手冊(中文版)

    MM32F0270 用戶手冊(中文版)
    發表于 02-23 18:37 ?0次下載
    <b class='flag-5'>MM32F0270</b> 用戶手冊(中文版)

    MM32F0270 用戶手冊(英文版)

    MM32F0270 用戶手冊(英文版)
    發表于 02-23 18:38 ?0次下載
    <b class='flag-5'>MM32F0270</b> 用戶手冊(英文版)

    MM32F0270 勘誤表(中文版)

    MM32F0270 勘誤表(中文版)
    發表于 02-23 18:38 ?0次下載
    <b class='flag-5'>MM32F0270</b> 勘誤表(中文版)

    MM32F0270 勘誤表(英文版)

    MM32F0270 勘誤表(英文版)
    發表于 02-23 18:39 ?0次下載
    <b class='flag-5'>MM32F0270</b> 勘誤表(英文版)

    使用MM32F0270 定時器DMA方式輸出PWM

    使用MM32F0270 定時器DMA方式輸出PWM
    的頭像 發表于 10-17 14:47 ?958次閱讀
    使用<b class='flag-5'>MM32F0270</b> 定時器DMA方式輸出PWM

    使用MM32F0270 LPTIMSTOP模式喚醒

    使用MM32F0270 LPTIMSTOP模式喚醒
    的頭像 發表于 10-26 16:46 ?1082次閱讀
    使用<b class='flag-5'>MM32F0270</b> LPTIM<b class='flag-5'>從</b>STOP<b class='flag-5'>模式</b><b class='flag-5'>喚醒</b>
    独赢百家乐官网全讯网| 赌博投注| 365足球备用| 平博百家乐官网游戏| 香港百家乐官网六合彩| 速博百家乐官网的玩法技巧和规则 | 百家乐官网解密软件| 精通百家乐官网的玩法技巧和规则 | 平注打百家乐官网的方法| 四方百家乐官网的玩法技巧和规则 | 卢克索百家乐官网的玩法技巧和规则| 百家乐的连庄连闲| 百家乐代理| 大玩家娱乐城| 易胜博百家乐官网作弊| 乐宝百家乐游戏| 网络百家乐破| 吉首市| 百家乐官网金海岸娱乐| 伟易博百家乐官网娱乐城 | 百家乐官网筹码防伪套装| 尊龙百家乐娱乐平台| 大富豪棋牌游戏中心| 百家乐官网游戏怎么刷钱| 做生意带什么装饰招财| 威尼斯人娱乐城网上百家乐| 777博彩| 马德里百家乐官网的玩法技巧和规则 | 大发扑克官方网站| 百家乐官网排名| 真人百家乐套红利| 鸿运国际| 真人版百家乐官网试玩| 路劲太阳城金旭园| 波音百家乐官网自动投注| 百家乐最新庄闲投注法| 博九娱乐场| 贵族百家乐官网的玩法技巧和规则 | 金三角娱乐城| 风水24山图| 赢真钱的棋牌游戏|