历史上的今天
返回首页

历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2020年10月10日 | STM32待机模式测试

2020-10-10 来源:eefocus

环境:


主机:XP


开发环境:MDK4.10


单片机:STM32F103C8


功能:


开启RTC闹钟,然后进入待机模式,用闹钟唤醒后退出.



说明:


1.RTC闹钟唤醒事件发生时,同时进入闹钟中断,必须在初始化时与外部中断线17关联


2.如果仅想退出待机模式,RTC闹钟事件已经足够,不必与外部中断线17关联


3.退出待机模式后,接下来的流程类似于按下复位按键,程序会从头开始执行




源代码:


初始化时钟,配置时钟为内部时钟LSI,配置RTC闹钟唤醒以及外部中断线17



void RTC_Configuration(void)

{

//定义中断结构体

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

  //中断时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

 

//中断优先级配置

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

//设置RTC闹钟中断

NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

//闹钟中断接到第17线外部中断

    EXTI_ClearITPendingBit(EXTI_Line17);

    EXTI_InitStructure.EXTI_Line = EXTI_Line17;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);

 

//PWR_WakeUpPinCmd(DISABLE);  

 

//电源管理部分时钟开启

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

//使能后备寄存器访问

  PWR_BackupAccessCmd(ENABLE);

BKP_ClearFlag();

  BKP_DeInit();

  //使能LSI

  RCC_LSICmd(ENABLE);

  //等待晶振启动

while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)

{}

//设置时钟为内部晶振

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);  

RCC_RTCCLKCmd(ENABLE);

//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1

RTC_WaitForSynchro();

  RTC_WaitForLastTask();

//使能闹钟中断

RTC_ITConfig(RTC_IT_ALR, ENABLE);

RTC_WaitForLastTask();

//分频系数

  RTC_SetPrescaler(40000); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

RTC_WaitForLastTask();

//初始计数值

RTC_SetCounter(0);

RTC_WaitForLastTask();

//设置闹钟时间

  RTC_SetAlarm(2);

  RTC_WaitForLastTask();

}


闹钟唤醒中断代码:


void RTCAlarm_IRQHandler(void)

{

//等待RTC_CTL寄存器中的RSF位(寄存器同步标志)被硬件置1

RTC_WaitForSynchro();

  if (RTC_GetITStatus(RTC_IT_ALR) != RESET)

  {

  USART_SendData(USART1,'d');                              //发送数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

USART_SendData(USART1,'i');                              //发送数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

 

// 清EXTI_Line17挂起位

    EXTI_ClearITPendingBit(EXTI_Line17);

    // 检查唤醒标志是否设置

    if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)

    {

        // 清除唤醒标志

        PWR_ClearFlag(PWR_FLAG_WU);

    }

 

    /* Clear the RTC Second interrupt */

    RTC_SetCounter(0);

RTC_WaitForLastTask();

    RTC_ClearITPendingBit(RTC_IT_ALR);

RTC_WaitForLastTask();

  //RTC_SetAlarm(2);

  //RTC_WaitForLastTask();

  }

 

  return;

}


测试代码:(这是工程中的一部分,包含一些无关代码)


int main(void)

{

    struct _match_string_header match_string_header;

struct _match_string_tail match_string_tail;

unsigned char buffer[LEN_BUF];

unsigned char buffer1[LEN_BUF];

int len = 0;

int i = 0;

int j = 0;

int flag = 0;

int flag2 = 0;

int flag3 = 0;

int baud = 0;

unsigned short temp = 0; 

 

//初始化系统

init();

//初始化蓝牙

//读取flash中波特率

//write_baud(&edit_flash,9600);

//baud = read_baud(&edit_flash);

//读取有效

if (baud > 0)

{

set_uart_baud(1,baud);

set_uart_baud(2,baud);

}

else

{

//设置默认波特率

set_uart_baud(1,DEFAULT_BAUD);

  set_uart_baud(2,DEFAULT_BAUD);

}

 

//设置默认波特率

//Delay(10);

init_blue(DEFAULT_BAUD);

set_uart_baud(1,DEFAULT_BAUD);

set_uart_baud(2,DEFAULT_BAUD);

//Delay(500);

init_blue(DEFAULT_BAUD);

set_uart_baud(1,DEFAULT_BAUD);

set_uart_baud(2,DEFAULT_BAUD);

 

//初始化匹配字符

init_match_string_header(&match_string_header,"AT+BAUD");

init_match_string_tail(&match_string_tail,"END",8);

 

//读取2号备份寄存器中的值

temp = BKP_ReadBackupRegister(BKP_DR2);

if (temp == 0xabcd)

{

USART_SendData(USART1,'j');                              //发送数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

USART_SendData(USART1,'d');                              //发送数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

USART_SendData(USART1,'h');                              //发送数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

}

else

{

//写入2号备份寄存器

BKP_WriteBackupRegister(BKP_DR2,0xabcd);

    USART_SendData(USART1,'9');                              //发送数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

USART_SendData(USART1,'9');                              //发送数据

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束

}

 

//测试低功耗:待机模式

for (i = 0;i < 30000;i++)

{

for (j = 0;j < 500;j++)

{

__nop();

}

}

PWR_EnterSTANDBYMode();

 

while (1);}


