对于入门单片机而言,点亮第一个led灯是必然的。控制多个IO口高低电平变化,实现流水灯,或者用pwm控制灯亮的大小也叫呼吸灯。
这里我总结GPIO的各种模式和单片机各种片上资源外设使用时需要配置的GPIO
GPIO的结构决定了GPIO可以被配置成以下模式(基于f1系列的):
typedef enum
{
GPIO_Mode_AIN = 0x0, // 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, // 浮空输入
GPIO_Mode_IPD = 0x28, // 下拉输入
GPIO_Mode_IPU = 0x48, // 上拉输入
GPIO_Mode_Out_OD = 0x14, // 开漏输出
GPIO_Mode_Out_PP = 0x10, // 推挽输出
GPIO_Mode_AF_OD = 0x1C, // 复用开漏输出
GPIO_Mode_AF_PP = 0x18 // 复用推挽输出
} GPIOMode_TypeDef;
下面这个和l298n的工作原理相似,都是控制mos管来输出高低电平(控制电机正反转)
这两个mos管(假设上管Q1是P-Mos,下管Q2是N-Mos)就相当于两个开关,可以控制器里的数据寄存器写0,1操作控制他们导通关闭。
下面介绍我用的各种器件所需要配置的GPIO,在stm32Cubemax能快速配置好
pwm 输出,蓝牙等串口通信,编码器配置用 复用推挽输出 AF_PP
软件I²C通信相关的用 开漏输出 Out_OD(如oled,光照传感器bh1750,软件读取mpu6050)
而硬件I²C读取mpu6050用的是复用开漏输出AF_OD
外部中断EXTI像激光计数,红外传感,是上拉输入GPIO_Mode_IPU
AD模数转化等用的是GPIO_Mode_AIN模拟输入
l298n的IN1,IN2、数码管max7219(spi通信,5个引脚VCC,GND,DIO,CS,CLK,后面三个接单片机引脚),温湿度传感器DHT11的data接口,点亮小灯等用的普通输出GPIO_Mode_Out_PP
编码器测速AB相 上拉下拉浮空都可以,上拉下拉如何选择,就看接到这个引脚的外部模块输出的默认电平,如果是高电平,则上拉输入,默认输入高电平(用的较多),反之。
用这段代码改变编码器计数的方向
//定时器编码器接口配置 //通道不反相
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Falling);