【百问网】物联网学习笔记3
硬件电路:
1.STM32F103C8T6一共有48个引脚(封装LQFP48)
2.按A、B、C分组,每组16个引脚,编号为0~15
STM32F103C8T6有2组GPIO,每组16个引脚,即32个GPIO引脚。
根据数据手册中列出的每个
I/O
端口的特定硬件特征,
GPIO
端口的每个位可以由软件分别配置成多种模式。
输出模式四种:推挽输出、开漏输出、复用推挽输出、复用开漏输出。
Push-Pull ,Open-Drain, Alternate Function Push-Pull/Open-Drain
前两种模式受GPIO寄存器控制,复用后受片上外设控制。
复用功能体现在选择器。
推挽输出:一个PMOS,一个NMOS,VDD=3.3V,VSS为地。
当输出控制为高电平时,PMOS导通、NMOS断开(看作不存在);当输出控制为低电平,NMOS导通,相当于IO引脚接到VSS。
效果:原本是输出控制接到IO输出高低电平,变成输出控制去控制VDD或VSS接到IO口,使输出电流增大,提高了输出引脚的驱动能力、电路的负载能力、开关的工作速度。
上拉输入默认输入高电平,下拉输入默认输入低电平。
从个人经验来看,大部分时候,输出就推挽输出,输入就上拉输入
或者设置为复用功能
GPIO接LED配置低速即可,如果复用为IIC、SPI等通信引脚使用中高速。
从引脚图看到PA1连接着LED,这关系到写驱动时的引脚宏定义。
点灯代码:
主函数:
//文件名称:main.c
#include "stm32f1xx_hal.h"
#include "stm32f1xx_clk.h"
#include "driver_led.h"
int main(void)
{
// 初始化HAL库函数必须要调用此函数
HAL_Init();
// 系统时钟即AHB/APB时钟配置
SystemClock_Config();
// 初始化LED
LedGpioInit();
// 循环闪烁
while(1)
{
BLED(ON);
HAL_Delay(1000);
BLED(OFF);
HAL_Delay(1000);
}
}
LED驱动:
//文件名称:driver_led.c
#include "driver_led.h"
/*
* 函数名:void LedGpioInit(void)
* 函数作用:初始化LED的引脚,配置为上拉推挽输出
*/
void LedGpioInit(void)
{
// 定义GPIO的结构体变量
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能LED的GPIO对应的时钟
B_LED_GPIO_CLK_EN();
GPIO_InitStruct.Pin = B_LED_GPIO_PIN; // 选择LED的引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置为推挽输出模式
GPIO_InitStruct.Pull = GPIO_PULLUP; // 默认上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 引脚输出速度设置为慢
// 初始化引脚配置
HAL_GPIO_Init(B_LED_GPIO_PORT, &GPIO_InitStruct);
// 默认LED灭:OFF-灭,ON-亮
BLED(OFF);
}
//文件名称:driver_led.h
#ifndef __DRIVER_LED_H
#define __DRIVER_LED_H
#include "stm32f1xx_hal.h"
// 引脚宏定义
#define B_LED_GPIO_PIN GPIO_PIN_1
#define B_LED_GPIO_PORT GPIOA
#define B_LED_GPIO_CLK_EN() __HAL_RCC_GPIOA_CLK_ENABLE()
// 函数宏定义
// LED亮灭函数宏定义
#define ON GPIO_PIN_RESET
#define OFF GPIO_PIN_SET
#define BLED(flag) HAL_GPIO_WritePin(B_LED_GPIO_PORT, B_LED_GPIO_PIN, flag)
/* 函数名:void LedGpioInit(void)
* 函数作用:初始化LED的引脚,配置为上拉推挽输出
*/
extern void LedGpioInit(void);
#endif