一.电路分析
1.LED电路
(1)低电平驱动电路:PA0低电平驱动
电路图中的电阻R1作用:a.防止LED因为电流过大而烧毁;b.调节LED灯亮度
(2)高电平驱动电路:PA0高电平驱动
注:因为高电平弱驱动,低电平强驱动的规则。在很多单片机接法中大多采用第一种方法
2.蜂鸣器电路
对于功率略大的蜂鸣器,直接连接IO口会导致STM32负担过重
(1)PNP三极管驱动
基极连通PA0,低电平导通
(2)NPN三极管驱动
基极连通PA0,高电平导通
二.代码讲解
1.点亮LED
流程:
a.使用RCC开始GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
b.使用GPIO_Init函数初始化GPIO
从stm32的头文件Gpio.c中可以找到关于GPIO_Init的定义,如下:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
所以我们现在需要继续定义GPIO_InitStructure。而GPIO_InitStructure这部分还需要继续定义三个子函数,
分别为GPIO_Mode;GPIO_Pin;GPIO_Speed.
(1)GPIO_Mode
现在要寻找合适的GPIO_Mode,先右键跳转至GPIO_Mode的定义处,发现注释中“can be a value of GPIOMode_TypeDef”写道需要继续寻找对应的GPIOMode_TypeDef
所以cltr+F呼唤寻找GPIOMode_TypeDef,点击Find Next
即可找到GPIOMode_TypeDef的所有情况
所以有GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
(2)GPIO_Pin
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
(3)GPIO_Speed.
c.使用输出或者输入的函数控制GPIO口
GPIO_ResetBits(GPIOA, GPIO_Pin_0):低电平点亮LED
GPIO_SetBits(GPIOA, GPIO_Pin_0):高电平点亮LED
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET):写入高/低电平点亮LED
2.LED流水灯
/*主循环,循环体内的代码会一直循环执行*/
while (1)
{
/*使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯*/
GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010,PA1引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000,PA5引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000,PA6引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000,PA7引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
}
3.蜂鸣器
VCC接正极,GND接负极,I/O口接入stm32上通过程序设置好的GPIO口
在电路图中,此处的三极管为PNP型。PNP三极管的基极为低电平时三极管导通