历史上的今天
今天是:2025年02月09日(星期日)
2021年02月09日 | STM32F4之GPIO的使用
2021-02-09 来源:eefocus
上次学STM32F103是在大二的暑假,学了一段时间之后也没有项目做,渐渐地就转向其他的方向,最近实习要用到STM32F407,就打算从头学,但是一些基础还在,并决定将学习的过程记录一下,以备使用。
一.STM32F407ZGT6的GPIO资源介绍
STM32F407ZGT6
- 一共有7组IO口
- 每组IO口有16个IO
- 一共16X7=112个IO
外加2个PH0和PH1
一共114个IO口
二.GPIO的相关寄存器
一组IO口相关的寄存器有10个,也就是说,10个寄存器控制一组IO口;
一个端口模式寄存器(GPIOx_MODER)
一个端口输出类型寄存器(GPIOx_OTYPER)
一个端口输出速度寄存器(GPIOx_OSPEEDR)
一个端口上拉下拉寄存器(GPIOx_PUPDR)
一个端口输入数据寄存器(GPIOx_IDR)
一个端口输出数据寄存器(GPIOx_ODR)
一个端口置位/复位寄存器(GPIOx_BSRR)
一个端口配置锁存寄存器(GPIOx_LCKR)
两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)
三.GPIO的配置流程
//声明一个GPIO结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
delay_init(84);
//使能GPIO所在的总线的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
//定义该结构体
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//使用的IO口 (总共有16个IO口)
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //设置IO的模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //100MHz
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
//初始化该结构体
GPIO_Init(GPIOF,&GPIO_InitStructure);
分析:
(1) GPIO的重要结构体,对其进行赋值
typedef struct
{
uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins.
This parameter can be a value of @ref GPIOOType_TypeDef */
GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins.
This parameter can be a value of @ref GPIOPuPd_TypeDef */
}GPIO_InitTypeDef;
( 1) GPIO_Mode_AIN 模拟输入
( 2) GPIO_Mode_IN_FLOATING 浮空输入
( 3) GPIO_Mode_IPD 下拉输入
( 4) GPIO_Mode_IPU 上拉输入
( 5) GPIO_Mode_Out_OD 开漏输出
( 6) GPIO_Mode_Out_PP 推挽输出
( 7) GPIO_Mode_AF_OD 复用开漏输出
( 8) GPIO_Mode_AF_PP 复用推挽输出
8种配置模式的使用场景
时钟使能的函数在stm32f4xx_rcc.h中,根据上图,外设在哪一条时钟总线上进行函数选择,所以GPIOF在AHB1总线上,此时选择的函数为:
RCC_AHB1PeriphClockCmd();
四.GPIO相关重要函数
重要函数:
1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
因此此时就可以用,以下函数进行点亮,熄灭LED了
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
具体代码如下:
int main(void)
{
//声明一个GPIO结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
delay_init(84);
//GPIO时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//PIN9 PIN10 分别连接LED0 LED1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //设置GPIO为输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //100MHz的时钟
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //Í推挽输出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);
while(1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);//同时点亮LED
delay_ms(1000);
GPIO_ResetBits(GPIOF,GPIO_Pin_9 |GPIO_Pin_10);//同时熄灭LED
delay_ms(1000);
}
}
史海拾趣
|
搞了一段时间ISE,几乎就要崩溃了 最近做个东西,要用到xilinx的ISe开发软件,找了很久,也下载了几个 但都是没法安装,把我搞惨了,哪位朋友能给我发一个不?版本不要太高, ise6.2等级别的,万分感谢了 我的邮箱是317930100@qq ...… 查看全部问答> |
|
LED是T型和N型半导体,三价有电洞,五价提供电子,两者结合中间有空乏区,能够产生能量,光就发出来。由于它是半导体,有能隙,随著参杂元素的不同而产生不同能隙,从氮化镓的3.4eV到磷化铟的1.35eV,波长亦随著改变,而产生出不同的颜色,从紫外光 ...… 查看全部问答> |
|
用51 + PDIUSBD12 ,实现和 PC通信,固件程序写好了,可是找不到PC winxp的驱动, 求菲利浦的 PDIUSBD12 的驱动,和使用方法。 如果谁知道哪里可以下载麻烦告知一下。也可发我邮箱 yuexianhanshu@yahoo.com.cn 谢了… 查看全部问答> |
|
wince5.0,已经把media player相关的组件都加入了,格式支持都加入了,基本上multimedia里面的都加上了。 启动后看到.mpg,.wmv的文件图标改了,.avi的图标没变。 打开.wmv,提示缺少一个解码器,然后只有声音没有图像。 .mpg的都不能打开。试过 ...… 查看全部问答> |
|
本人用了89C51写了一个时钟显示程序,硬件电路共有4个单独的数码管显示,P1.1G至P1.7接了数码管的A、B、C、D、E、F、G P2.3接了显示时的个位数码管DP脚,P2.7、P2.6、P2.5、P2.4分别接了时的十位数码管、时的个位数码管、分的十位数码管、 ...… 查看全部问答> |