推荐阅读

史海拾趣

GE公司的发展小趣事

对于光电控制电子生日蛋糕电路,网友可能提出多种问题。以下是一些可能的问题及其详细回答:

1. 光电控制电子生日蛋糕电路的基本工作原理是什么?

回答:光电控制电子生日蛋糕电路通常由一个光敏二极管(如VD1)、一个控制电路(如IC1,常为555时基集成电路或音乐芯片)以及其他外围元器件组成。当蜡烛被点燃并照射到光敏二极管上时,光敏二极管的电阻会发生变化,导致控制电路中的电压改变。这一电压变化进而触发控制电路,使其输出控制信号,驱动音乐芯片工作并输出音乐信号(如“祝你生日快乐”),同时可能还驱动发光二极管等元件闪烁,增加节日气氛。

2. 如何选择合适的元器件来构建这个电路?

回答:选择合适的元器件是构建光电控制电子生日蛋糕电路的关键。光敏二极管应选择灵敏度适中、响应速度快的型号;控制电路可以选择555时基集成电路或专用的音乐芯片,具体取决于电路设计的复杂度和功能需求;发光二极管可以选择高亮度、颜色鲜艳的型号以增强视觉效果;此外,还需要根据电路设计选择合适的电阻、电容等元器件。

3. 这个电路存在哪些安全隐患,如何避免?

回答:虽然光电控制电子生日蛋糕电路本身在正常情况下是安全的,但如果不当使用或制作过程中存在瑕疵,仍可能带来安全隐患。例如,电路中的电池如果处理不当,可能会导致电池液泄漏或短路;电子元件过热也可能引发火灾等。为了避免这些安全隐患,应确保电池安装牢固、电路连接正确无误;在使用过程中避免长时间连续工作,以防过热;同时,应让儿童在成人监护下使用此类电子生日蛋糕。

4. 如何调试和优化这个电路的性能?

回答:调试和优化光电控制电子生日蛋糕电路的性能可以通过以下步骤进行:首先检查电路连接是否正确无误;然后逐步测试各个元器件的功能是否正常;接着调整光敏二极管的灵敏度、控制电路的输出电压等参数以优化电路性能;最后在实际使用环境中进行整体测试,确保电路能够稳定可靠地工作。在调试过程中可以使用万用表等测试工具来监测电路中的电压、电流等参数变化。

5. 除了音乐和发光效果外,这个电路还可以实现哪些功能?

回答:除了基本的音乐和发光效果外,光电控制电子生日蛋糕电路还可以根据具体设计实现多种功能。例如可以加入烟雾效果装置来模拟真实的蜡烛燃烧效果;或者加入语音模块来播放生日祝福语等。这些功能的实现需要增加相应的元器件和电路设计复杂度但能够显著提升生日蛋糕的趣味性和观赏性。需要注意的是在实现这些功能时应充分考虑安全性和实用性避免过度复杂导致电路不稳定或安全隐患增加。

Doodle Labs公司的发展小趣事

Doodle Labs公司成立于2010年代初,由一群热衷于无线通信和物联网技术的工程师创立。在成立之初,公司就明确了自己的定位:专注于开发高性能、智能化的无线电技术产品,以满足日益增长的无人机和物联网设备的需求。通过不断的技术研发和创新,Doodle Labs成功推出了其首款智能无线电产品,为无人机提供了稳定、高效的通信解决方案。

