历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2019年02月13日 | STM32L0 进入STOP模式后串口中断方式唤醒

2019-02-13 来源:eefocus

实现功能:单片机以一定的采样频率(如2Khz)进行采样,例如每分钟(60s)只采前30s,后30s休眠(定时休眠唤醒),等到下一分钟再自动wakeup,如此循环30分钟。30分钟之后,单片机进入休眠stop模式。用串口中断的方式将休眠的单片机唤醒。


实现方法:


1、定时休眠唤醒code


HAL_Delay(2000);//进行采样的时间

HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);

HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 2, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//调用库函数进入STOP模式

SystemClockConfig_STOP();//停机模式后唤醒,恢复时钟源

count1++;

while(count1==1)//循环的次数

{

Rx_Init();

count1=0;

flag3=0;

__HAL_RTC_ALARM_DISABLE_IT(&RTCHandle, RTC_IT_ALRA);

__HAL_RTC_ALARM_CLEAR_FLAG(&RTCHandle, RTC_IT_ALRA);

HAL_TIM_Base_Stop(&TimHandle);   //定时器停止

HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);

HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//调用库函数进入STOP模式

}

计算方法:例如休眠4s

/*  RTC Wakeup Interrupt Generation:

Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI))

Wakeup Time = Wakeup Time Base * WakeUpCounter

= (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI)) * WakeUpCounter

==> WakeUpCounter = Wakeup Time / Wakeup Time BaseTo configure the wake up timer to 4s the WakeUpCounter is set to 0x1FFF:

RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16

Wakeup Time Base = 16 /(~39.000KHz) = ~0,410 ms

Wakeup Time = ~4s = 0,410ms  * WakeUpCounter

==> WakeUpCounter = ~4s/0,410ms = 9750 = 0x2616 */

HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0x2616, RTC_WAKEUPCLOCK_RTCCLK_DIV16);


局限性:用内部时钟LSI,大小固定导致Wakeup Time Base 被限制。 Wakeup Time(最大)=0.41ms*65535(0xffff)=26.869s,可能达不到休眠时间要求。


另一种方法:改HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 2, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);


这里RTC_WAKEUPCLOCK_CK_SPRE_16BITS是设置CR寄存器中的低三位,唤醒时钟选择,这里选择1hz,2表示工作2S后进入唤醒中断,这个数随便改,改成多少就是休眠多少时间。



2、串口中断唤醒


唤醒机制:在MCU进入STOP状态后,不能直接通过UART等外设唤醒,在MCU进入STOP前将RX脚设为EXTI模式,并使能对应的中断。唤醒后重新初始化串口、配置时钟。(这里贴两份代码,一份是我参考的百战天虫的code,另一份我自己的)



by:百战天虫


void Rx_Init()

{

GPIO_InitTypeDef GPIO_InitStruct;

__HAL_RCC_GPIOA_CLK_ENABLE();

  // 配置UART1的Rx引脚为EXIT模式

  GPIO_InitStruct.Pin = USARTx_RX_PIN;

  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 特别注意这里要使用中断模式

  GPIO_InitStruct.Pull = GPIO_PULLUP;

  HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 2, 0);

  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin==USARTx_RX_PIN)

{

//  HAL_NVIC_EnableIRQ(SysTick_IRQn);

SystemClockConfig_STOP();//停机模式后唤醒,恢复时钟源

HAL_Init();

SystemClock_Config();

SystemPower_Config();

HAL_SPI_DeInit(&hspi1);

HAL_GPIO_DeInit(GPIOA,GPIO_PIN_10);//串口重新初始化时HAL_UART_Init()函数会判断if(huart->State == HAL_UART_STATE_RESET),此时才会执行HAL_UART_MspInit(huart),配置串口IO口,这句话必须有!

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

SPI_GPIO_Init();

UartHandle.Instance        = USARTx;

UartHandle.Init.BaudRate   = uart_baud;

UartHandle.Init.WordLength = UART_WORDLENGTH_8B;

UartHandle.Init.StopBits   = UART_STOPBITS_1;

UartHandle.Init.Parity     = UART_PARITY_NONE;

UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;

UartHandle.Init.Mode       = UART_MODE_TX_RX;

GPIO_InitTypeDef  GPIO_InitStruct;

/*##-1- Enable peripherals and GPIO Clocks #################################*/

/* Enable GPIO TX/RX clock */

USARTx_TX_GPIO_CLK_ENABLE();

USARTx_RX_GPIO_CLK_ENABLE();

/* Enable USART2 clock */

USARTx_CLK_ENABLE();

/*##-2- Configure peripheral GPIO ##########################################*/

/* UART TX GPIO pin configuration  */

GPIO_InitStruct.Pin       = USARTx_TX_PIN;

GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull      = GPIO_NOPULL;

GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH  ;

GPIO_InitStruct.Alternate = USARTx_TX_AF;

HAL_GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStruct);

/* UART RX GPIO pin configuration  */

GPIO_InitStruct.Pin = USARTx_RX_PIN;

GPIO_InitStruct.Alternate = USARTx_RX_AF;

HAL_GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStruct);

HAL_NVIC_DisableIRQ(EXTI4_15_IRQn);

__HAL_GPIO_EXTI_CLEAR_IT(USARTx_RX_PIN);

HAL_NVIC_SetPriority(USARTx_IRQn, 4, 0);

