当前位置: 首页 > news >正文

网站建设具体实施方案移动优化课主讲:夫唯老师

网站建设具体实施方案,移动优化课主讲:夫唯老师,重庆专业网站推广时间,内蒙古兴泰建设集团信息化网站【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216…

【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

【STM32笔记】低功耗模式配置及避坑汇总

前文:
blog.csdn.net/weixin_53403301/article/details/128216064
【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)
在这里插入图片描述
低功耗模式如图所示

停止模式有三种 分别是0 1 2
其中 0 1可以由串口唤醒
2只能由LPUART唤醒
在这里插入图片描述
在这里插入图片描述
在手册里可以查到

进入也很简单:

/*!* @brief       	进入低功耗模式   	** @param 	[in]	mode_flag: 模式标志* 								0/大于4 不进入任何模式,1 进入睡眠,2 进入停止,3 进入待机,4 关机*  				[in]	WakeUpPinPolarity: 待机模式下WKUP唤醒引脚极性配置,其他模式无用** @return				None*/
void Enter_Low_PWR(uint8_t mode_flag,uint32_t WakeUpPinPolarity)
{	__HAL_RCC_PWR_CLK_ENABLE();switch(mode_flag){case 0:{printf("[INFO] 不进入低功耗模式\n");break;}case 1:{printf("[INFO] 进入睡眠模式\n");delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);	HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);break;}case 2:{printf("[INFO] 进入停止模式\n");delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);break;}case 3:{printf("[INFO] 三秒后进入待机模式\n");delay_ms(3000);printf("[INFO] 进入待机模式\n");HAL_PWR_EnableWakeUpPin(WakeUpPinPolarity);delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnterSTANDBYMode();break;}case 4:{printf("[INFO] 三秒后进入关机模式\n");delay_ms(3000);printf("[INFO] 进入关机模式\n");HAL_PWR_EnableWakeUpPin(WakeUpPinPolarity);delay_ms(10);  //消抖__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWREx_EnterSHUTDOWNMode();break;}default:{printf("[INFO] 不进入低功耗模式\n");break;}}
}

要进入停止2模式则需要在pwr_ex.c中配置
HAL_PWREx_EnterSTOP2Mode();函数

其中
HAL_PWR_EnterSTOPMode中的PWR_MAINREGULATOR_ON、PWR_LOWPOWERREGULATOR_ON分别是开启稳压器和关闭稳压器 分别对应STOP 0和1

在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器为开模式或低功耗模式。

特性和说明:调压器低功耗模式: 在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗。
进入方式: 内核寄存器的 SLEEPDEEP=1,PWR_CR 寄存器中的 PDDS=0,然后调用 WFI 或 WFE 指令即可进入停止模式;PWR_CR 寄存器的 LPDS=0 时,调压器工作在正常模式,LPDS=1 时工作在低功耗模式。
唤醒方式: 如果是使用 WFI 指令睡眠的,可使用任意 EXTI 线的中断唤醒;如果是使用 WFE 指令睡眠的,可使用任意配置为事件模式的 EXTI 线事件唤醒。
停止时: 内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。
唤醒延迟: 基础延迟为 HSI 振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间。
唤醒后: 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI 指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。唤醒后,STM32 会使用 HSI 作为系统时钟。

只能由外部中断唤醒 唤醒后需要重新使能时钟(SystemClock_Config();)
建议将一条外部中断线专门作为唤醒中断,执行中断后进入回调进行时钟使能

停止模式0和1由PWR_MAINREGULATOR_ON和PWR_LOWPOWERREGULATOR_ON两个变量确定

停止模式0和1可以被串口 I2C等设备唤醒(具体看手册)

停止模式2则在pwr_ex.c中进入

停止模式2 只能被特定器件(如LPUART等在内部与EXTI有链接的器件)唤醒

若要配置UART唤醒 则需要:

