STM32待机模式Standby Mode与ADC DMA模式测试备忘

2019-08-15来源: eefocus关键字:STM32  待机模式  Standby  Mode  ADC  DMA模式

1)STM32运行十秒后自动进入待机,使用WakeUp引脚唤醒CPU后,重复以上动作。


int main(void)

{

time_cnt = 0;

    

    HAL_Init();

SystemClock_Config();

    

HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);

HAL_PWR_DisableWakeUpPin(PWR_CSR_EWUP); //禁止wakeup PA0引脚,可以用来做普通引脚功能

    

while (1)

{

HAL_Delay(1000);

        HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13); //运行时,闪LED

        time_cnt++;

        if(time_cnt >= 10) //10秒后,进入待机模式

        {

            time_cnt = 0;

            

//打开wakeup引脚,待机后来个上升沿就可以唤醒cpu了

            HAL_PWR_EnableWakeUpPin(PWR_CSR_EWUP);

//清除wakeup_flag,这里很重要,假如没有,就不能重复的让cpu唤醒再进入待机

//即HAL_PWR_EnterSTANDBYMode()将不起作用!!

            __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

//cpu进入待机模式,NREST Pin,IWDG,RTC alarm,WakeUp引脚上升沿,都可以唤醒cpu

            HAL_PWR_EnterSTANDBYMode();

        }

    }

}


其他都没什么,最重要的是注意要清一下唤醒标志位 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

因为cpu唤醒第一次后,会置位PWR_FLAG_WU和PWR_FLAG_SB,假如不清除,第二次待机就实现不了了。


2)打开ADC,使用扫描模式,分别采样Ch7和Ch8数据,存放于一个数组内





库函数用起来还是非常方便的


__IO uint16_t   adc_value[100];

 

//start adc

HAL_ADC_Start_DMA(&hadc, (uint32_t*)&adc_value[0], 100);

dma就会自动将adc的数据采样100个,放到adc_value 这个数组内,排放顺序当然是adc_value[0]放Ch7,adc_value[1]放Ch8,adc_value[2]放Ch7,adc_value[3]放Ch8。。。以此交错放置,采样完会产生中断。


void DMA1_Channel1_IRQHandler(void)

{

    /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */

    

    /* USER CODE END DMA1_Channel1_IRQn 0 */

    HAL_NVIC_ClearPendingIRQ(DMA1_Channel1_IRQn);

    

    HAL_DMA_IRQHandler(&hdma_adc);

    /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */

    

    /* USER CODE END DMA1_Channel1_IRQn 1 */

}

上面是Stm32Cube自动生成的代码,挺方便的,中断后会自动进入这个函数,这时只需要再自己写一个


void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

{

    //自定义功能

}

来替换掉系统的弱定义函数就可以了。

__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //系统给出的弱定义空函数

然后就可以关闭ADC

//shut down adc

HAL_ADC_Stop_DMA(&hadc);

到这里,ADC采样一百个点完成,都存放在adc_value[100]这个数组里了,简单吧。




完。


关键字:STM32  待机模式  Standby  Mode  ADC  DMA模式

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471205.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F429DISCO与STemWin开发备忘
下一篇:STM32F103做从机SPI通信SPI3中断异常

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32 USART1对PWM的影响,串口影响PWM

注意,USART1和TIM1是复用的,如果用TIM1产生PWM(PA9 / PA10),则USART1不应该用该管脚,可以用PB6/PB7。
发表于 2019-08-22

stm32103R8C6 捕捉2路pwm 串口打印捕捉数据

第一路使用定时器2的通道1,先捕捉一个上升沿,清楚所有数据开始捕捉下降沿,捕捉到下降沿后再捕捉一个上升沿。 第二路使用定时器4的通道4,使用其他通道的时候要注意,定时器的中断时CC4,设置上升沿和下降沿的时候也要改为通道4。//定时器2通道1输入捕获配置TIM_ICInitTypeDef TIM2_ICInitStructure;void TIM2_Cap_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
发表于 2019-08-22
stm32103R8C6 捕捉2路pwm 串口打印捕捉数据

STM32——使用PWM+DMA实现脉冲发送精确控制

之前用stm32写过脉冲发送的代码,用来控制步进电机,但是缺点明显,之前是用定时器中断做的,所以一但控制的电机多起来,MCU资源占用就很大,这在大多数情况下是不可接受的,更不用说多轴联动了。最近做的步进电机CAN总线控制系统,就想顺便重新写驱动。希望做到占用很少的MCU资源,实现脉冲发送的精确控制。既然是用来控制步进电机,那么脉冲的数量和频率一定要可控,要不然怎么实现电机的加减速曲线。于是就想到了DMA。DMA (直接存储器访问)DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料
发表于 2019-08-22
STM32——使用PWM+DMA实现脉冲发送精确控制

stm32入门——PWM输出控制直流电机变速

,ARR大于CCRx时输出为“有效”电平。注意,我这里用的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。以下面的代码来讲解TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz我们使用定时器1的通道1来输出一路PWM波,想详细了解定时器参数的设置的朋友可以参考(stm32入门——定时器中断),我这里简单介绍一下,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。void
发表于 2019-08-22
stm32入门——PWM输出控制直流电机变速

STM32学习笔记(PWM输出)

本人采用Cube 进行的STM32库函数编程,PWM波的输出配置以及代码如下所示:(经过实际实验证明非常好用)以下为定时器PWM输出函数,注意:使用时一定要把原来输出函数注释掉。注释代码如下:// sConfigOC.OCMode = TIM_OCMODE_PWM1;// sConfigOC.Pulse = 0;// sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;// sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;// if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC
发表于 2019-08-22

STM32死机 调试时进入HardFault_Handler定位错误的方法

STM32在运行不正常的时候我们一般会进行调试看看问题出在了哪里。但是当STM32卡死后进行调试的时候会发现进入到了一个HardFault_Handler函数里,这是一个硬件错误处理函数。通过它和MDK配合可以定位程序最后卡死的原因。STM32卡死的原因有以下几种:数组越界操作;内存溢出,访问越界;堆栈过小;中断处理错误;电压供电异常。现在实验一个堆栈过小的错误,让MDK来检测这个问题然后定位错误。这个程序基于UCOSII 系统 #define TFTLCD_STK_PRIO  8 //任务的优先级#define TFTLCD_STK_SIZE  2 //任务的堆栈大小OS_ST
发表于 2019-08-22
STM32死机 调试时进入HardFault_Handler定位错误的方法

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved