天天看點

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]這個數組裡了,簡單吧。

完。

繼續閱讀