STM32单片机入门(从GPIO--串口通信)上
目录1.前言2.GPIO控制及应用2.1 GPIO控制器原理2.2 GPIO控制器HAL库接口2.3 应用LED按键调压信号发生器继电器控制3.STM32F407时钟控制器4.串口控制器及应用4.1 UART控制器4.2 UART控制器HAL库接口4.3 USB串口4.4 RS232串口通信4.5 PM2.5数据采集4.6 土壤温湿数据采集5.结语1.前言相信大家都对STM32单片机有了一定的耳闻我为大家介绍的是STM32F407IGH6的型号在这里就不和大家介绍开发环境的搭建可以看一下其他的UP主在这里也建议大家在学习STM32之前可以先学一下51单片机这样在学STM32时可能会简单一点然后大家要有一点模拟电路和数字电路的知识一点就行最基本的不需要掌握的特别好C语言。如果以上都有一定基础那么出发GO2.GPIO控制及应用2.1 GPIO控制器原理GPIOGeneral Purpose Input/Output通用输入输出是嵌入式系统和单片机中常见的数字接口允许通过编程控制引脚的电平状态高/低或读取外部信号。其核心特点是功能可配置既可作为输入如读取按键状态也可作为输出如驱动LED。STM32F407IGH6 GPIO控制器共有176个引脚其中GPIO引脚140共9组GPIOA--GPIOI然后GPIOA--GPIOH每组16个pin0--pin15GPIOI组12个pin0--pin11。GPIO控制器图GPIO的模式模式功能输出模式推挽输出开漏输出输入模式上拉输入下拉输入浮空输入模拟模式ADC与DAC复用模式USRTI2CSPI等GPIO输入模式输入模式用于读取外部信号的状态高电平或低电平常见于检测按键、传感器信号等场景。输入模式通常需要配置上拉/下拉电阻以避免悬空状态导致的信号不稳定。上拉模式GPIO默认电平为高外部信号拉低时读取为低电平。下拉模式GPIO默认电平为低外部信号拉高时读取为高电平。浮空模式高阻态无内部上下拉电阻依赖外部电路提供确定电平易受干扰。电压阈值高电平阈值通常为电源电压的70%左右如3.3V系统中约2.31V上触发。低电平阈值通常为电源电压的30%左右如3.3V系统中约0.99V下触发。注通过TTL施密特触发器滞回比较器将输入的信号变为方波信号。下面是原理图R1R2不明白的可以AI一下GPIO输出模式是微控制器与外部设备交互的基本接口之一。输出模式允许微控制器通过引脚向外部电路提供高电平或低电平信号驱动LED、继电器等设备。推挽输出Push-Pull推挽输出通过两个晶体管上拉和下拉实现能够主动输出高电平或低电平高电平上拉晶体管导通输出接近电源电压如3.3V或5V。低电平下拉晶体管导通输出接近地电平0V。特点驱动能力强高低电平切换速度快但无法直接与其他输出引脚并联。开漏输出Open-Drain开漏输出仅包含下拉晶体管高电平需依赖外部上拉电阻低电平下拉晶体管导通输出0V。高电平下拉晶体管关闭输出由外部上拉电阻拉至电源电压。特点支持“线与”逻辑多设备可共享同一总线但上升沿速度较慢。ODR与BSRR寄存器ODR寄存器ODROutput Data Register是STM32微控制器中GPIO模块的一个寄存器用于控制引脚的输出状态。写入ODR寄存器可以直接设置引脚的输出电平高或低。ODR是一个16位寄存器每位对应一个GPIO引脚。例如向ODR的某一位写入1对应引脚输出高电平写入0则输出低电平。ODR寄存器的特点包括直接控制输出电平适用于需要频繁切换输出的场景。支持原子操作避免竞态条件。读取ODR寄存器返回的是当前引脚的实际输出状态。BSRR寄存器BSRRBit Set/Reset Register是STM32中GPIO模块的另一个寄存器用于高效地设置或清除引脚的输出状态。BSRR是一个32位寄存器分为高16位和低16位低16位BS0-BS15写入1将对应引脚设置为高电平置位写入0无效果。高16位BR0-BR15写入1将对应引脚设置为低电平复位写入0无效果。BSRR寄存器的优势包括操作更高效无需先读取当前状态再修改避免“读-改-写”问题。支持原子操作适合多任务或中断环境。可以同时设置和清除多个引脚的状态或与操作。模拟模式GPIO模拟输入的原理相对简单IO引脚上的模拟电压在GPIO部分不做任何处理直接输入到芯片内部的ADC控制器部分进行采样处理。复用模式IO复用模式主要是为后续各种控制器驱动对应外设时提供的一个配置将IO引脚设置为复用模式后该管脚状态的控制不再由GPIO控制器控制其高低状态而是由对应的外设控制器进行状态控制。2.2 GPIO控制器HAL库接口一、GPIO控制器基址GPIOA组寄存器基址0x40020000GPIOB组寄存器基址0x40020400GPIOC组寄存器基址0x40020800GPIOD组寄存器基址0x40020C00GPIOE组寄存器基址0x40021000GPIOF组寄存器基址0x40021400GPIOG组寄存器基址0x40021800GPIOH组寄存器基址0x40021C00GPIOI组寄存器基址0x40022000二、寄存器映射GPIOx_MODERGPIO端口模式寄存器偏移0x00GPIOx_OTYPERGPIO端口输出类型寄存器偏移0x04GPIOx_OSPEEDERGPIO端口输出速度寄存器偏移0x08GPIOx_PUPDRGPIO端口上拉/下拉寄存器偏移0x0CGPIOx_IDRGPIO端口输入数据寄存器偏移0x10GPIOx_ODRGPIO端口输出数据寄存器偏移0x14GPIOx_BSRRGPIO端口置位/复位寄存器偏移0x18GPIOx_AFRLGPIO复用功能低位寄存器偏移0x20GPIOx_AFRHGPIO复用功能高位寄存器偏移0x24三、HAL库接口1. GPIO引脚初始化配置结构体GPIO_InitTypeDeftypedef struct {uint32_t Pin; // 要配置的GPIO引脚uint32_t Mode; // GPIO引脚的工作模式uint32_t Pull; // GPIO引脚是否使用上、下拉电阻uint32_t Speed; // GPIO引脚电平反转速度uint32_t Alternate; // GPIO引脚复用模式} GPIO_InitTypeDef;2. GPIO引脚状态typedef enum {GPIO_PIN_RESET 0, // 低电平状态GPIO_PIN_SET // 高电平状态} GPIO_PinState;GPIO引脚状态typedef enum {GPIO_PIN_RESET 0, /低电平状态 /GPIO_PIN_SET /高电平状态 /}GPIO_PinState;3. 核心函数①HAL_GPIO_Init函数函数功能初始化GPIO控制器函数原型void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数参数GPIOx是GPIO组控制器基址GPIO_Init是GPIO引脚模式配置函数返回值无②HAL_GPIO_ReadPin函数函数功能读取GPIO端口电平状态函数原型GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数参数GPIOx是GPIO组控制器基址GPIO_Pin是GPIO组内引脚函数返回值GPIO引脚状态③HAL_GPIO_WritePin函数函数功能设置GPIO端口电平状态函数原型void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)函数参数GPIOx是GPIO组控制器基址GPIO_Pin是GPIO组内引脚PinState是要设置的状态函数返回值无④HAL_GPIO_TogglePin函数函数功能反转GPIO端口电平状态函数原型void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数参数GPIOx是GPIO组控制器基址GPIO_Pin是GPIO组内引脚函数返回值无2.3 应用LED按键调压信号发生器继电器控制1.LED控制灌电流驱动STM32 最常用- 单片机引脚 → 低电平点亮- 引脚输出 0V → LED 亮- 引脚输出 3.3V → LED 灭创建LED控制项目1.打开IDE2.以次点file-New-STM32Project3.写单片机型号及点右箭头处-点next4.写项目名比如my_LED5.选引脚PF8或PF96.配置引脚GPIO MODEOutput Push Pull GPIO Pull-up/Pull-down:No Pull-up and No Pull-down7.生成CubeMX文件点上之后Ctrls8.写核心代码9.编译(成功)-run-Debug Configurations...10.生成调试文件11.OK啦2.按键开关按键开关是一种通过物理按压实现电路通断的电子元件。其内部通常包含金属弹片或导电橡胶按压时触点闭合导通电路松开后弹片复位断开电路。分为常开NO和常闭NC两种类型机械式按键寿命约数万至百万次。电容的作用物理消抖。1.配置引脚选引脚PF10/PF11【省略的步骤与上面一样】2.核心代码3.调压信号发生器SW-OD连接单片机的I/O口当I/O采用开漏输出时输出低电平时SW-OD的电压为0V当我们想控制I/O引脚输出高电平时I/O引脚的状态完全由外部电路决定这里也就是由电阻R110、R111与R112串联电路决定为SW-OD处的电压值。1.配置引脚选引脚2.核心代码补系统滴答定时器中断频率更改这里是my_gpiood补4.继电器该电路中采用的线圈为5V的继电器使用NPN三极管来控制继电器通断。Relay1接单片机的IO口当Relay1输出低电平时三极管截止继电器不会动作。当Relay1输出高电平时三极管导通继电器动作。1.配置引脚选引脚2.核心代码补系统滴答定时器中断频率更改结语欢迎大家点赞收藏加关注。