|
stm32f的單片機PA0_WARK口喚醒單片機后能否作為普通IO口?這個問題,因為實際中應用,困擾我3天,我差一點就要放棄了,后來野火哥,提醒了一下我,原子程序誤導人,我服了。
功能說明:正常時,我們進入待機模式,全部停止工作了,電流只有2.2UA,實測有10UA,然后用PA0喚醒后,我要將這個IO口作為普通GPIO,就是這個IO在待機要能有喚醒功能,喚醒后,就要變成普通作輸入的IO口。非常奇怪的是,待機正常,也能喚醒,喚醒后,就是作不了普通IO,它上面電平一直為0,非常奇怪。整整搞了3天,都要瘋掉了。因為初學,所以踩坑是必然,只是太久了一點。這程序問題點,最大的是不能在線仿真,因為我們待機后,進入硬件仿真它會自動退出,所以非常麻煩,只能通過看代碼調試,具體代碼如下,過程中解釋得非常清楚了。希望能幫到大家,做產品還是要深入,只是看視頻學不到東西。視頻中就是實驗效果。
單片機源程序如下:
#include "stm32f10x.h"// Device header
#include "Delay.h"
#include "LED.h"
#include "OLED.h"
#include "Timer.h"
#include "sys.h"
uint16_t Num,dii;
int main(void)
{
/*退出待機流程:1、先在主程序前面就要使能RCC_APB1Periph_PWR時鐘,很重要這一點2、按下PA0鍵復位 3、將此PA0腳設置為普通IO,即失能它的喚醒功能 3、初始化普通IO口 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//先使能這個時鐘,一定要在開機時你不能???
PWR_WakeUpPinCmd (DISABLE);//失能喚醒功能,變為普通IO
LED_Init();//初始化普通IO
Key_Init();
OLED_Init();
Timer_Init();
OLED_ShowString(1, 1, "Num:");
while (1)
{
OLED_ShowNum(1, 5, Num, 5);//在1行 5位置顯示Num值 顯示5位數
OLED_ShowNum(2, 5, TIM_GetCounter(TIM2), 5);//顯示檢測定時器 它計數值
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)//將PA0當作普通IO口,判斷它電平是否為高?
{
if(Num<4)
{
LED1_Turn();
Delay_ms(500);
if(Num>=4)
{
Num=0;
/*待機流程:1、先將IO口失能,并將所有IO失能,降低功耗 2、將此PA0腳設置為喚醒功能 3、清除標置位 4、進入待機*/
RCC_APB2PeriphResetCmd(0X01FC,DISABLE); //失能所有IO口,降低功耗
PWR_WakeUpPinCmd(ENABLE); //使能喚醒管腳功能
PWR_ClearFlag (PWR_FLAG_WU);//清除標志位
PWR_EnterSTANDBYMode();//進入待命(STANDBY)模式
/*退出待機流程:1、先在主程序前面就要使能RCC_APB1Periph_PWR時鐘,很重要這一點2、按下PA0鍵復位 3、將此PA0腳設置為普通IO,即失能它的喚醒功能 3、初始化普通IO口 */
}
}
}
}
}
/****************定時器中斷服務子函數***************/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
dii++;
if(dii>=1)
{
dii=0;
Num++;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除函數
}
}
|
-
圖片.jpg
(308.82 KB, 下載次數: 73)
下載附件
2023-12-30 17:28 上傳
-
-
PA0喚醒后作普通IO口.7z
2023-12-30 18:43 上傳
點擊文件名下載附件
183.5 KB, 下載次數: 0
-
-
視頻效果.rar
2023-12-30 17:28 上傳
點擊文件名下載附件
7.78 MB, 下載次數: 0
|