BESTECH公司的发展小趣事

随着技术的不断进步和市场的不断变化,Doodle Labs意识到单一产品无法满足多样化的客户需求。因此,公司开始加大研发投入,不断推出新的产品线。其中,最为引人注目的是一款名为Helix的六波段智能无线电产品,它能够在1625-2500MHz的频率范围内工作,为无人机提供全方位的通信支持。这款产品一经推出就受到了市场的热烈欢迎,Doodle Labs也因此获得了更多的关注和认可。

Akustica(Bosch)公司的发展小趣事

Doodle Labs非常重视企业文化的建设和发展。公司倡导开放、创新、协作、共赢的价值观,为员工提供良好的工作环境和发展机会。同时,Doodle Labs还积极参与公益事业和社会活动,为社会做出贡献。在未来,Doodle Labs将继续秉承这些价值观和精神,致力于成为全球领先的无线通信技术提供商和物联网解决方案提供商。

GeneSiC公司的发展小趣事

在无线通信技术领域,Doodle Labs始终保持着领先地位。公司不断投入研发资源,积极探索新的技术方向和应用场景。近年来,Doodle Labs在5G、物联网安全等领域取得了重大突破,推出了一系列具有创新性的产品和技术解决方案。这些技术突破不仅提升了Doodle Labs的竞争力,也为客户带来了更多的价值和便利。

Glenair公司的发展小趣事
如果设定的欠电压保护阈值过高或过低,都可能导致电路无法正确触发保护动作。

问答坊 | AI 解惑

低压大电流开关电源的设计

1 引言       为了以更低的功耗获得更高的速度和更佳的性能,要求电源电压越来越低,瞬态性能指标越来越高,因此对开关电源提出了越来越高的要求。用原有的电路拓扑及整流方式已不能满足现在的要求,为了适应IC芯片发展的需要,人们开始研 ...…

查看全部问答>

如何成为一个优秀的模电设计师

请大家说说如何成为一个优秀的模电设计师,现在又做业务又做工程,累呀,总觉得知识更新不够快,跟不上形势。…

查看全部问答>

HT1622的使用问题,望牛人告知!

硬件结构图 这是我的源代码: #include #include typedef unsigned char byte; typedef unsigned int byte2; typedef unsigned long byte4; typedef byte bool; #define TRUE 1 #define FALSE 0 sbit CS = P0^0; sbit WR_CLK = P0^1; sbit ...…

查看全部问答>

如何查看WINCE 主频?

我用的是YLP2440的开发板,通过CE\\windows\\cpucheck.exe查看FCLK=200M。我在BSP中看到的MPLLCON=0X5C011,计算出来的FCLK=400。请问该板子FCLK究竟是多少?如果需要更改的话,是不是改BSP中MPLLCON就可以了?…

查看全部问答>

lstAdd的使用问题!

    SESSION_POS_S *pTestpos1, *pTestpos2, *pTestpos3, *pPos;     LIST *pMyList = NULL;     int NodeIndex = 0;             DPRINT(\"-------- lstAdd测试 -------\\n\" ...…

查看全部问答>

STR712不能在RAM中调试吗?所给例程都是在Flash中调试的吗?

                                 如果用ST的ARM只能买J-link吗?…

查看全部问答>

万利电子的STM32价格公布了

                                  …

查看全部问答>

【讨论】430在没有烧写程序的状态下,如何根据引脚状态判断它的好坏?

如题。 不烧程序,它的晶振也不会起振的吧? 请知道的大侠来赐教。…

查看全部问答>

毕业设计所需:请推荐串口接收数据能图像显示的软件

我的毕业设计是DS18B20温度传感 + nRF24L01无线数传 + 232串口发送给PC + 上位机显示但是,师兄的要求是要图表形式显示温度变化串口助手见得多了,找一个也不费事。但是好像就没见过能用图表显示的。最开始的打算是自己把当初上课学过的LABVIEW重新 ...…

查看全部问答>

【MSP430超低功耗时钟】软件框图

今天写软件写累了,休息一下,把MSP430超低功耗时钟的软件框图整理了一下。由于具体的IC还没确定。所以只能写个大概的框图。希望版主见谅。 …

查看全部问答>