按钮实验
思路:使用推挽模式,对输入寄存器GPIO PA1存入01值(通过史密斯将高低电平转化为01)
如果读取GOIO引脚PA1的数值为0(按钮按下,电路接地,输出0,反之输出1)
Stm32读取到PA1的数值后,对PA0输出高低电平,使对应PMOS/nMOS管导通,从而达到按下按钮灯亮,松开灯灭效果
代码以及注释:
#include "stm32f10x.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟
GPIO_InitTypeDef GPIO_Initstruct = {0};//结构体定义
GPIO_Initstruct.GPIO_Pin = GPIO_Pin_0;//选择PA0引脚
GPIO_Initstruct.GPIO_Mode = GPIO_Mode_Out_PP;//输出推挽模式
GPIO_Initstruct.GPIO_Speed = GPIO_Speed_2MHz;//输出速率2MHZ
GPIO_Init(GPIOA,&GPIO_Initstruct);//初始化PA0
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//向PA0输入高电平,pmos管导通,灯亮
GPIO_Initstruct.GPIO_Pin = GPIO_Pin_1;//选择PA1引脚
GPIO_Initstruct.GPIO_Mode = GPIO_Mode_IPU;//选择输入上拉模式
GPIO_Init(GPIOA,&GPIO_Initstruct);//初始化PA1
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == Bit_RESET)//如果读取GOIO引脚PA1的数值为0(按钮按下,电路接地,输出0)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//对PA0输出一个高电平,是Pmos推挽电路导通,灯亮
}
else
{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//否则对PA0输出一个低电平,是Pmos推挽电路接地,灯灭
}
}
}
中间遇到问题:
1.灯无法正常亮,使用万用表切到蜂鸣挡位,查看电路均导通,硬件问题排查后,查看代码问题,
原因为使能时钟函数用错,红色函数处前期编写错误,使用RCC_APB1,导致时钟没有开启,后续对GPIO的操作都无效