精华内容
下载资源
问答
  • stm32L151低功耗心得

    2020-09-11 00:00:51
    stm32L151低功耗心得前言STM32低功耗的三种模式低功耗的硬件设计 前言 最近结束了一个STM32L151的项目,项目基本条件就是电池供电、物联化,还有一堆通讯式的外设。我以前主要以榨干单片机性能的项目为主,这个项目...

    前言

    最近结束了一个STM32L151的项目,项目基本条件就是电池供电、物联化,还有一堆通讯式的外设。我以前主要以榨干单片机性能的项目为主,这个项目刚好相反,要求低功耗,而且STM32L151我也是第一次使用,写几篇文章纪念一下。
    这个项目在启动之初,照旧还是各路神仙争夺硬件配置制高点的批斗大会。对于单片机的选型,要么是NXP的LPC系列,要么是ST的L1系列,最后为减少我自己的学习量,还是选了L1系列的单片机。

    STM32低功耗的三种模式

    STM32,包括F1和L1系列(其他系列没研究过低功耗部分),低功耗模式有三种:
    (1) 睡眠模式:Cortex-M3内核停止,外围器件保持运行状态,比如RTC一直运行。
    (2) 停机模式:所有的时钟停止,电源低功耗运行。
    (3)待机模式:内核断电。
    在这里插入图片描述
    三种模式我都对比功耗,待机模式应该是功耗最低的模式。但是,停机模式下,任意的外部中断都能唤醒单片机,而且唤醒后内存内的数据依然保存为停机前的值,这两点对我的项目而言非常重要,我最终的选择就是使用停机模式。
    进入停机模式前,还是有很多工作要做的,包括:
    (1)停止所有不含唤醒所需外部中断的外部设备的供电,诸如关闭LED、停止给电机IC、通信模块供电等等。
    (2)片上外设在唤醒时用不上的全部关闭并且DeInit。
    (3)把唤醒时用不上的GPIO管脚全部改为输入,这一点很重要。STM32的管脚原理图如下:
    在这里插入图片描述
    (4)如果有需要,在停机前要先设置RTC的唤醒时间。
    (5)最后一步才是执行停机指令。

    /*系统进行停机模式以及唤醒后的时钟操作*/
    void sys_sleep_wakeup(void)
    {
    	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* 关闭滴答定时器 */  
    						
    	portENTER_CRITICAL();
    	PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFE);	
    	
    	//唤醒后			
    	RCC_HSICmd(ENABLE);
    	while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);
    	RCC_HSEConfig(RCC_HSE_OFF);  
    	if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET ){
    		while(1);
    	}
    	/*确保系统时钟为HSI,唤醒后默认为MSI*/
    	RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
    	
    	
    	while (RCC_GetSYSCLKSource() != 0x04);
    	
    	RCC_PLLCmd(ENABLE);
    	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
    
    	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* 使能滴答定时器 */  
    	portEXIT_CRITICAL();
    }
    
    void SetRtcWakeUpTime(uint32_t Second)
    {
    	RTC_WakeUpCmd(DISABLE);
    	RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
      RTC_SetWakeUpCounter(Second);
    	RTC_WakeUpCmd(ENABLE);
    }
    
    void EnterAndExitStopMode(void)
    {
    	bsp_LedOff(1);
    	bsp_LedOff(2);
    	bsp_LedOff(3);
    	bsp_LedOff(4);	
    	bsp_MoterStop();
    		
    	SPI_Cmd(SPI1 , DISABLE);
    	SPI_DeInit(SPI1);
    	USART_Cmd(USART1, DISABLE);
    	USART_DeInit(USART1);
    	USART_Cmd(USART2, DISABLE);
    	USART_DeInit(USART2);
    	USART_Cmd(USART3, DISABLE);
    	USART_DeInit(USART3);	
    	ADC_Cmd(ADC1,DISABLE);
    	ADC_DeInit(ADC1);
    	DMA_Cmd(DMA1_Channel1, DISABLE);
    	DMA_DeInit(DMA1_Channel1);
    	
    	tmp=GPIOA->MODER;
    	GPIOA->MODER = 0xffffffff;
    //  GPIOB->MODER = 0xffff3f3f;
    //  GPIOC->MODER = 0xfcfffcff;
    	
    	//设定唤醒时间(秒)
    	SetRtcWakeUpTime(43200);
    	
    	sys_sleep_wakeup();
    	/*从这里开始是唤醒后的恢复函数*/
    	GPIOA->MODER=tmp;
    		
    	bsp_InitUart(); 	/* 初始化串口 */
    	bsp_InitLed(); 		/* 初始LED指示灯端口 */
    	bsp_InitKey();		/* 初始化按键 */	
    	bsp_InitMotor();  /* 初始化电机*/
        bps_SpiInit();
    	bsp_InitRtc();   /*  初始化RTC */	
    	bsp_AdcInit();
    
    }
    

    低功耗的硬件设计

    要做到低功耗是需要软硬件互相配合的,我的项目有差不多两三个月都在折腾休眠功耗的问题,在这里给大家抛砖引玉:
    (1)上述程序实质上只能保证单片机在休眠期间的功耗,至于电路板上的其他IC、电阻、电容的功耗不是单片机程序能控制的,所以首先要在电路板上实现一个单片机最小系统来做测试。具体就是电路板只贴单片机及其最小依赖的外围元器件,把程序灌入单片机,观察单片机的休眠功耗。
    我的项目上,单片机的休眠功耗大概在20ua左右(因为开了几个中断,达不到手册上的水平)
    (2)ADC上使用的分压电阻,一定要使用高阻值的(M级),避免ADC电路电流过大。这一点在我的项目里有深刻教训。
    (3)控制电路板上外设的供电IC一定要留意其静态电流。

    展开全文
  • STM32L151低功耗试验

    2019-04-13 14:40:39
    STM32L151C8T6单片机关于低功耗的程序学习,编译可直接通过,用于新手学习。
  • 非常详细的例程,里面包含了STM32L151所有的基础例程和源代码,非常适合学习。
  • 本文主要讲述stm32L151低功耗问题——待机模式。 以下代码理论10s唤醒一次,时间可自由设置,详细配置之代码注释有 问题描述: 不废话直接上代码: LowPower.c文件: #include "LowPower.h" #include "stm32l1xx_...

    一、最近在搞stm32L151C8T6的低功耗模式。

    项目场景:

    提示:这里简述项目相关背景:
    LoRa低功耗,用到stm32L151C8T6+sx1278,SPI通信。本文主要讲述stm32L151低功耗问题——待机模式。
    以下代码理论10s唤醒一次,时间可自由设置,详细配置之代码注释有


    问题描述:

    不废话直接上代码:
    LowPower.c文件:

    #include "LowPower.h"
    #include "stm32l1xx_rtc.h"
    #include "stm32l1xx.h"
    #include "stm32l1xx_exti.h"
    #include "misc.h"
    #include "stm32l1xx_rcc.h"
    #include "stm32l1xx_pwr.h"
    
    //RTC 时钟配置
    void rtc_init(void) {
        RTC_InitTypeDef RTC_InitStructure;
    	RTC_TimeTypeDef  RTC_TimeStruct;
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        /* Enable the PWR clock */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        /* Allow access to RTC */
        PWR_RTCAccessCmd(ENABLE);
        RTC_WaitForSynchro();
    	 /* Reset RTC Domain */
        RCC_RTCResetCmd(ENABLE);
        RCC_RTCResetCmd(DISABLE);
        /* Enable the LSI OSC */
        RCC_LSICmd(ENABLE);
        /* Wait till LSE is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
    	/* Select the RTC Clock Source */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//选用LSI是低速内部时钟,RC振荡器,频率为40kHz
      
    
        /* Configure the RTC data register and RTC prescaler */
            RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
            RTC_InitStructure.RTC_SynchPrediv = 0xFF;
            RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
            RTC_Init(&RTC_InitStructure);
    				/* Set the time to 00h 00mn 00s AM */
            RTC_TimeStruct.RTC_H12     = RTC_H12_AM;
            RTC_TimeStruct.RTC_Hours   = 0x00;
            RTC_TimeStruct.RTC_Minutes = 0x00;
            RTC_TimeStruct.RTC_Seconds = 0x00;  
            RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);
            /* Enable the RTC Clock */
            RCC_RTCCLKCmd(ENABLE);
    
            /* Wait for RTC APB registers synchronisation */
            RTC_WaitForSynchro();
    
    	}
    
    	// 设置RTC 报警时间间隔
    void RtcAlarmTime_Set(void)
    {
            RTC_AlarmTypeDef RTC_AlarmStructure;
    
            RTC_GetTime(RTC_Format_BIN, &(RTC_AlarmStructure.RTC_AlarmTime));
    	
    		//10在分钟的时候可以换成任意值;但是当要秒,屏蔽分钟时必须是5的倍数,这和RTC_AlarmSubSecondConfig函数有关。
    		/***注意:实际测试时间在lora板上总是比理论设置的时间要快,基本上10s要快上1s;这是由于晶振或者电容不匹配原因,本人猜测电容原因很大***/
           // RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = (RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes+10);   //实际唤醒时间为:9min左右唤醒一次
    				RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = (RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds+10);		//秒唤醒时间,必须为5的倍数
    	
    				printf("rtc %d, %d, %d", RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours, RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes, RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds);
    
            /* Set the alarmA Masks */
            //RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay|RTC_AlarmMask_Hours|RTC_AlarmMask_Seconds;  //屏蔽不需要的参数
    				RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay|RTC_AlarmMask_Hours|RTC_AlarmMask_Minutes;  //屏蔽不需要的参数
            RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure);
            RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
    }
    
    //RTC定时器A的配置
    void platform_rtc_set_alarmA(void) {
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RTC_AlarmTypeDef RTC_AlarmStructure;
    	
       
        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; //使能LINE17
        EXTI_Init(&EXTI_InitStructure);
    
        /* Enable the RTC Wakeup Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; //RTC_Alarm_IRQn RTC_WKUP_IRQn
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    	
    	RtcAlarmTime_Set();
    
        RTC_GetTime(RTC_Format_BIN, &RTC_AlarmStructure.RTC_AlarmTime);
    		
    	RTC_AlarmSubSecondConfig(RTC_Alarm_A, 0xFF, RTC_AlarmSubSecondMask_SS14_5);
    	/* Enable AlarmA interrupt */
    	RTC_ITConfig(RTC_IT_ALRA, ENABLE);
    				
        RTC_AlarmCmd(RTC_Alarm_A, ENABLE); //开启闹钟A
    		
        RTC_ClearITPendingBit(RTC_IT_ALRA); //清除RTC闹钟A的标志
        EXTI_ClearITPendingBit(EXTI_Line17); //清除LINE17上的中断标志位
    
    }
    void Sys_Standby1(void) {
        PWR_ClearFlag(PWR_FLAG_WU);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);        //使能PWR外设时钟
        printf("\r\n entry stop mode!\n ");
    	PWR_EnterSTANDBYMode();   ///进入待命(STANDBY)模式                  
    }
    
    
    //定时器唤醒处理中断,待机模式不进入中断,stop模式才会进入
    
    //void RTC_Alarm_IRQHandler(void) {
    //    if (RTC_GetITStatus(RTC_IT_ALRA) != RESET) {
    //			
    //        RTC_ClearITPendingBit(RTC_IT_ALRA);
    //			 RTC_AlarmCmd(RTC_Alarm_A, DISABLE);
    //        RtcAlarmTime_Set();
    //        EXTI_ClearITPendingBit(EXTI_Line17);
    //				printf("请求111111n");
    //    }
    //}
    

    main.c函数:

    int main()
    {
    	//系统初始化
    	//串口初始化
    	//。。。初始化
    	rtc_init();   //RTC初始化
    	platform_rtc_set_alarmA();   //RTC闹钟唤醒配置
    	while(1)
    	{
    		//要执行的程序
    		......
    		......
    		Sys_Standby1(); //进入待机模式
    	}
    }
    

    注意事项:

    1. 时钟问题
      在第二部分为什么说是理论10s呢?因为我在测试的时候发现真正唤醒的时间是8s/9s的样子,基本上设置10s会快上1s左右,2min快上12s左右,10min快上一分钟。这就有点离谱了,后来有看到网有在网上说这是因为晶振或者电容不匹配导致的,内部时钟好像确实不准确。可以换为外部晶振更加精准,电容的话就需要在焊板子的时候选用了,这暂时超纲了,不谈。
    2. 是否进入中断
      standy待机模式不进入中断,stop模式进入,详细见网有博客:停机和待机唤醒程序入口
    3. 中断标志清除
      对于Alarm唤醒来说,主要是Alarm初始化是要注意中断标志位。
      对于停机唤醒要格外注意在中断服务函数种清除用到的中断标志位。

    心得:

    1. wakeup唤醒,最多可实现33s左右时间的唤醒,想要达到更高时间就无法使用。Alarm使用这样的计算方法一样可以达到周期性唤醒单片机:
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = (RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds+10);	//秒唤醒时间,必须为5的倍数
    
    1. Alarm唤醒,Alarm唤醒不进入闹钟中断函数,到时间就自动唤醒后,自动重新设置Alram。stop模式更复杂,会进入中断函数,必须进行中断标志位的清除,否则会影响下一次唤醒。
    展开全文
  • stm32l15xx系列低功耗芯片的低功耗待机测试例程,中断唤醒
  • 最近做一个低功耗的项目,所用单片机是stm32l151c8t6-A,程序中在进入低功耗之前,将ADC, USART,TIMER, GPRS等都关闭了,功耗仍然在200uA,于是怀疑是硬件的问题,咨询原来的同事,他说电压芯片使能脚的分压电阻不能...

    最近做一个低功耗的项目,所用单片机是stm32l151c8t6-A,程序中在进入低功耗之前,将ADC, USART,TIMER, GPRS等都关闭了,功耗仍然在200uA,于是怀疑是硬件的问题,咨询原来的同事,他说电压芯片使能脚的分压电阻不能太小,

    果然在电源那里TPS76933使能脚的分压电阻那里有问题

    使能脚的分压电阻太小了是不行的,于是换了个大点的电阻100K,然后功耗就降到了20uA,

     

    20uA也还是没有达到最低功耗,这个功耗也是属于比较高的,正常功耗必须在10uA以下才对,

    然后继续查找硬件的原因,发现TPS76933的功耗比较大, 典型值为17uA,

    而改用TPS70930(下图)在低功耗时,最大功耗为1.8uA,于是换掉这个芯片,果然,豁然开朗,

    功耗降到了3.3uA. 

    总结:1. 电源芯片的选择,对于功耗的影响还是很大的,

                2. 电源芯片的匹配电阻也要选择好大小。

    下面是我在解决问题的过程中,看到的一篇文章,再次贴出来,也许会对需要的人有用。不过,我试过,对我的程序里没有用。

    我的ADC也DISABLE了。

     

    https://wenku.baidu.com/view/c9e10e2eb207e87101f69e3143323968001cf47d.html

    展开全文
  • STM32l151低功耗芯片串口通信(HAL库)

    万次阅读 2015-11-17 16:53:57
    参考原子的stm32F1系列的串口通信实验,移植到stm32L1系列的程序代码。 1、采用串口中断方式,串口接收到消息产生中断,因此需要使能RXNE寄存器。HAL库函数的调用方式是__HAL_UART_ENABLE_IT(&UartHandle1, ...

    参考原子的stm32F1系列的串口通信实验,移植到stm32L1系列的程序代码。

    1、采用串口中断方式,串口接收到消息产生中断,因此需要使能RXNE寄存器。HAL库函数的调用方式是__HAL_UART_ENABLE_IT(&UartHandle1, UART_IT_RXNE);

          UartHandle1是UART_HandleTypeDef类型,具体参考stm32lxx_hal_uart.h文件。

    2、关于串口初始化,由于HAL库中的串口初始化函数HAL_UART_Init();会调用HAL_UART_MspInit();后者是一个关于串口1和串口2的I/O端口模式选择及初始化的函数。

          为了使程序能顺利进入中断,可在MspInit()函数或者HAL_UART_Init()函数中使能串口并在这里设置优先级,HAL_NVIC_SetPriority(USART1_IRQn,0,1);
    HAL_NVIC_EnableIRQ(USART1_IRQn);

    3、编写串口中断函数。采用一个unsigned char类型数组作为串口缓存,一个unsigned short int 作为串口接收缓存区的指针。

          需要注意的是发生了中断必须要清除中断标志,否则程序将一直处于该中断。但是从参考手册可以得知,在中断中对数据寄存器进行一次读操作,即可清除RXNE寄存器的标志位,所以,在中断里读取并且保存DR寄存器中的内容是一个很好的选择。

    4、部分代码

    1.串口初始化

     

    bool InitSerial(uint32_t  BaudRate)
    {
    	UartHandle1.Instance        = USART1;
      UartHandle1.Init.BaudRate   = BaudRate;
      UartHandle1.Init.WordLength = UART_WORDLENGTH_8B;
      UartHandle1.Init.StopBits   = UART_STOPBITS_1;
      UartHandle1.Init.Parity     = UART_PARITY_NONE;
      UartHandle1.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
      UartHandle1.Init.Mode       = UART_MODE_TX_RX;
    /******************************************************************************/
    	
    /*****************************************************************************/	
      if (HAL_UART_Init(&UartHandle1) != HAL_OK)
      {
        /* Initialization Error */
    		Print("USART1 Init failed.");
      }
    	__HAL_UART_ENABLE_IT(&UartHandle1, UART_IT_RXNE);
    	return true;
    }

    2. MspInit

     

     

    void HAL_UART_MspInit(UART_HandleTypeDef *huart)
    {
      GPIO_InitTypeDef  GPIO_InitStruct;
    
      /*##-1- Enable peripherals and GPIO Clocks #################################*/
      /* Enable GPIO TX/RX clock */
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
      /* Enable USARTx clock */
      __HAL_RCC_USART1_CLK_ENABLE();
    	__HAL_RCC_USART2_CLK_ENABLE();
    
      /*##-2- Configure peripheral GPIO ##########################################*/
      /* UART TX GPIO pin configuration  */
      GPIO_InitStruct.Pin       = GPIO_PIN_9;
      GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull      = GPIO_PULLUP;
      GPIO_InitStruct.Speed     = GPIO_SPEED_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
      /* UART RX GPIO pin configuration  */
      GPIO_InitStruct.Pin = GPIO_PIN_10;
      GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    	
    	HAL_NVIC_SetPriority(USART1_IRQn,0,1);
    	HAL_NVIC_EnableIRQ(USART1_IRQn);
    	
    	
    	//UART2
    	GPIO_InitStruct.Pin = GPIO_PIN_2;
      GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    	
    	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    	
    	GPIO_InitStruct.Pin = GPIO_PIN_3;
      GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    	
    	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    	HAL_NVIC_SetPriority(USART2_IRQn,2,2);
    	HAL_NVIC_EnableIRQ(USART2_IRQn);
    }


    3.中断程序

     

     

    void USART1_IRQHandler(void)
    {
    	uint8_t Res;
    	if(__HAL_USART_GET_FLAG(&UartHandle1,USART_FLAG_RXNE)!=RESET) //´®¿Ú1½ÓÊÕµ½ÏûÏ¢
    	{
    		Res=(uint16_t)(USART1->DR & (uint16_t)0x01FF);							//¶ÁÈ¡Êý¾Ý¼Ä´æÆ÷£¬´Ë²Ù×÷»áÇå³ýÖжϱê־λ
    		if((USART1_STA&0x8000)==0){																	//½ÓÊÕ»¹Î´Íê³É
    			if(USART1_STA&0x4000){
    				if(Res!=0x0a)USART1_STA=0;
    				else USART1_STA|=0x8000;
    			}
    			else
    			{
    				if(Res==0x0d)USART1_STA|=0x4000;
    				else{
    					USART1_RX_BUF[USART1_STA&0x3FFF]=Res;
    					USART1_STA++;
    					if(USART1_STA>255)USART1_STA=0;
    				}
    			}
    		}
    	}
    }

    4.主函数测试代码

     

     

    Print("USART1_Test: USART1_STA=%d\r\n",USART1_STA);
    	while(1)
    	{
    		if(USART1_STA&0x8000)
    		{
    			len=USART1_STA&0x3fff;
    			Print("Receive message from PC,Length is %d\r\n",len);
    			Print("USART1_RX_BUF is :\t");
    			HAL_UART_Transmit(&UartHandle1,USART1_RX_BUF,len,20);
    			Print("\r\n");
    			USART1_STA=0;
    		}
    		else
    		{
    			cnt++;
    			if(cnt==500){
    				Print("test!\r\n");
    				ToggleLed();
    				cnt=0;
    			}
    		}
    		HAL_Delay(10);
    	}

     


    串口间通信方法(示例:串口1发送给串口2)

     

     

    void USART1_TO_USART2(void)
    {     
    	unsigned char len = 0;
        unsigned char i = 0;
    	len = USART1_STA;             
        if ((USART1_STA&0x8000) != 0 )
        {
    		HAL_Delay(10);
    		len = USART1_STA&0x3FFF;
    		USART1_RX_BUF[len] ='\r';   
            USART1_RX_BUF[len+1] ='\n';              
    		for ( i = 0; i <= len+1; i++ )
    		{
    			RX1_Buff[i] = USART1_RX_BUF[i];
            }
            USART1_STA = 0;      
    		HAL_UART_Transmit(&UartHandle2,(uint8_t*)RX1_Buff,len+1,20);
    	 }
    }

     

     

     

     

     

    展开全文
  • STM32L151CC低功耗调试记录 在调试L151低功耗的时候 一直保持200uA左右最后发现将IO设置为模拟输入,瞬间电流降低。除调试管脚外所有管脚都要设置为模拟输入。 ...
  • STM32CUBEMX stm32L151按键低功耗及唤醒

    千次阅读 2020-01-09 18:15:20
    1、选择芯片,当前示例选择stm32l151c8t6 2、配置RCC及SYS 只需配置高速时钟(HSE)和DEBUG 3、配置时钟树 时钟源采用外部8M晶振,单片机HCLK采用8M,过高运行功耗高,过程序运行时精准延时(delay_us)...
  • STM32L151,HAL库,ADC多通道使用DMA中断传输,解决ADC通道错乱问题。OLED显示,STM32 stop低功耗模式。
  • STM32L151C8T6和STM32L151C8T6A的区别

    千次阅读 2020-07-14 18:55:18
    我们在使用STM32L151这款超低功耗芯片的时候,容易混淆尾缀“A”,这里的“A”可以理解为 advance,也就是说,STM32L151C8T6A是STM32L151C8T6的高级版,哪高级了呢? 主要是RAM的大小,来看下官方手册里的资源表: ...
  • 超低功耗研发-STM32L151C8T6芯片(二)低功耗模式 超低功耗研发-STM32L151C8T6芯片(三)RTC自动唤醒机制 超低功耗研发-STM32L151C8T6芯片(四)串口接收唤醒机制、注意事项、C代码 目录 一、硬件设计 1、DC-...
  • 使用STM32L151C8T6,MDK基于库函数开发 功能:串口1、串口2、串口3、RTC时钟、待机模式低功耗进入和唤醒 串口分别用定时器实现每15ms确定一个数据包的接收时间。
  • 最近工作一直在做低功耗相关的产品,这次用到了STM32L151的STOP模式,RTC定时唤醒STOP模式需要注意以下几点内容: 1.RTC需要正确配置,启动外部低速32.768Khz(外挂晶振)用来启用定时,经过测试还是比较准确的,如果...
  • STM32待机模式和独立看门狗的协调 使用stm做低功耗项目,往往会在主要程序处使用独立看门狗防止程序跑飞。但是看门狗一旦被开启,就只有复位才能够将其关闭,这显然就和待机模式产生了冲突。 解决办法 1.主要程序...
  • STM32L151C8T6 全部端口悬空 电源电压 2.8V 供电 使用内部时钟64k //单片机 STM32L151C8T6 //keil4 //运行时的 电流是 140uA //stop模式的 电流是 20uA //编译不通过 查询 固件库 int main() { Delay_ms...
  • 超低功耗研发-STM32L151C8T6芯片(二)低功耗模式 超低功耗研发-STM32L151C8T6芯片(三)RTC自动唤醒机制 在前面的文章中,详细分析了STM32L151低功耗的各种概念和相关知识,在应用中,还有一种常见的需求,...
  • //系统复位 } /* standby mode 功耗最低 */ void EnterSTANDBYMode(void) { PWR->CR = PWR_CR_LPSDSR; PWR->CR |= PWR_CR_ULP; SET_BIT(PWR->CR, PWR_CR_CWUF); //清除Wake-up 标志 SET_BIT(PWR->CR, PWR_CR_CSBF);...
  • STM32L15低功耗程序

    2017-07-08 23:35:03
    STM32L151低功耗,待机模式进入低功耗,PC13WUAP2引脚唤醒
  • STM32L151C8T6 STM32低功耗开发板 含电路图 STM32L151c8T6的程序 HAL开发例程 等资料
  • 前言: ...STM32L151C8T6 功能特点: (1)Flash:64k (2)RAM:10k (3)EEPROM:4k (4)USART:3 (5)SPI:2。 了解一个CPU,时钟也是非常重要的,如下图所示:    从图中可知:共有5 ...
  • 默认情况下,系统复位后,控制器运行在RUN模式,在RUN模式下,CPU的时钟是由HCLK提供,如果CPU不需要一直保持运行 状态,是可以设置控制器为其他几种低功耗模式,比如,当控制器需要等待一个 外部中断事件时。...
  • 超低功耗产品必然涉及到“唤醒”机制,唤醒后执行 正常的功能代码,这个...自动唤醒CPU,所以RTC自动唤醒基本上就是 为超低功耗定制 的,用起来非常方便,先看下STM32L151的RTC系统时钟树:  上图中的WUTR就是wa...
  • 文中讲了stm32l151c8t6在stop模式下通过RTC定时器A定时唤醒的方法,以及RTC时钟的配置 和 alarmA的配置,可以通过固定的日历日期定时唤醒,比如每月的1号早上8点唤醒,也可以通过按周唤醒,比如每周一早上8点唤醒,...

空空如也

空空如也

1 2 3 4
收藏数 73
精华内容 29
关键字:

stm32l151低功耗