STM32入门之输入输出端口(I/O)操作。众所周知,IO端口操作是单片机的学习基础,如同学习51单片机一般,我们大部分人都是从“点亮一盏灯”开始了解和学习STM32的,本文重点介绍IO端口的配置,以及教你如何点亮一盏灯~ 7 [' m; P7 W1 o% x0 t 一、GPIO工作模式: 1.输入配置:浮空(直接输入),上拉,下拉,模拟(AD) 1)首先,对 I/O 端口进行编程作为输入时,根据图一判断: : [! A( N( o6 M/ F+ q8 o! l ● 输出缓冲器被关闭 ● 施密特触发器输入被打开 ● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻 ● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样 ● 对输入数据寄存器的读访问可获取 I/O 状态 ! g7 ?, `+ W$ s' ^0 r, Y1 v2.输出:开漏输出,开漏复用输出,推挽式输出,推挽式复用输出 推挽输出:可输出强高低电平,接数字器件 开漏输出:可输出强低电平,高电平需要外部上拉;适合电流型驱动 4种最大输出速度:2M 25M 50M 100M 5V容忍:“FT”(允许输入5V) ! L6 x. ^: c5 F 1)对 I/O 端口进行编程作为输出时,根据图二判断: ● 输出缓冲器被打开: — 开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端口保持高组态 (Hi-Z)(P-MOS 始终不激活)。 — 推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活 P-MOS。 ● 施密特触发器输入被打开 ● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻 ● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样 ● 对输入数据寄存器的读访问可获取 I/O 状态 ● 对输出数据寄存器的读访问可获取最后的写入值 另外,复用功能和模拟功能在stm32开发过程中也是经常需要用到的,这里另作简要介绍: / r; R( r# O* b" p& F# k9 v 对 I/O 端口进行编程作为复用功能时: ● 可将输出缓冲器配置为开漏或推挽 ● 输出缓冲器由来自外设的信号驱动(发送器使能和数据) ● 施密特触发器输入被打开 ● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻 ● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样 ● 对输入数据寄存器的读访问可获取 I/O 状态 对 I/O 端口进行编程作为模拟配置时: ● 输出缓冲器被禁止。 ● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。 ● 弱上拉和下拉电阻被关闭。 ● 对输入数据寄存器的读访问值为“0” 二、相关寄存器 . Y' P6 S, H% x7 K 每组GPIO端口(16个)包括10个寄存器: 1)端口模式寄存器:GPIO_MODER 2)输出类型寄存器:GPIO_OTYPER 3)输出速度寄存器:GPIO_OSPEEDR 4)上拉下拉寄存器:GPIO_PUPDR 5)输入数据寄存器:GPIOx_IDR 6)输出数据寄存器:GPIOx_ODR 7)端口置位复位寄存器:GPIO_BSRR 8)端口配置锁存寄存器:GPIOx_LOCKR 9)10)复位功能寄存器: GPIOx_AFRL&GPIOx_AFRH) 前四个:32位配置寄存器 5,6个:32位数据寄存器 若配置一个IO需要2个位,则32位寄存器刚好一组16个IO口 若配置一个IO需要1个位,则32位寄存器的高16位保留 BSRR寄存器,高16位BSRRH配置复位状态(为1时复位);BSRRL配置置位 三、GPIO重要函数 7 T$ z0 T& V0 M9 | 初始化:void GPIO_Int (GPIO_TypeDef*GPIOx,GPIO_IntTypeDef*GPIO_InitStruct) 初始化一个或一组IO的工作模式,输出类型,速度及上下拉(及4个配置寄存器) 读取输入电平:unit8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,unit16_GPIO_Pin); unit16_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx); 实际操作GPIOx_IDE寄存器 例:unit8_t GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5); unit8_t GPIO_ReadInputDataBit(GPIOA); 读取输出电平:unit8_t GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,unit16_GPIO_Pin); unit16_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx); 实际操作GPIOx_ODE寄存器 例:unit8_tGPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5); unit16_t GPIO_ReadOutputDataBit(GPIOB); 设置输出电平:voidGPIO_SetBits(GPIO_TypeDef*GPIOx,unit16_t GPIO_Pin); 操作BSRRL寄存器,设置某个IO输出为1 voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,unit16_t GPIO_Pin) 操作BSRRH寄存器,设置某个IO输出为0 voidGPIO_WriteBits(GPIO_TypeDef*GPIOx,unit16_t GPIO_Pin,BitAction BitVal) voidGPIO_SetBits(GPIO_TypeDef*GPIOx,unit16_t PortVal) 此两个函数不常用,也是设置IO输出电平 外设(包括GPIO)在使用前需要使能对应的时钟 四、GPIO初始化例子 7 K. ?' R6 Y% Y# ~5 s- [ j0 }1 a' d GPIO_Init函数初始化例子: GPIO_InitTypeDef GPIO_InitStrure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin10 GPIO_InitStructure.GPIO_MODE=GPIO_Mode_OUT;普通输出 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;上拉 GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化GPIOF9,10 ; t/ h- |/ {8 O 五、跑马灯设计 0 j+ Q% z) `( f1 S/ I 跑马灯实验步骤: 1)使能时钟RCC_AHB1PeriphClockCmd() 2)初始化IO端口模式,调用函数GPIO_Init(); 3)操作IO口,输出高低电平:GPIO_Set();和GPIO_Reset(): # r- @2 t5 [5 \- X( U注意:assert_param();参数有效性判断,可以点开查看函数有效性设置 By the way: 1.每次工程可在模板下建立,选择需要的头文件和函数即可; 2.需先建立HEARDER文件夹,把自己的.C和.H文件建立并放入,规范工程格式; 3.选择函数,右键选择“GO todefinetiong of 查看变量函数定义的使用方法。 $ S9 |4 [; k7 O8 Z5 } |