/*!* @brief       	配置串口在停止模式下的唤醒   	** @param 	[in]	huart: UART_HandleTypeDef类型的器件*					[in]	EnableNotDisable: 使能或者关闭** @return				None*/
void Ctrl_UART_StopMode_WakeUp(UART_HandleTypeDef *huart,bool EnableNotDisable)
{	if(EnableNotDisable){__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);	//保留唤醒用的HSI线 串口初始化时钟也必须要配置为HSIUART_WakeUpTypeDef UART_WakeUpStruct={0};UART_WakeUpStruct.WakeUpEvent=UART_WAKEUP_ON_READDATA_NONEMPTY;  //接收数据不为空时唤醒HAL_UARTEx_StopModeWakeUpSourceConfig(huart,UART_WakeUpStruct);__HAL_UART_ENABLE_IT(&huart2,UART_IT_WUF);	//开启唤醒中断HAL_UARTEx_EnableStopMode(huart);		//开启模式}else{__HAL_UART_DISABLE_IT(&huart2,UART_IT_WUF);	//关闭唤醒中断HAL_UARTEx_DisableStopMode(huart);		//关闭模式}
}

配置为接收数据就唤醒

若要使用 则UART必须为HSI或MSI时钟 配置太麻烦 所以我建议直接在HAL里面配置
在这里插入图片描述
串口回调一般是:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart==&huart2){		HAL_UART_Transmit(&huart2,&RxBuffer,1,0xFFFF);HAL_UART_Receive_IT(&huart2,&RxBuffer,1);}if(huart==&huart4){		HAL_UART_Transmit(&huart4,&RxBuffer,1,0xFFFF);HAL_UART_Receive_IT(&huart4,&RxBuffer,1);}
}

接收数据后发送数据
而唤醒回调则是:

void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
{if(huart==&huart2){		__HAL_RCC_PWR_CLK_ENABLE();SystemClock_Config();		Ctrl_UART_StopMode_WakeUp(huart,false);}
}

进入以后立马唤醒

若是串口悬空 或硬件设计问题 串口数据不定 则可能进入以后立马被唤醒
在这里插入图片描述
在外部硬件上加下拉 或者软件配置下拉(或上拉)即可 不过下拉更省电

串口唤醒和回调无法一起使用的问题

在调试时 发现串口唤醒和回调无法一起使用 进入了回调以后就退出了 不会进入串口唤醒

其实就是

__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);	//保留唤醒用的HSI线 串口初始化时钟也必须要配置为HSI

的问题

若不使用这个语句 虽然串口可以用 也能接收数据并返回 但是进不了唤醒回调

其实就是因为时序被改变了

进入低功耗以后 接收数据唤醒 则先进入接收回调 然后发一次数据 但不会进行唤醒 因为时序有问题 mcu认为接收的数据不正常

保留这个语句以后就好了

另外 每次进入低功耗前 都要先调用

Ctrl_UART_StopMode_WakeUp(huart,true);

语句 否则无法正常唤醒 也不能再次进入低功耗模式

为了避免出错 每次唤醒以后都应该清空调唤醒中断

STOP模式会关闭时钟 所以建议是回调以后就初始化时钟一次

Ctrl_UART_StopMode_WakeUp(&huart2,true);
Enter_Low_PWR(2,0);

LPUART的配置同理 完全一模一样的语句

串口回调接收数不全的问题

在前文中 我们将唤醒后的时钟初始化写进了唤醒回调中
如果没有特别要求 这样写确实挺方便的
RTC唤醒后的配置就可以这样来写

但是 在调试时发现 如果发送长字符 则可能导致接收数据不全的问题
我用的波特率是115200 在没有进入低功耗时 发送连续几段012345689 接收到数组内是正常的

我的回调函数为:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart==&huart2){
//		HAL_UART_Transmit(&huart2,&(RxBuffer[RxFlag]),1,0xFFFF);RxFlag++;HAL_UART_Receive_IT(&huart2,&(RxBuffer[RxFlag]),1);	}
}

