一。STM32低功耗模式讲解
有些设备比如可穿戴设备对功耗的要求非常高,比如手表,我在看时间或者获取数据的时候就需要正常的执行,
但有的时候比如晚上或有时候不需要使用它,但我们并不需要关机,可以通过低功耗模式让它更加省电,就延长了它的使用时间。
1. 睡眠模式: 内核停止,但是它的外设比如中断管理NVIC,系统的时钟Systick仍在运行。
2. 停止模式:比睡眠模式更加低功耗,所有的时钟都停止,但是1.8V的内核电源还在工作,但是其他的时钟比如 PLL,HIS和HSE RC振荡器功能全部禁止了。
寄存器和SRAM的内容保留。
3. 待机模式:功耗更低,内核1.8V的电源关闭,只有备份寄存器和待机电路维持供电。
寄存器和SRAM内容全部丢失,实现最低功耗。
运行模式,有些场景我们还是需要系统能正常运行,我们要降低功耗的话可以采取以下方式:
1. 降低系统时钟
2. 关闭APB和AHB总线上未被使用的外设的时钟。
STM32的三种低功耗模式
要进入这三种低功耗模式或者从三种低功耗模式退出的方法:
1. 睡眠模式:进入的方法:(1)执行WFI指令或WFE指令,只需要调用一个函数就OK了。
唤醒的方法: 对于WFI进入:任一个中断
对于WFE进入:唤醒事件
2. 停机模式: 进入的方法:PDDS和LPDS位 + SLEEPDEEP位都需要设置,然后再用WFI或WFE指令。
唤醒的方法:任何一种外部中断都可以(在外部中断寄存器中设置)
3. 待机模式: 进入的方法: PDDS位+SLEEPDEEP位设置,清除WUF位,然后再用WFI或WFE指令进入
唤醒的方法:通过WKUP引脚的上升沿(PA0引脚),或者RTC闹钟事件,或者NRST引脚上的外 部复位,独立看门狗IWDG复位。常用的是闹钟事件或者外部WKUP引脚。
实验程序用WKUP引脚(PA0)唤醒。
实验采用待机模式:
待机模式下大部分引脚都处于高阻状态。
在待机模式下F1只需要2uA的电流,非常低。
二。寄存器和库函数配置
1. PWR_CR电源控制寄存器
位1: PDDS,在进入待机模式要置1
SLEEPDEEP在系统控制寄存器SCB中置1。
清除PWR_CSR寄存器中的WUF位。
2. PWR_CSR 电源控制/状态寄存器
退出待机模式有几种方法,如果要用WKUP引脚唤醒怎么配置?
PWR_CSR寄存器位8,EWUP使能WKUP引脚。
固件库中低功耗操作函数
调用 void PWR_EnterSTANDBYMode(void); //进入待机模式
这个函数中执行了四个操作:1. PDDS位置1
2. SLEEPDEEP位置1
3. 清除WUF位
4. 执行WFI()指令,当然也可以执行WFE()指令
待机唤醒的配置步骤
三。实验程序讲解
实验程序比较复杂,主要是为了在同一个WKUP引脚(PA0)长按3秒进入待机模式,在待机模式下,长按3秒待机唤醒。
程序的设计思路提醒:
1. 先写一个待机唤醒测试
按下某一个按键进入待机模式
(1)在FWLlib下面要添加PWR相关的固件库 .c 和 .h文件
(2)程序设计:程序复位后液晶屏被点亮,显示一些内容,然后按下KEY0之后进入待机模式,在待机模式下按下WKUP键退出待机模式,程序又相当于复位从头开始执行,液晶屏又重新显示内容。
int main(void)
{
u8 x=0;
u8 lcd_id[12]; //存放LCD ID字符串
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
LCD_Init();
KEY_Init();
POINT_COLOR=RED;
LCD_ShowString(30,40,210,24,24,"WarShip STM32 ^_^"); //液晶屏显示一些内容
LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
while(1)
{
if(KEY_Scan(0) == KEY0_PRES)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //使能PWR时钟,在APB1总线上
PWR_WakeUpPinCmd(ENABLE); //使能WKUP唤醒引脚,使得在待机模式下按WKUP键能够退出待机模式
PWR_EnterSTANDBYMode(); //进入待机模式
}
delay_ms(10);
}
}
实验现象:程序开始运行,液晶屏显示三行文字,按下KEY0键时进入待机模式,液晶屏关闭,按下WKUP键,液晶屏重新显示内容。
2. 实验程序
在同一个WKUP引脚(PA0)长按3秒进入待机模式,在待机模式下,长按3秒待机唤醒。
wkup.c 文件
//PA0 WKUP唤醒初始化
void WKUP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能GPIOA和复用功能时钟,因为后面要把PA0引脚配置成外部中断,所以要开启复用功能。
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
//使用外部中断方式,配置中断线
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中断线0连接GPIOA.0
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //设置按键所有的外部线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); // 初始化外部中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
if(Check_WKUP()==0) Sys_Standby(); //开机后没有连续按下WKUP引脚3秒,进入待机模式 ,只有开机 时连续按下WKUP键3秒程序才能正常执行。
}
//检测WKUP脚的信号
//返回值1:连续按下3s以上
// 0:错误的触发
u8 Check_WKUP(void) //检测WKUP引脚的电平,3秒钟内连续按下返回1,
{
u8 t=0; //记录按下的时间
LED0=0; //亮灯DS0
while(1)
{
if(WKUP_KD)
{
t++; //已经按下了
delay_ms(30);
if(t>=100) //按下超过3秒钟,每30毫秒 t+1, t计数到100,说明到3秒钟
{
LED0=0; //点亮DS0
return 1; //按下3s以上了,返回1
}
}else
{
LED0=1;
return 0; //按下不足3秒,返回0
}
}
}
void Sys_Standby(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
PWR_EnterSTANDBYMode(); //进入待命(STANDBY)模式 ,进入待机模式
}
main.c文件
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
WKUP_Init(); //待机唤醒初始化
LCD_Init(); //LCD初始化
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Warship STM32");
LCD_ShowString(30,70,200,16,16,"WKUP TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/1/14");
while(1)
{
LED0=!LED0;
delay_ms(250);
}
}
//外部中断,检测到PA0脚的一个上升沿.
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位
if(Check_WKUP())//检测WKUP键是不是连续按下3秒钟,连续按下3秒进入待机模式
{
Sys_Enter_Standby(); //如果是连续按下3秒,就进入待机唤醒模式
}
}
//系统进入待机模式
void Sys_Enter_Standby(void)
{
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //复位所有IO口
Sys_Standby();
}
程序正常运行时显示几行文字,LED0交叉闪烁。
在WKUP_Init函数中如果没有连续按下3秒就进入待机模式
如果连续按下了WKUP键3秒,则正常执行,而在正常执行的情况下因为我们把WKUP设置了外部中断,进入外部中断函数
实验现象:
程序开始执行,判断WKUP是不是按下了,如果没有长按3秒就进入待机模式。
因为一开始没有按WKUP,所以进入待机模式,液晶屏不亮。
然后连续按WKUP3秒后就唤醒了,液晶屏显示几行文字,LED0也开始闪烁。
因为,一按WKUP的瞬间就被唤醒,同样开始执行主函数,执行到
if(Check_WKUP()==0) Sys_Standby(); //不是开机,进入待机模式
因为我们长按了3秒所以这个检测就不通过,就不会进入待机模式,程序就直接往下执行,液晶屏显示,LED0闪烁。
接下来再去长按WKUP3秒,又进入待机模式。因为程序正常运行情况下,我们把WKUP设置成了外部中断,所以一按PA0就会进入外部中断服务函数,在中断服务函数中去判断按下WKUP是不是超过3秒,超过3秒就进入到待机模式,如果按下的时间不到3秒钟,不会进入待机模式,液晶屏还是正常显示。
上一篇:51.内部温度传感器实验
下一篇:49. RTC实验讲解
推荐阅读
史海拾趣
在电子行业中,Free2Move公司的发展故事虽不直接聚焦于传统电子制造或硬件设计,但其作为出行科技领域的创新者,与电子行业有着紧密的联系,尤其是在汽车电子、物联网(IoT)以及数据服务等方面。以下是五个与Free2Move公司发展相关的事实性故事:
1. 电动汽车生态系统的构建
Free2Move eSolutions,作为Stellantis和Engie EPS的合资企业,致力于电动汽车(EV)产品设计、开发、制造和分销的领先地位。它通过与全球科技企业的合作,如埃森哲,推动电动汽车接入电网,加速出行领域的全面电气化。这一举措不仅促进了电动汽车市场的增长,还带动了电动汽车充电基础设施、电池管理系统等电子相关产业的发展。(参考来源:埃森哲公司官网)
2. 远程信息处理与数据分析的集成
Free2Move与Guidepoint Systems合作,利用远程信息处理技术提升车队管理效率。Guidepoint Air数据监控服务能够接收来自符合条件的Stellantis车辆的数据,包括速度、位置、发动机状态等,为经销商、商业和政府车队提供库存管理和车队管理服务。这种数据驱动的解决方案依赖于先进的电子设备和物联网技术,实现了对车辆运营状态的实时监控和数据分析。(参考来源:百家号)
3. 商业车队解决方案的开发
Free2Move与Samsara的合作是另一个值得注意的案例。两家公司共同开发了一个集成解决方案,使Stellantis原厂远程信息处理设备的数据能够导入Samsara的互联运营云。这一合作让车队客户能够通过一个控制面板访问车辆的GPS定位、发动机工作小时数、燃料使用量和胎压等关键信息,从而提高了车队的运营效率和驾驶员的安全性。这一解决方案的成功实施,依赖于电子传感器、云计算和数据分析技术的深度融合。(参考来源:搜狐网)
4. 共享出行服务的全球扩展
Free2Move在全球范围内提供共享出行服务,包括共享汽车、停车位和充电站等。这一业务模式的成功,离不开电子支付系统、移动应用技术和物联网平台的支持。例如,在中国市场,Free2Move通过与当地合作伙伴的合作,推出了易微享共享汽车服务,为用户提供便捷的出行体验。这一过程中,电子支付、移动应用开发和物联网技术的运用,都是不可或缺的关键因素。(参考来源:雪球)
5. 医疗保健领域的跨界合作
虽然Free2Move的核心业务并非直接面向电子医疗行业,但其品牌名称“Free2Move”被另一家公司在医疗保健领域采用,推出了用于患者运动评估的技术系统。这一跨界合作展示了Free2Move品牌在不同领域的广泛影响力和创新能力。尽管这一故事并不直接涉及Free2Move公司的传统业务,但它反映了电子技术在不同行业间的渗透和融合趋势,以及品牌价值的多元化应用。(参考来源:爱迪斯通(北京)科技有限公司官网)
以上五个故事,从不同角度展示了Free2Move公司在电子行业中的发展和影响,体现了其在技术创新、数据服务、市场拓展等方面的综合实力。
随着公司规模的扩大,Collins Electronics Corp开始将目光投向国际市场。他们积极参加国际电子展会,与世界各地的潜在客户和合作伙伴交流。通过与不同国家的企业合作,公司成功打入了国际市场,产品销量大幅提升。这一过程中,他们不仅学习了国际先进的电子技术,还积累了丰富的跨国运营经验。
近年来,国博电子凭借其卓越的技术实力和市场表现,荣获了多项荣誉和奖项。包括“2023-2024年度射频芯片市场最佳产品奖”、“2022年度联合创新体最高绩效奖励支持”等。这些荣誉不仅是对公司技术实力和市场地位的认可,也是对公司未来发展潜力的肯定。国博电子将继续秉持“用‘芯’创造未来”的企业文化,致力于成为全球射频电子领域的行业领导者。
ETI Systems深知人才是企业发展的核心竞争力。因此,公司一直注重人才培养和引进工作。通过建立完善的人才培养机制和激励机制,ETI Systems吸引了一批具有丰富经验和专业技能的优秀人才加入公司。同时,公司也积极为员工提供广阔的发展空间和良好的工作环境,让员工能够充分发挥自己的才能和创造力。这种重视人才的企业文化,为ETI Systems的长期发展提供了有力的人才保障。
随着公司业务的不断发展壮大,ETI Systems开始将目光投向国际市场。公司积极参加国际电子产品展览和技术交流活动,与来自世界各地的客户和合作伙伴建立了紧密的联系。同时,ETI Systems也加大了在海外市场的投入力度,通过设立分公司和办事处等方式,进一步拓宽了国际市场渠道。这种国际化战略的实施,为ETI Systems的持续发展注入了新的活力。
ETI Systems深知人才是企业发展的核心竞争力。因此,公司一直注重人才培养和引进工作。通过建立完善的人才培养机制和激励机制,ETI Systems吸引了一批具有丰富经验和专业技能的优秀人才加入公司。同时,公司也积极为员工提供广阔的发展空间和良好的工作环境,让员工能够充分发挥自己的才能和创造力。这种重视人才的企业文化,为ETI Systems的长期发展提供了有力的人才保障。
对于北京移动的资费下调行为,信息产业部电信研究院通信政策部副总工程师周光斌表示,目前电信资费管制已经开始从政府定价向市场定价转变,从制订资费标准向严格审批程序转变,因此电信资费最终还是必须由合理的市 ...… 查看全部问答∨ |
急-请教高手有没有IP核或芯片能达到编码20M输入,40M输出? 急……请教高手有没有IP核或芯片能达到编码20Mbps输入,40Mbps输出?谢谢!如果用级联码做,要求20Mbps输入,40Mbps输出,何种方案较好呢?… 查看全部问答∨ |
将开关电源的一些资源帖,在这里做成集锦,方便大家查阅。不断补充中........ 资料贴 1. 开关电源分类介绍 2. 开关电源设计全过程 3. 开关电源设计软件 4. 常见开关电源电气的技术指标 ...… 查看全部问答∨ |
|
受到liweiliang同学的启发,在他的帖子中想到了很多当初入行时候的辛酸,在日复一日的不断摸索中,不会只有辛酸和磨练,也有获得成功时的喜悦吧,大家说说做什么项目或者设计给你带来第一次成功的感觉,虽然那可能很短暂,但可能影响一生。… 查看全部问答∨ |
|
曾经在网上看到这样一篇帖子: { Linux下支持netfilter机制的配置工具就是iptables,它也就相当与一个应用程序,可以对netfilter进行配置(包过滤规则,NAT等等)。所以要实现netfilter(iptables)就要从两方面来着手:1)内核支持netfilter;2 ...… 查看全部问答∨ |
如何让USB虚拟出一个串口来,以至于当该设备插入时显示一个USB口和一个虚拟串口 现在在做一网卡项目,实现的功能是当网卡插入Windows XP系统时,显示一个USB口和一个串口,其中USB口实现上网,串口用于走AT命令等,现在在Windows端的驱动程序都已有现成的,USB也可以上网了 但是目前系统只可以检测到USB口,无法 ...… 查看全部问答∨ |
怎样让EVC在生成(build)程序时不自动连接设备并下载? 怎样让EVC在生成(build)程序时不自动连接设备并下载? 就是说我每次build程序时EVC总是会默认试图连接设备并将程序下载到设备,而实际上我并不需要这么做,所以我每次都得点"取消". 有没有设置让EVC不这么做?… 查看全部问答∨ |
网上查得 北京博创的光盘里有个在WINCE下扩ZLG7290的实验, 哪位做过类似的实验? 或是有他们光盘资料的,劳驾发一份给我,谢谢! sasinop@hotmail.com … 查看全部问答∨ |