HAL_NVIC_EnableIRQ(USARTx_IRQn);

}

}

结束!

推荐阅读

史海拾趣

Delus Corp公司的发展小趣事

Delus Corp公司起源于一家小型电子初创企业,专注于研发和生产特定领域的电子设备。在公司成立初期,团队面临资金短缺和技术挑战等重重困难。然而,他们凭借对技术的执着追求和对市场的敏锐洞察,成功研发出一款具有创新性的电子产品,该产品在市场上引起了广泛关注。这款产品不仅帮助公司获得了初始资金,也奠定了公司在电子行业的技术领先地位。

ATO SOLUTION公司的发展小趣事

在电子行业的激烈竞争中,ATO SOLUTION公司通过一项创新性的技术突破,成功引领了市场的新潮流。该公司研发出了一款高效能的半导体芯片,极大地提升了电子设备的性能和能效比。这一技术的问世,迅速获得了行业内外的广泛关注和认可,为公司赢得了大量合作伙伴和客户,奠定了市场领先地位。

G24 Innovations公司的发展小趣事

为了进一步拓展国际市场,远阳公司开始实施国际化布局战略。公司通过设立海外研发中心、生产基地等方式,加强与全球市场的联系和互动。同时,远阳还积极寻求并购整合机会,通过收购同行业优质企业,实现优势互补和资源共享。这些举措不仅增强了远阳的国际竞争力,也为企业的可持续发展注入了新的动力。

安谱隆(Ampleon)公司的发展小趣事

在独立发展后,安谱隆不断推出创新产品,巩固其在射频市场的地位。2015年12月,安谱隆推出了基于0.5μm工艺、额定功率为10至200W的GaN on SiC射频功率晶体管。这一产品的推出不仅展示了安谱隆在射频技术方面的领先实力,也为其在移动通信、广播电视等领域的应用提供了强有力的支持。

Foxconn_Optical_Interconnect_Technologies__Inc.公司的发展小趣事

在安谱隆的发展历程中,资本市场对其一直保持着高度的关注。然而,其“安家”之路却并不平坦。2017年,奥瑞德曾有意收购安谱隆,但由于资金问题,这桩收购最终未能成行。2018年,旋极信息也计划收购安谱隆,但同样未能成功。这些波折反映了资本市场对安谱隆价值的认可,但也暴露出安谱隆在寻找合适买家方面所面临的挑战。

Dicon Fiberoptics Inc公司的发展小趣事

DiCon Fiberoptics Inc公司成立于1986年,当时的光纤通信技术正处于快速发展阶段。公司创始人凭借对行业的敏锐洞察和坚定信念,决定投身于这一领域。在创业初期,公司面临着资金紧张、技术壁垒高等诸多挑战。然而,通过不懈努力和持续创新,DiCon成功研发出了多款高性能的光纤通信产品,逐渐在市场上获得了认可。

问答坊 | AI 解惑

欧姆龙PLC中断问题

欧姆龙PLC如何实现中断,从那里进入及退出,请高人指点!…

查看全部问答>

Keil C51 几类重要库函数 (2)

8. 第八章 dScope for Windows使用详解 1. 第一节 概述 1. 1. 主窗口(Mainframe Window) 可设置其它各种调试窗口,设置断点、观察点,修改地址空间,加载文件等等; 2. 2. 调试窗口(DEBUG Window) 支持用户程序的各种显示方式,可连续运行 ...…

查看全部问答>

请问在wince里怎样用wifi发送特定数据

请问在wince里怎样用wifi发送特定数据 有人说就是socket编程,我没想明白,难道系统会自动调用wifi? 还请各位前辈指点迷津!…

查看全部问答>

ST选型

请问谁清楚ST的哪个8位机有2个PWM,3个定时器,10路ADC,34个I/O(含10个AD口) ,是用来做电源的。wendellyang@163.com…

查看全部问答>

热电堆 信号选择

小弟最近想做一个用于微波炉的温度测量的红外探测模块。由于以前都没有做过项目,所以经验非常少,现在我苦于热电堆型号的挑选。         网上看了看有这些:SC0067、SC0070、10TP583T、OTP系列(如OTP-537F2、OTP- ...…

查看全部问答>

关于硬盘无刷电机的驱动

小弟在研究硬盘电机的驱动,我曾试过用小功率管9013,8050,8550等等来搭成达林顿管子,但是驱动电机的时候发热严重,而且明显有气无力...虽然能转...在网上找了很久,想用场效管IRF540N来驱动,但是不知道电路如何搭建...求各位高手,走过路过的能 ...…

查看全部问答>

8962 lwip 如何实现不同网段连接啊

求助,哪位告诉能指点下, 在8962上面使用lwip 如何实现不同网段的能够连接啊???就是公司网络 192.168.1.12的电脑 可以 ping通 192.168.2.2的电脑但是我的板子 192.168.1.10 ping不同 192.168.2.2的电脑…

查看全部问答>

差分放大器低通滤波器设计

有没谁用差分放大器做个低通滤波器的?请指点小弟一下,谢了...…

查看全部问答>

大三学生方向分流,求好心人指点

大三嵌入式又要分方向了, ARM 、 PCL、 单片机,感觉吧....就是没感觉,有没有前辈给这三个方向的发展,优缺点,就业情况分析一下啊? 小弟先谢谢了....!!!   …

查看全部问答>