打印
[STM32F1]

STM32F103单片机之IO口操作

[复制链接]
350|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
过期的塔头|  楼主 | 2024-2-27 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在对GPIO端口操作时首先是编写一个初始化函数

void PC_13_Init(void)

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

void PC_13_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       
  GPIO_Init(GPIOC, &GPIO_InitStructure);  
        //GPIO_SetBits(GPIOC,GPIO_Pin_13);
       
}


使用特权

评论回复
沙发
过期的塔头|  楼主 | 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 */

使用特权

评论回复
5
过期的塔头|  楼主 | 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

使用特权

评论回复
6
过期的塔头|  楼主 | 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引脚直接赋值的函数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

908

帖子

0

粉丝