您的位置 首页 观点

STM32单片机的usb上电和断电函数的界说

STM32单片机的usb上电和断电函数的定义-usb_pwr.c 这个文件看文件名就知道跟功耗有关了,有很多的状态:上电、掉电、挂起、恢复。

usb_pwr.c 这个文件看文件名就知道跟功耗有关了,有许多的状况:上电、掉电、挂起、康复。

当首要是usb的上电和断电函数的界说了。

usb上电函数如下:

/*******************************************************************************

* FuncTIon Name : PowerOn

* DescripTIon : 上电

* Input : None.

* Output : None.

* Return : USB_SUCCESS.

*******************************************************************************/

RESULT PowerOn(void)

{

u16 wRegVal;

USB_Cable_Config(ENABLE);//接上上拉电阻

wRegVal = CNTR_FRES;//设置强制复位

_SetCNTR(wRegVal);

wInterrupt_Mask = 0;//先制止一切的中止

_SetCNTR(wInterrupt_Mask);

_SeTISTR(0);//铲除一切的中止标志

wInterrupt_Mask = CNTR_RESETM | CNTR_SUSPM | CNTR_WKUPM;

_SetCNTR(wInterrupt_Mask);//再翻开复位中止、挂起中止、唤醒中止屏蔽位

return USB_SUCCESS;

}

上电的进程是:

1、当然接上D+或D-的上啦电阻,让主机能够识别到USB;

2、装备USB操控寄存器CNTR,是USB强制复位

3、翻开复位中止、挂起中止、唤醒中止,其他中止屏蔽位则封闭

接下去是断电的函数界说:

/*******************************************************************************

* FuncTIon Name : PowerOff

* Description : 掉电

* Input : None.

* Output : None.

* Return : USB_SUCCESS.

*******************************************************************************/

RESULT PowerOff()

{

/* disable all ints and force USB reset */

_SetCNTR(CNTR_FRES);//设置强制复位

_SetISTR(0);//铲除一切的中止标志

USB_Cable_Config(DISABLE);//断开上拉电阻

_SetCNTR(CNTR_FRES + CNTR_PDWN); //设置强制复位,而且进入断电形式

return USB_SUCCESS;

}

掉电的进程很简单,先强制复位USB,并铲除一切的中止标志,断开上拉电阻,并设置操控进入断电形式。

挂起也是USB的一种状况,所谓的挂起开端便是进入低功耗状况,一般的工作我不响应,除非有重要的工作我才唤醒处理。

/*******************************************************************************

* Function Name : Suspend

* Description : 挂起

* Input : None.

* Output : None.

* Return : USB_SUCCESS.

*******************************************************************************/

void Suspend(void)

{

u16 wCNTR;

wCNTR = _GetCNTR(); //读取操控寄存器的值

wCNTR |= CNTR_FSUSP; //增加强制挂起标志

_SetCNTR(wCNTR); //进入挂起形式

wCNTR = _GetCNTR(); //读取操控寄存器的值

wCNTR |= CNTR_LPMODE; //增加低功耗标志

_SetCNTR(wCNTR); //进入低功耗形式

Enter_LowPowerMode(); //进入低功耗形式

}

进入挂起状况的进程跟咱们平常进入中止服务函数的进程很像,当然要维护现场了。所以usb进入挂起状况,不改动操控寄存器本来的值,只是在本来的上面增加了挂起状况和低功耗状况标志罢了。

提到挂起,当然有康复了。首要的讲Resume_Init()这个函数:

/*******************************************************************************

* Function Name : Resume_Init

* Description : 处理唤醒康复的函数

* Input : None.

* Output : None.

* Return : USB_SUCCESS.

*******************************************************************************/

void Resume_Init(void)

{

u16 wCNTR;

wCNTR = _GetCNTR();

wCNTR &= (~CNTR_LPMODE);

_SetCNTR(wCNTR);//进入非低功耗形式

Leave_LowPowerMode(); //脱离低功耗形式

_SetCNTR(IMR_MSK); //翻开使能悉数中止

}

