/**
********************************** STM8S ***********************************
* @文件名 : bsp_awu.c
* @作者 : strongerHuang
* @库版本 : V2.2.0
* @文件版本 : V1.0.0
* @日期 : 2017年05月10日
* @摘要 : 自动唤醒源文件
******************************************************************************/
/*----------------------------------------------------------------------------
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "AWU.h"
#include "stm8s_awu.h"
#include "stm8s_tim3.h"
/************************************************
函数名称 : AWU_LSIMeasurement
功 能 : LSI时钟测量
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
uint32_t AWU_LSIMeasurement(void)
{
uint32_t lsi_freq_hz = 0x0;
uint32_t fmaster = 0x0;
uint16_t ICValue1 = 0x0;
uint16_t ICValue2 = 0x0;
/* Get master frequency */
fmaster = CLK_GetClockFreq();
/* Enable the LSI measurement: LSI clock connected to timer Input Capture 1 */
AWU->CSR |= AWU_CSR_MSR;
#if defined (STM8S903) || defined (STM8S103) || defined (STM8S003)
/* Measure the LSI frequency with TIMER Input Capture 1 */
/* Capture only every 8 events!!! */
/* Enable capture of TI1 */
TIM1_ICInit(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV8, 0);
/* Enable TIM1 */
TIM1_Cmd(ENABLE);
/* wait a capture on cc1 */
while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
/* Get CCR1 value*/
ICValue1 = TIM1_GetCapture1();
TIM1_ClearFlag(TIM1_FLAG_CC1);
/* wait a capture on cc1 */
while((TIM1->SR1 & TIM1_FLAG_CC1) != TIM1_FLAG_CC1);
/* Get CCR1 value*/
ICValue2 = TIM1_GetCapture1();
TIM1_ClearFlag(TIM1_FLAG_CC1);
/* Disable IC1 input capture */
TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E);
/* Disable timer2 */
TIM1_Cmd(DISABLE);
#else
/* Measure the LSI frequency with TIMER Input Capture 1 */
/* Capture only every 8 events!!! */
/* Enable capture of TI1 */
TIM3_ICInit(TIM3_CHANNEL_1, TIM3_ICPOLARITY_RISING, TIM3_ICSELECTION_DIRECTTI, TIM3_ICPSC_DIV8, 0);
/* Enable TIM3 */
TIM3_Cmd(ENABLE);
/* wait a capture on cc1 */
while ((TIM3->SR1 & TIM3_FLAG_CC1) != TIM3_FLAG_CC1);
/* Get CCR1 value*/
ICValue1 = TIM3_GetCapture1();
TIM3_ClearFlag(TIM3_FLAG_CC1);
/* wait a capture on cc1 */
while ((TIM3->SR1 & TIM3_FLAG_CC1) != TIM3_FLAG_CC1);
/* Get CCR1 value*/
ICValue2 = TIM3_GetCapture1();
TIM3_ClearFlag(TIM3_FLAG_CC1);
/* Disable IC1 input capture */
TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC1E);
/* Disable timer3 */
TIM3_Cmd(DISABLE);
#endif /* STM8S903 || STM8S103*/
/* Compute LSI clock frequency */
lsi_freq_hz = (8 * fmaster) / (ICValue2 - ICValue1);
/* Disable the LSI measurement: LSI clock disconnected from timer Input Capture 1 */
AWU->CSR &= (uint8_t)(~AWU_CSR_MSR);
return (lsi_freq_hz);
}
/************************************************
函数名称 : AWU_Initializes
功 能 : AWU自动唤醒
参 数 : 无
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void AWU_Initializes(void)
{
AWU_LSICalibrationConfig(AWU_LSIMeasurement());//校正LSI时钟
AWU_Init(AWU_TIMEBASE_30S); //初始化AWU
enableInterrupts();
}
进入停机模式前可以关闭不需要的电源等,修改单片机IO口等。
halt(); //进入停机模式
中断发生后要清除标志位: AWU_GetFlagStatus();
可以与窗口看门狗一起用,但不能与独立看门狗一起用。
上一篇:【STM8S】 独立看门狗
下一篇:瑞萨电子推出32位RX671 MCU,实现高性能和高能效
推荐阅读最新更新时间:2024-11-17 12:38
推荐帖子
- LED显示屏为什么能够得到广泛使用,我的总结是以下几点:
- 1、可延展性:LCD屏做的越大,生产线设备投入越高。而LED显示屏尺寸的增大是很容易的,就像搭积木一样。分辨率也方便根据用户需求实现。 2、全彩:灯泡,霓虹灯等都是单色的,LED实现了RGB三原色的组合。 3、可靠性高:LED是固体照明,可靠性高,不像霓虹灯管,灯泡之类的需要真空管的。 4、寿命长:LED芯片理论寿命可以达到10万小时,实际使用寿命在3万小时以上 5、环境友好:LED本身是节能无污染的产品。 LED目前遇到最大的问题是散热,显示屏也是一样。显示屏的功耗很大
- 探路者 LED专区
- 【SoC 6 BLE原型开发板】+GPIO使用篇
- GPIO的使用是掌握硬件开发的一块敲门砖,为此先通过例程试探了一番编程的途径。在例程中有一个名为GPIO_Pins的例程,其作用是通过按键可以中断方式来控制LED的变化。经对原程序的适当调整,终于是板载的LED出现了反应。在上电后,只有红色的LED灯被点亮,见图1所示。图1点亮红色LED但按下用户键后,在释放时会出现绿色LED的闪亮,随后会恢复熄灭状态,见图2所示。这主要是因为,该用户键被边沿触发,所以才在按键释放的瞬间来促使绿色LED发生变化。
- jinglixixi RF/无线
- 一个看似反相运算电路的正反馈运放电路
- 这几天在整理运放电路,发现自己忘得七七八八了。其中还因为记错了,惹出不少麻烦。比如,最基本的反相运放电路。看下图。左边是正常的负反馈反相运放电路,右边则是因为我无意记错,画出来的一个正反馈电路。一个看似反相运算电路的正反馈运放电路正常的反相电路没啥好说的,大家都懂。基本的分析要点,我自己就一直是这么算的,这种算法特快。虚断,虚短。所以,反相输入端电压其实是0,那么,输入和输出端其实就组成了一个简单的一个节点的KCL。于是乎就得出那个基本的公式,这里不提。
- 辛昕 模拟电子
- 【ST NUCLEO-U5A5ZJ-Q开发板测评】2、EXTI、PWM和串口的printf
- 串口printf输出Nucleo-U5A5的串口1和STlinkV3的串口相连,用以输出打印日志。在cubeMX中开启串口1,在工程中重定向,就可以使用printf了/*USERCODEBEGINIncludes*/#include"stdio.h"/*USERCODEENDIncludes*/#ifdef__GNUC__#definePUTCHAR_PROTOTYPEint__io_putchar(intch)#else#
- chrisrh stm32/stm8
- AM3358 PRU 用常量表方式如何实现对地址单元超过255地址(但没有偏移寄存器)的访问?
- 在AM3358中PRU介绍中,说是能用常量表方式访问ARM中的SPI等寄存器。常量寄存器C6,C16分别对应MCSPI0和MCSPI1的寄存器空间起始地址分别是:0x4803_0000和0x481A_0000。而MCSPI0和MCSPI1的绝大部分寄存器都在0x4803_0100和0x481A_0100后。而C6,C16由没有对应的CTBIR或者CTPPR与之关联。请教在用常量寄存器读写MCSPI0和MCSPI1中相对地址大于0x100的寄存器时,应该如何做?C语言和汇编语言的语
- ken DSP 与 ARM 处理器
- 科威PLC芯片组开发实例(十一)
- 实战攻坚!本节,给大家讲解针对EASY-M0806R这款PLC的SCAN用户驱动子程序该完成的功能。通过前面的讲解,大家应该知道,SCAN是在梯形图完成一次扫描以后被系统调用的程序,在这个程序里面,我们需要更新输入输出口的状态以及LED的状态。SCANSCAN:LCALLUSER_SCAN_O;输出端口和LED更新LCALLUSER_SCAN_I;输入端口和LED更新RETUSER_SCAN_O:
- 断琴残风 单片机
设计资源 培训 开发板 精华推荐
- NCP702MX18TCGEVB:1.8 V LDO 线性稳压器评估板
- 电路分析00-常用仿真仪器的使用
- 使用 MIC4575-3.3、6V - 24V 至 3.3V/1A 降压转换器的典型应用电路
- 使用 NXP Semiconductors 的 PPC5643LF0MMM 的参考设计
- OP484ESZ-REEL 缓冲网络补偿容性负载的典型应用
- MCP1630V 双向电源转换器/电池充电器的典型应用,适用于 4 节串联锂离子电池
- MPC5604EKIT: 恩智浦MPC5604EKIT:支持以太网视频传输的开发套件,配备恩智浦MPC5604E MCU
- 使用 Analog Devices 的 LTC5800IWR-IPMA 的参考设计
- 使用 Analog Devices 的 LTC3130IUDC-1 的参考设计
- LT1120IN8 5V 稳压器的典型应用电路