找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 842|回复: 4
打印 上一主题 下一主题
收起左侧

stm32f的单片机PA0_WARK口唤醒单片机后能否作为普通IO口?

[复制链接]
跳转到指定楼层
楼主
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)

图片.jpg

PA0唤醒后作普通IO口.7z

183.5 KB, 下载次数: 0

视频效果.rar

7.78 MB, 下载次数: 0

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2024-1-2 14:13 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:192020 发表于 2024-1-2 14:32 | 只看该作者
所以能不能作为普通IO用?感觉9.7uA待机电流挺大的
回复

使用道具 举报

地板
ID:301191 发表于 2024-1-5 13:04 | 只看该作者
顶一下
回复

使用道具 举报

5#
ID:236035 发表于 2024-1-8 08:42 | 只看该作者
已经是PA0了,肯定能作为IO口啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表