|
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);//清除函数
}
}
|
|