[STM32F1] STM32F103单片机之IO口操作

[复制链接]
1195|5
 楼主| 过期的塔头 发表于 2024-2-27 15:38 | 显示全部楼层 |阅读模式
在对GPIO端口操作时首先是编写一个初始化函数

void PC_13_Init(void)

这是STM32F103C8T6的PC13引脚的初始化函数

  1. void PC_13_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  5.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  6.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  7.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  8.        
  9.   GPIO_Init(GPIOC, &GPIO_InitStructure);  
  10.         //GPIO_SetBits(GPIOC,GPIO_Pin_13);
  11.        
  12. }


 楼主| 过期的塔头 发表于 2024-2-27 15:39 | 显示全部楼层
下面开始详细解释这个函数

首先是结构体的定义,这个结构体就在标准库里面。


        GPIO_InitTypeDef GPIO_InitStructure;

typedef struct
{
  uint16_t GPIO_Pin;
  GPIOSpeed_TypeDef GPIO_Speed;
  GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;

 楼主| 过期的塔头 发表于 2024-2-27 15:39 | 显示全部楼层
下面就是GPIO时钟的使能。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
 楼主| 过期的塔头 发表于 2024-2-27 15:39 | 显示全部楼层
再就是对GPIO结构体的配置,包括引脚号、引脚的模式、以及速率;

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /* Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /* Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /* Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /* Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /* Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /* Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /* Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /* Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /* Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /* Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /* Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /* Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /* Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /* Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /* Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /* Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /* All pins selected */
 楼主| 过期的塔头 发表于 2024-2-27 15:39 | 显示全部楼层
  GPIO_Mode_AIN = 0x0,             // 模拟输入
  GPIO_Mode_IN_FLOATING = 0x04,                 // 浮空输入
  GPIO_Mode_IPD = 0x28,                                                 // 下拉输入
  GPIO_Mode_IPU = 0x48,                                                 // 上拉输入
  GPIO_Mode_Out_OD = 0x14,                                 // 开漏输出
  GPIO_Mode_Out_PP = 0x10,                                 // 推免输出
  GPIO_Mode_AF_OD = 0x1C,                                         // 复用开漏输出
  GPIO_Mode_AF_PP = 0x18                                         // 复用推免输出

  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz,
  GPIO_Speed_50MHz

 楼主| 过期的塔头 发表于 2024-2-27 15:40 | 显示全部楼层
通过上述的引脚GPIO初始化函数就可以知道GPIO怎么进行初始化,这样就可以将引脚运用起来,将引脚设置为不同的模式就实现不同的功能,下面讲解几个GPIO操作的函数。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

这两个在GPIO输出模式下GPIO口输出是高电平还是低电平的函数。

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这个是在GPIO为输入模式下GPIO读取引脚的电平函数。

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
这个是将GPIOA-E的0-15引脚直接赋值的函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

999

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部