IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32低功耗串口唤醒(RS485) -> 正文阅读

[嵌入式]STM32低功耗串口唤醒(RS485)

@[TOC]STM32低功耗串口唤醒(RS485)

STM32的低功耗模式

对于STM32的低功耗模式,有睡眠模式,停止模式以及待机模式三种,可以根据实际需求选择对应的模式,这三种模式的特点是,功耗P(睡眠)>P(停止)>P(待机),响应时间为T(睡眠)>T(停止)>T(待机)。本次采用常用的停止模式,其唤醒方式更多,并且和待机模式功耗接近,官方手册给出的停止模式功耗为20uA,待机模式为2uA,而睡眠模式为mA级。使用串口唤醒的方式进行唤醒。

RS485通讯唤醒

串口唤醒方式网上的例程有很多,但是使用RS485进行通讯的时候,需要注意一点,当我们将RX配置成外部中断的引脚之后,我们还必须确定接收使能的引脚,下图为485硬件电路,使能引脚为SP3485的2,3引脚。
在这里插入图片描述
以下是进入停止模式的自定义函数,在该函数中,最后一句 语句表示进入停止模式,在之前需要将485的接收引脚配置为低电平,一些可能消耗的外设引脚可根据具体项目设计,如此例中的风扇控制引脚,旨在将功耗降到最低。
根据停止模式的特性,进入停止模式之后各个IO状态是保持进入之前的IO状态且之后无法更改,所以可以在此处配置以便无法进行串口唤醒功能。

// An highlighted block
void system_enter_stopmode(void)
{
	//进入停止模式之前,设置以下IO口状态;停止模式保持IO状态不变
	GPIO_ResetBits(GPIOA,GPIO_Pin_11); //485接收引脚,设为0才能实现串口接收唤醒
	delay_ms(1);
	GPIO_ResetBits(GPIOA,GPIO_Pin_15);    //风扇控制引脚,避免该回路产生多余功耗
	uart_exti_int();  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);	//使能PWR外设时钟
	PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);
}

下图为RX配置为外部触发引脚部分代码,上升沿触发,触发之后进入外部中断中,在中断中为了不影响之后的串口通讯等功能,需要将各个时钟重新初始化,最简单粗暴的方法就是直接系统复位。

//串口外部中断配置
void uart_exti_int(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	NVIC_InitTypeDef NVIC_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;

	//使能GPIOA和复用使用
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;//PA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//

	//RX连接至PA10,上升沿触发
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource10);
	EXTI_InitStructure.EXTI_Line=EXTI_Line10;

	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);	 
	
	NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);

}

void EXTI15_10_IRQHandler(void)
{
  if(EXTI_GetFlagStatus(EXTI_Line10) != RESET)
	{
		EXTI_ClearITPendingBit(EXTI_Line10); 	
	  NVIC_SystemReset();  //复位重启
		
	}

}

如何在主函数中进入停止模式?
只需要在对应位置调用函数system_enter_stopmode()即可。本例程在while循环中用标志位判断的方式进入停止模式。

while(1)
	{ 
		if(flag_stop_mode	== 1) //系统判断需要进入停止模式
		{
		   system_enter_stopmode();
		}

此处注意程序逻辑上不要将STM32进入到停止模式的循环中,会导致无法下载程序。若不小心发生上述情况,可以使用强制下载程序功能。分为两种情况:
1.有复位按键的,在下载之前按住复位键,然后点击下载程序,会出现一个对话框,选择yes,之后停留一小会儿松开,即可强制下载。这个一会儿具体多久呢,可以自己试试。
2、若没有复位按键,可以使用镊子将复位引脚和地短路,之后步骤同1即可。
记录本次调试情况,
欢迎大家一起学习交流!
附上本次调试结果图:
正常运行模式:
在这里插入图片描述
停止模式,3mA的原因是外围电路中有部分电阻消耗,大家如果很大的话可以根据原理图看看哪个地方会有电流通过,通过配置IO口或者加大电阻值的方式来进一步减小功耗。
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:53:12  更:2021-12-11 15:54:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 2:11:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码