- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在上一篇文章中使用活跃停机模式实现单片机的定时自动唤醒功能。STM8单片机低功耗—活跃停机(Active Halt)模式实现-2 通过这个实验可以看出,自动唤醒功能和定时器定时功能很类似,那么能不能使用自动唤醒的定时功能实现LED灯的闪烁呢?
下面就通过这个自动唤醒功能来实现LED灯1s闪烁一次的功能。
首先初始化用到的外设
#define LED PB_ODR_ODR5
void LED_GPIO_Init( void )
{
PB_DDR |= ( 1 << 5 ); // 输出 led
PB_CR1 |= ( 1 << 5 ); // 推挽输出
}
//初始化PD2口
void EXTI_GPIO_Init( void )
{
PD_DDR &= ( ~( 1 << 2 ) ); //输入
PD_CR1 &= ( ~( 1 << 2 ) ); //浮空输入
PD_CR2 |= ( 1 << 2 ); //打开外部中断
}
//PD2口为中断输入 低电平触发
void EXTI_Init( void )
{
EXTI_GPIO_Init();
EXTI_CR1 &= ~( 3 << 6 ); //6 7 位清零
EXTI_CR1 |= ( 1 << 6 ); //PD上升沿触发
}
//端口D外部中断 中断号6
#pragma vector = 8 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void EXTI_PORTC_Handle( void )
{
//外部中断会将单片机从 停机模式唤醒
}
PB5口用来控制LED灯,用来指示程序运行的状态。PD2口作为外部中断,用于将单片机从低功耗模式唤醒。虽然这个例子中不需要用到外部中断。但是安装常规方法还是把这块也写上了。
接下来初始化AWU
void AWU_init()
{
CLK_ICKR |= 0x2C; // 活跃停机模式下主电压调节器处于关 打开低速振荡器(128K) 从停机或者活跃停机模式唤醒使能
FLASH_CR1 |= 0x04; // 当MCU在Active-halt 模式时FLASH处于掉电模式
AWU_APR = 0x3E; //设置异步预分频器值 64分频
AWU_TBR = 0x0C; //自动唤醒中断时间 2^11*64/128000=1.024s
AWU_CSR1 = 0x30; //使能自动唤醒中断 使能自动唤醒功能 使能测量功能
/*
在经过出厂校验后,在全温度范围内低速内部RC(LSI)振荡器的频率离散性是128 kHz +/- 12.5%。
为了获得精确的AWU时间间隔或者蜂鸣器输出,必须精确测量LSI频率。
*/
CLK_PCKENR2 |= 0x04; // 使能AWU与主时钟连接
CLK_ICKR |= 0x08; // 打开内部低速时钟源
}
#pragma vector = 3 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void AWU_HALT_Handler( void )
{
AWU_CSR1 = AWU_CSR1; // 清除更新中断标志位
}
设置自动唤醒定时时间为1s,然后将设置 外设时钟门控寄存器 2(CLK_PCKENR2)
,将AWU和主时钟连接起来。然后打开内部低速时钟。 其实最后两句配置语句
CLK_PCKENR2 |= 0x04; // 使能AWU与主时钟连接
CLK_ICKR |= 0x08; // 打开内部低速时钟源
也可以不用写,因为 CLK_PCKENR2 寄存器的复位值为 0xFF,所以再给他或一个0x04,结果并没有发生任何改变。
而第二行CLK_ICKR 的值初始话第一句的时候,已经将第四位的值设置为1了。这里单独写出来是为了重点提醒对时钟的配置。
这里还需要将自动唤醒中断打开,因为自动唤醒定时时间到了之后,自动唤醒标志位就会被置位,需要将标志位清除之后,下一次自动唤醒功能才会生效,如果不清除标志位,系统第一次进入活跃停机模式之后就不会被自动唤醒了。
下来就可以编写主函数了
void SysClkInit( void )
{
CLK_SWR = 0xe1; //HSI为主时钟源 16MHz CPU时钟频率
CLK_CKDIVR = 0x00; //CPU时钟0分频,系统时钟0分频
}
void main( void )
{
__asm( "sim" ); //禁止中断
SysClkInit();
delay_init( 16 );
LED_GPIO_Init();
EXTI_Init();
__asm( "rim" ); //开启中断
AWU_init(); //使能AWU
__asm( "halt" ); //进入 活跃停机(Active Halt)模式 1s 后自动唤醒
while( 1 ) //进入低功耗之前,电流5.5mA 进入低功耗之后电流
{
LED = !LED; //利用活跃停机定时自动唤醒功能实现LED灯1s闪烁一次
__asm( "halt" ); //再次进入 活跃停机(Active Halt)模式 5S后自动唤醒
}
}
首先初始化需要用到的外设和AWU,然后使用HALT指令让单片机进入活跃停机模式,1s钟之后,单片机就会被自动唤醒,然后进入while()循环中,此时将LED的状态取反,然后又进入到活跃停机模式中,1s钟之后单片机再次被自动唤醒。然后继续将LED取反,又进入到活跃停机模式中。这样一直循环。在外面观察时就会发现单片机上的LED灯亮1s灭1s一直循环闪烁。
当不使用低功耗模式时,通过延时函数来实现LED灯的闪烁,用万用表测量单片机的电流为6mA左右。通过活跃停机模式实现LED闪烁时,用万用表测量单片机的电流不到3mA。可以看出同样的LED闪烁功能,低功耗模式的功耗的确比正常模式小很多。如果系统使用的是电池供电的话,使用低功耗模式可以有效地延长电池使用寿命。
阅读世界,共赴山海
423全民读书节,邀你共读
我在基于某些逻辑的 Controller 中有一个“halt/1”,但不是在插头中。可悲的是,它确实重定向,但也在重定向后运行代码。 if true do conn |> put_flas
在上一篇文章 STM8单片机低功耗—等待(Wait)模式实现 中介绍了低功耗模式中的等待(Wait)模式代码实现方法,这篇文章就来演示一下 停机(Halt)模式的代码实现。 停机(Halt)模式的进入
我正在使用 getYahooData()函数在 TTR 包装相当激烈。 我有这段代码: for(i in 1:nrow(symbol)){ tryCatch(prices getYahooD
问题是,作为我的第一个可执行语句,我想检查是否可以从数据库中读取。如果我不能,我调用 MessageDlg这么解释,那我Halt; . 但是,关闭对话框后,我仍然在 tak 管理器中看到应用程序(如果
我正在查阅Sipser计算理论导论中的“暂停问题”的证明,而我主要关心的是以下证明: 如果TM M不知道何时循环(它不能接受或拒绝,这就是TM对于所有字符串都可识别图灵的原因),那么决策者H将如何确定
我有一个 mixin 模板,它只对某些参数有效。如果参数无效,我想用错误消息停止编译。对于模板,我会使用 assert(false, "Invalid args for Yoo") 但这不适用于 mi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关于您编写的代码问题的问题必须在问题本身中描述具体问题 — 并且包括有效代码 以重现它。参见 SSC
我应该绘制与“Movies”数据集有关的数据,并且我必须利用Rmarkdown并将我的工作转换为PDF。当我尝试渲染我的作品时,收到以下错误消息:。它所指的行如下:。我不确定出了什么问题。值得一提的是
所以我有一个遵循此布局的应用程序模块: defmodule Project.Application do use Application def start(_type, _args) do
我正在使用 Vagrant 1.7.4 和 VBox 5.0.0 在 Win7 上设置 Ubuntu 15.04 VM。 在第一个 vagrant up我可以使用 vagrant putty SSH
我对 MONITOR-MWAIT 与 HLT 指令产生了疑问。 两者都停止处理器,都在各种外部触发器(中断等)上唤醒。 在我的实验中,考虑到以下因素,HLT 和 MWAIT 的功能几乎相同: 如果您是
这是一个使用 RMI 的客户端/服务器应用程序。一旦服务器收到 destroy() 的 RMI 请求 - 我需要中止虚拟机。我正在使用 Runtime.getRuntime().halt(0) 来实现
Alonzo Church 使用 lambda 演算创建了一个用过程表示数字的系统。 例如:0 是 x , 1 是 f x , 2 是 f(f x) , 等等 其中数字是多少次 f被称为 x .我在
Slim 的文档阅读了以下关于框架的halt 方法的内容: Halt The Slim application’s halt() method will immediately return an H
在上一篇文章中使用活跃停机模式实现单片机的定时自动唤醒功能。STM8单片机低功耗—活跃停机(Active Halt)模式实现-2 通过这个实验可以看出,自动唤醒功能和定时器定时功能很类似,那么能不能使
前两篇文章介绍了低功耗模式中的 等待(Wait)模式和停机(Halt)模式的实现。这篇文章开始介绍 活跃停机(Active Halt)模式。 STM8单片机低功耗—等待(Wait)模式实现 STM8单
在上一篇文章中 STM8单片机低功耗—活跃停机(Active Halt)模式实现-1 没有使用活跃停机(Active Halt)模式的定时唤醒功能,使用的是外部中断唤醒,这篇文章来演示一下如何使用活跃
我在部署到本地工作的应用程序的 Shinyapps.io 时遇到了问题。应用程序使用 Shiny 和 Shiny 仪表板 .我能够在 RStudio 中运行该应用程序,但是当我单击发布时,它会停止执行
众所周知,停机问题不能有明确的解决方案,a) 返回 true 程序确实停止了,并且 b) 处理任何输入,但我想知道是否有足够好的解决方案来解决这个问题,那些可以完美地处理某些类型的程序流的程序,或者
我是一名优秀的程序员,十分优秀!