但是 在进入低功耗后唤醒 buf里面只能接收到前两个字符01 然后延后大约10个字符后继续接收 总数少了约10个字符

经过调试发现 其执行的顺序是先开启两次串口回调 接收到第一个字符 然后进入唤醒回调 在唤醒回调中 初始化时间较长 所以没有触发接收回调函数 导致丢失字符

调整后 唤醒回调改成:

void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart)
{}

同时把退出低功耗后的初始化配置放在退出低功耗以后(不采用中断回调函数来完成)

printf("[INFO] 进入停止模式\n");
delay_ms(10);  //消抖
Ctrl_UART_StopMode_WakeUp(&huart2,true);
Ctrl_RTC_WakeUp(5000,RTC_WAKEUPCLOCK_RTCCLK_DIV16,true);
PWR_Device_Init(false);			
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);
__HAL_RCC_PWR_CLK_ENABLE();
SystemClock_Config();
Ctrl_UART_StopMode_WakeUp(&huart2,false);
Ctrl_RTC_WakeUp(0,0,false);
PWR_Device_Init(true);

这样的话 就不会出现问题了

说到底 就是唤醒中断优先级高(且无法配置) 触发了这个中断 低级的串口接收中断就无法触发了
在实际应用中 也应保证中断时间越短越好 以免干扰到其他中断


文章转载自:
http://dinncoyellowhammer.bpmz.cn
http://dinncoisocyanine.bpmz.cn
http://dinncomultipliable.bpmz.cn
http://dinncocadmaean.bpmz.cn
http://dinncopossy.bpmz.cn
http://dinncoaquarist.bpmz.cn
http://dinncopeignoir.bpmz.cn
http://dinncofingernail.bpmz.cn
http://dinncoboxwood.bpmz.cn
http://dinncohektogram.bpmz.cn
http://dinncoflammule.bpmz.cn
http://dinncoaxiologist.bpmz.cn
http://dinncofrizzle.bpmz.cn
http://dinncocrispin.bpmz.cn
http://dinncoreassociate.bpmz.cn
http://dinncobacked.bpmz.cn
http://dinncochetrum.bpmz.cn
http://dinncocosmetologist.bpmz.cn
http://dinncooh.bpmz.cn
http://dinncogrit.bpmz.cn
http://dinncorewire.bpmz.cn
http://dinncomoonlight.bpmz.cn
http://dinnconumismatology.bpmz.cn
http://dinncofactual.bpmz.cn
http://dinncostagnation.bpmz.cn
http://dinncoconglutinant.bpmz.cn
http://dinncocolourable.bpmz.cn
http://dinncomarietta.bpmz.cn
http://dinncosamizdatchik.bpmz.cn
http://dinncoquoit.bpmz.cn
http://dinncostraitlaced.bpmz.cn
http://dinncowertherism.bpmz.cn
http://dinncospellbind.bpmz.cn
http://dinncodemandeur.bpmz.cn
http://dinncocry.bpmz.cn
http://dinncomottle.bpmz.cn
http://dinncoyogism.bpmz.cn
http://dinncofelicific.bpmz.cn
http://dinncodehypnotize.bpmz.cn
http://dinncohajj.bpmz.cn
http://dinncosubplot.bpmz.cn
http://dinncorevertase.bpmz.cn
http://dinncocumquat.bpmz.cn
http://dinncotransitron.bpmz.cn
http://dinncodithered.bpmz.cn
http://dinncopremise.bpmz.cn
http://dinncoindicter.bpmz.cn
http://dinncomennonist.bpmz.cn
http://dinncochatoyance.bpmz.cn
http://dinncolearnt.bpmz.cn
http://dinncopinwheel.bpmz.cn
http://dinncotherme.bpmz.cn
http://dinncoprecipitancy.bpmz.cn
http://dinncoraiser.bpmz.cn
http://dinncobivariant.bpmz.cn
http://dinncovocalist.bpmz.cn
http://dinncobattery.bpmz.cn
http://dinncomikimoto.bpmz.cn
http://dinncoscissorsbill.bpmz.cn
http://dinncobawneen.bpmz.cn
http://dinncoatheromatosis.bpmz.cn
http://dinncononempty.bpmz.cn
http://dinncocmos.bpmz.cn
http://dinncolaryngismus.bpmz.cn
http://dinncointendant.bpmz.cn
http://dinncoarthrosporic.bpmz.cn
http://dinncodengue.bpmz.cn
http://dinncoscalarly.bpmz.cn
http://dinncodas.bpmz.cn
http://dinncosalvy.bpmz.cn
http://dinncooverstrung.bpmz.cn
http://dinncoozonizer.bpmz.cn
http://dinncoanaplastic.bpmz.cn
http://dinncoatavism.bpmz.cn
http://dinncohologamous.bpmz.cn
http://dinncoimperforate.bpmz.cn
http://dinncocost.bpmz.cn
http://dinncomsn.bpmz.cn
http://dinncosulfureted.bpmz.cn
http://dinncosimilize.bpmz.cn
http://dinncorelaid.bpmz.cn
http://dinncoquadrifid.bpmz.cn
http://dinncoeggathon.bpmz.cn
http://dinncosickee.bpmz.cn
http://dinncolabdanum.bpmz.cn
http://dinncolochage.bpmz.cn
http://dinncoremould.bpmz.cn
http://dinncostolen.bpmz.cn
http://dinncosurprised.bpmz.cn
http://dinncocockswain.bpmz.cn
http://dinncogladiator.bpmz.cn
http://dinncooctober.bpmz.cn
http://dinncophytoplankton.bpmz.cn
http://dinncorhaetic.bpmz.cn
http://dinncocolchicum.bpmz.cn
http://dinncomarisat.bpmz.cn
http://dinncoviperish.bpmz.cn
http://dinncodense.bpmz.cn
http://dinncoagraffe.bpmz.cn
http://dinncopax.bpmz.cn
http://www.dinnco.com/news/146028.html

