stm32---GPIO输出和输入

Sep 21 2100 C语言

新建STM32工程的架构:

我们主要是为了看一下STM32配置的那些文件有啥作用:

stm32f10x.h和core_cm3这些文件就是外设和内核外设的寄存器描述,在keil可以看到,都是寄存器和寄存器名字,还有地址信息等,如果直接调用这些寄存器来使用stm32,那就是寄存器的开发方式,很麻烦。


所以就提供了库函数文件,在keil中可以看到,这每个外设都提供了一大堆函数,这些函数封装了寄存器的操作,给我们提供更加人性化的函数调用方式。

这个conf的文件就是用来配置头文件的包含关系的,在keil中可以看到conf文件include了所有的库函数头文件,

同时我们在stm32f10x.h的最后又包含了conf,


所以在使用这些库函数时,我们只需要包含stm32f10x.h这一个头文件,就相当于包含了所有的库函数头文件,这样我们就可以任意地调用库函数了。

记得包含下面这个宏定义:

GPIO的结构:

推挽输出模式​​
在推挽输出下,P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出接到VDD输出高电平,反之同理。这种模式下高电平均有较强的驱动能力,所以又称强推输出模式。

​​开漏输出模式​​
在开漏输出模式下,P-MOS无效,数据寄存器为1时,下管断开,输出断开,高阻模式。

8种GPIO模式:

我们可以在手册上看到相关的GPIO配置时钟等信息:

不同情况下GPIO的配置可能不一样,我们可以看手册中的内容自行选择

在rcc.h的文件可以配置时钟那些,主要有三条函数:

主要的函数:

1
2
3
4
5
6
7
void GPIO_DeInit(GPIO_TypeDef* GPIOx);   ​被指定的GPIO外设会被复位​
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); ​​用结构体参数来初始化GPIO口​​(⭐重要函数)
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); ​把结构体变量赋一个默认值​
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); ​读取输入状态​​、读取指定引脚的输入电平(1位)
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); ​读取输入状态​​、读取整个端口的输入数据(16位)
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);​读取输出状态​​、读取指定引脚的输出锁存值(1位)
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);​读取输出状态​​、读取整个端口的输出锁存值(16位)

LED.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stm32f10x.h"                  // Device header

void LED_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}

void LED_ON(void){
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
}


void LED_OFF(void){
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
}