天天看点

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数据,存放于一个数组内

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

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

__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)<span style="white-space:pre">	</span>//系统给出的弱定义空函数
           

然后就可以关闭ADC

//shut down adc
HAL_ADC_Stop_DMA(&hadc);
           

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

完。

继续阅读