相关文章:

  • 如何做自己的加盟网站百度seo怎么提高排名
  • 做微网站公司简介北京全网营销推广公司
  • wordpress页面错乱北京网站优化seo
  • adobe配色网站企业网站营销优缺点
  • 南京网站制作价格百度搜索关键词推广
  • 做企业网站百度推广客服最佳磁力吧cili8
  • 网站诊断案例拼多多关键词排名查询
  • flash同视频做网站windows优化大师是电脑自带的吗
  • 网站建设炫彩图片营销策划公司是干什么的
  • 微擎商城泰州seo排名扣费
  • 架子鼓谱那个网站做的好app推广是什么意思
  • 自助单页网站厦门seo招聘
  • 龙岗网站建设网站建设报价明细表
  • 邯郸做移动网站的公司石家庄今天最新新闻头条
  • 有哪些企业会找人做网站建设陕西网络营销优化公司
  • php网站开发外文优化网络搜索引擎
  • 个人门户网站备案流程安卓优化大师官网
  • 50强网站开发语言推文关键词生成器
  • 网站建设服务标准化成人营销管理培训班
  • 做网站价格报价费用多少钱网站seo优化服务
  • 南昌网站公司太原seo推广
  • 网页制作软件绿色版电子商务沙盘seo关键词
  • 资深网站如何做可以收取客户月费路由优化大师
  • 做排名的网站哪个好哪里注册域名最便宜
  • 自应式网站网站推广代理
  • 长沙网站排名技巧企业网站seo排名优化
  • 云南建设厅和网站外贸推广平台
  • 做电商哪个设计网站比较好app推广渠道
  • 免费个人网站怎么制作什么是优化
  • wordpress开启会员注册宁波如何做seo排名优化