STM32F1的IO口控制

STM32F1 的 IO口控制

一、准备
  1. 之前在学习 51 单片机的时候,可以直接使用 IO 口引脚而不必进行初始化,但是 STM32 在使用 IO 口的时候需要进行初始化操作,初始化包括端口号、输入还是输出模式、输出模式下的输出速率是多少;
  2. 将 IO 口进行初始化之后才可以使用对应的 IO 引脚,可设置为高电平状态或低电平状态;
  3. 对引脚的高低电平设置或者读取引脚的高低电平都可以通过调用固件库函数来实现。
二、步骤

(一)IO 口输出控制(以点亮 LED 灯为例)

  1. 需求说明:

    LED 接在 STMF103C8T6 单片机的 PB0 引脚,引脚输出高电平时点亮,输出低电平时熄灭,原理图如下:

  1. 业务逻辑分析:

    • 单片机引脚(PB0)输出状态下才能驱动 LED 点亮或者熄灭
    • 首先进行 LED 所在端口的初始化
      • 打开 GPIOB 高速外设时钟端口(APB2)
      • 设置输出端口号
      • 输出模式设置为推挽输出
      • 设置 IO 端口输出速度为 50MHz
      • 将上诉结构体设置写进 GPIO 初始化函数中
    • 在 while 循环中将端口置 1 则点亮 LED,清 0 则熄灭 LED
  2. 代码如下:

    void LED_Init(void){ // LED 灯的初始化
    	GPIO_InitTypeDef  GPIO_InitStructure; 	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    	GPIO_Init(GPIOB, &GPIO_InitStructure);		
    }
    
    int mian(void){
        RCC_Configuration(); 
    	LED_Init();
        while(1){
            GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); // LED 接高电平
        }
    }
    

(二)IO 口输入控制(以读取按键状态为例)

  1. 需求说明:

    KEY1 接在 STMF103C8T6 单片机的 PA0 引脚,按键按下时引脚为低电平,按键未按下时引脚为高电平

  2. 业务逻辑分析:

    • 首先进行 KEY 所在端口的初始化
      • 打开 GPIOB 高速外设时钟端口(APB2)
      • 设置输入端口号
      • 输入模式设置为上拉输入
      • 不需要设置 IO 端口输出速度
      • 将上诉结构体设置写进 GPIO 初始化函数中
    • 在 while 循环中读取按键端口引脚电平变化,对按键进行消抖
  3. 代码:

    void KEY_Init(void){ // 按键初始化函数
    	GPIO_InitTypeDef  GPIO_InitStructure; 	
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);       
        GPIO_InitStructure.GPIO_Pin = KEY1 | KEY2;                    
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       
    //  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    	GPIO_Init(KEYPORT,&GPIO_InitStructure);			
    }
    
    int mian(void){
        RCC_Configuration(); 
    	LED_Init();
        while(1){
            if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ 
        		delay_ms(20); //延时去抖动
        		if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //读取按键接口电平
            		while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按键松开 
            		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); 
        		}
    		}
        }
    }
    

(二)IO 口输入控制(以读取按键状态为例)

三、注意事项
  1. 对 IO 端口进行初始化时,初始化的端口和要使用的端口应该保持一致

  2. 当 IO 端口设置为输入状态时,读取 IO 口的电平状态应该使用类似于 GPIO_ReadInputDataBit 的函数;

    当 IO 端口设置为输出状态时,读取 IO 口的电平状态应该使用类似于 GPIO_ReadOutputDataBit 的函数;

    两者使用的库函数不同,应该注意区分。

愿余生,不负岁月,不负自己。
可以点个赞哦
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值