这个便是唤醒的函数了,比较简单,可是比较难了解的是康复的各个状况。

typedef enum _RESUME_STATE

{

RESUME_EXTERNAL,

RESUME_INTERNAL,

RESUME_LATER,

RESUME_WAIT,

RESUME_START,

RESUME_ON,

RESUME_OFF,

RESUME_ESOF

} RESUME_STATE;

康复有这么多的状况改动,当然有理由了解下各个状况了。

RESUME_EXTERNAL:个人了解,就想硬件复位相同,是经过某个物理硬件唤醒USB的

RESUME_INTERNAL:这个状况的唤醒应该便是软件唤醒之类的,比方收到某个中止

RESUME_LATER:表明待会儿唤醒,当然这儿涉及到一个守时进程,守时时刻到了在开端康复

RESUME_WAIT:这个状况表明正在等候守时进程的完毕

RESUME_START:表明USB开端要进行康复了

RESUME_ON:表明行将康复,该状况坚持1毫秒~15ms内有用,主机就会对USB模块进行唤醒操作

RESUME_OFF:表明现已康复完成了

RESUME_ESOF:个人了解表明,收到ESOF中止标志时,USB不允许进入挂起状况

各个状况之间的转化如下代码:

/*******************************************************************************

* Function Name : Resume

* Description :这是状况机处理康复操作和时序。操控是根据Resume结构变量和

* ESOF中止调用该子程序没有改动机状况。操控康复的状况

* Input : a state machine value (RESUME_STATE)

* RESUME_ESOF doesn‘t change ResumeS.eState allowing

* decrementing of the ESOF counter in different states.

* Output : None.

* Return : None.

*******************************************************************************/

void Resume(RESUME_STATE eResumeSetVal)

{

u16 wCNTR;

if (eResumeSetVal != RESUME_ESOF) //假如不是ESOF中止导致的

ResumeS.eState = eResumeSetVal; //ResumeS.eState设置为自己设定的值

switch (ResumeS.eState)

{

case RESUME_EXTERNAL: //RESUME_EXTERNAL 外部康复

Resume_Init();

ResumeS.eState = RESUME_OFF;

break;

case RESUME_INTERNAL: //RESUME_INTERNAL 内部康复

Resume_Init();

ResumeS.eState = RESUME_START;

break;

case RESUME_LATER: //RESUME_LATER守时康复

ResumeS.bESOFcnt = 2;

ResumeS.eState = RESUME_WAIT;

break;

case RESUME_WAIT: //RESUME_WAIT 等候计时完毕

ResumeS.bESOFcnt–;

if (ResumeS.bESOFcnt == 0)

ResumeS.eState = RESUME_START;

break;

case RESUME_START: //RESUME_START 开端康复

wCNTR = _GetCNTR();

wCNTR |= CNTR_RESUME;

_SetCNTR(wCNTR); //设置唤醒恳求位,将向PC主机发送唤醒恳求

ResumeS.eState = RESUME_ON;

ResumeS.bESOFcnt = 10; //守时10ms,假如在这点时刻内坚持有用,主机将对USB模块进行唤醒操作

break;

case RESUME_ON: //RESUME_ON

ResumeS.bESOFcnt–; //计时中

if (ResumeS.bESOFcnt == 0) //计时时刻到了

{

wCNTR = _GetCNTR();

wCNTR &= (~CNTR_RESUME); //铲除唤醒恳求标志位

_SetCNTR(wCNTR);

ResumeS.eState = RESUME_OFF;

}

break;

case RESUME_OFF: //RESUME_OFF

case RESUME_ESOF: //RESUME_ESOF

default:

ResumeS.eState = RESUME_OFF;

break;

}

}

显着能够看到个状况的转化进程:

1、RESUME_EXTERNAL-》RESUME_OFF

2、RESUME_INTERNAL-》RESUME_START-》RESUME_ON-》RESUME_OFF

3、RESUME_WAIT-》RESUME_START-》RESUME_ON-》RESUME_OFF

4、RESUME_ESOF-》RESUME_OFF

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/346617.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部