protues仿真STM32时,配置管脚为上拉输入时,检测不准确

一.问题描述

用Protues画仿真图如下,主要完成功能当开关闭合时,灯亮;开关断开时灯灭。

程序流程,配置A0\2\4管脚为输出管脚。配置B0管脚为输入管脚,依据图,为上拉输入模式。

设想的执行流程--仿真运行时:当手动开关闭合,检测到B0管脚为0,让A0\2\4管脚输出高电平,灯亮;当手动开关断开,B0管脚悬空,由于输入上拉模式,检测到B0管脚为1,让A0\2\4管脚输出低电平,灯灭;

在keil里主程序代码如下:

#include "stm32f10x.h"

int main()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能A组管脚对应时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能B组管脚对应时钟

//初始化A组;

GPIO_InitTypeDef zhangsan;//GPIO_InitStructure;

zhangsan.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4;//初始化赋值使用0\2\4管脚

zhangsan.GPIO_Speed=GPIO_Speed_50MHz;//管脚速率

zhangsan.GPIO_Mode=GPIO_Mode_Out_PP;//配置管脚为推挽输出

GPIO_Init(GPIOA,&zhangsan);//执行初始化函数,初始化A0、a2管脚

//初始化B组;

zhangsan.GPIO_Pin=GPIO_Pin_0;//初始化赋值使用0管脚

zhangsan.GPIO_Mode=GPIO_Mode_IPU;//配置管脚为上拉输入模式

GPIO_Init(GPIOB,&zhangsan);//执行初始化函数,初始化A0、a2管脚

//判断B0管脚输入的高低电平,如果B0是1(高电平),LED灭------A0\2\4输出低电平;如果B0是0(低电平),LED亮------A0\2\4输出高电平

int B0zhi=0;

while(1)

{

B0zhi=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

if(B0zhi==0)//如果B0管脚输入的低电平,A0\2\4输出高电平-LED亮

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4);//GPIO_Write(GPIOA,0x0015);//管脚A0、2、4输出高电平,其他管脚输出低电平

else//否则,A0\2\4输出低电平-LED灭 GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4);//GPIO_Write(GPIOA,0x0000);//管脚A组输出低电平

}

}

将代码编译载入到仿真图后,运行的效果,当开关闭合时,led亮,当开关断开时,led亮。没有达到预期效果。

二.问题分析

怀疑是Protues软件对于stm32的电源配置没到位。当设置为上拉输入时,内部的VDD电源没有起到该有的作用。

所有很多开发,建议使用真实的硬件板子完成。

三.解决方法

1.代码不变的情况下,增加部分电路如下

2.配置B0管脚为浮空输入模式

用Protues画仿真图如下,

在keil里主程序主函数代码如下:(相对于原代码,只是修改了zhangsan.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置管脚为浮空输入模式)

#include "stm32f10x.h"

int main()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能A组管脚对应时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能B组管脚对应时钟

//初始化A组;

GPIO_InitTypeDef zhangsan;//GPIO_InitStructure;

zhangsan.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4;//初始化赋值使用0\2\4管脚

zhangsan.GPIO_Speed=GPIO_Speed_50MHz;//管脚速率

zhangsan.GPIO_Mode=GPIO_Mode_Out_PP;//配置管脚为推挽输出

GPIO_Init(GPIOA,&zhangsan);//执行初始化函数,初始化A0、a2管脚

//初始化B组;

zhangsan.GPIO_Pin=GPIO_Pin_0;//初始化赋值使用0管脚

zhangsan.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置管脚为浮空输入模式

GPIO_Init(GPIOB,&zhangsan);//执行初始化函数,初始化A0、a2管脚

//判断B0管脚输入的高低电平,如果B0是1(高电平),LED灭------A0\2\4输出低电平;如果B0是0(低电平),LED亮------A0\2\4输出高电平

int B0zhi=0;

while(1)

{

B0zhi=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

if(B0zhi==0)//如果B0管脚输入的低电平,A0\2\4输出高电平-LED亮

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4);//GPIO_Write(GPIOA,0x0015);//管脚A0、2、4输出高电平,其他管脚输出低电平

else//否则,A0\2\4输出低电平-LED灭

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4);//GPIO_Write(GPIOA,0x0000);//管脚A组输出低电平

}

}

3.配置B0管脚为输入下拉模式

用Protues画仿真图如下,

在keil里主程序主函数代码如下:

int main()

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能A组管脚对应时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能B组管脚对应时钟

//初始化A组;

GPIO_InitTypeDef zhangsan;//GPIO_InitStructure;

zhangsan.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4;//初始化赋值使用0\2\4管脚

zhangsan.GPIO_Speed=GPIO_Speed_50MHz;//管脚速率

zhangsan.GPIO_Mode=GPIO_Mode_Out_PP;//配置管脚为推挽输出

GPIO_Init(GPIOA,&zhangsan);//执行初始化函数,初始化A0、a2管脚

//初始化B组;

zhangsan.GPIO_Pin=GPIO_Pin_0;//初始化赋值使用0管脚

zhangsan.GPIO_Mode=GPIO_Mode_IPD;//配置管脚为上拉输入模式

GPIO_Init(GPIOB,&zhangsan);//执行初始化函数,初始化A0、a2管脚

//判断B0管脚输入的高低电平,如果B0是1(高电平),LED灭------A0\2\4输出低电平;如果B0是0(低电平),LED亮------A0\2\4输出高电平

int B0zhi=0;

while(1)

{

B0zhi=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

if(B0zhi==1)//如果B0管脚输入的低电平,A0\2\4输出高电平-LED亮

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4);//GPIO_Write(GPIOA,0x0015);//管脚A0、2、4输出高电平,其他管脚输出低电平

else//否则,A0\2\4输出低电平-LED灭

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_4);//GPIO_Write(GPIOA,0x0000);//管脚A组输出低电平

}

}

相关推荐
GilgameshJSS20 分钟前
STM32H743-ARM例程3-SYSTICK定时闪烁LED
arm开发·stm32·单片机·嵌入式硬件·学习
云山工作室1 小时前
基于单片机的按摩椅系统的设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
聆思科技AI芯片1 小时前
【AI入门课程】2、AI 的载体 —— 智能硬件
人工智能·单片机·智能硬件
文火冰糖的硅基工坊2 小时前
[硬件电路-324]:芯片根据功能、信号类型、应用场景、制造工艺、集成度及设计理念等多个维度进行分类
单片机·嵌入式硬件·系统架构·信号处理
尤老师FPGA3 小时前
LVDS系列30:Xilinx 7系 ADC LVDS接口参考设计(一)
单片机·嵌入式硬件·fpga开发
一枝小雨3 小时前
FreeRTOS内存分配与STM32内存布局详解
stm32·单片机·嵌入式·freertos·嵌入式系统·cortex-m3/m4
Geehy极海半导体4 小时前
极海APM32F035无电解电容变频控制参考方案,助力智能家电实现低成本、高能效驱动
单片机·嵌入式硬件·电机控制
the sun344 小时前
模电基础:基本放大电路及其优化
单片机·嵌入式硬件·模电
充哥单片机设计4 小时前
【STM32项目开源】基于STM32的智慧农业大棚系统
stm32·单片机·嵌入式硬件
路弥行至4 小时前
C语言入门教程 | 第一讲:C语言零基础入门教程:第一个程序到变量运算详解
c语言·开发语言·经验分享·笔记·单片机·其他·课程设计