打印
[应用相关]

STM32 GPIO

[复制链接]
515|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-7-20 17:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
GPIO
























面包板两端横向是相通的,内部是纵向相通

LED闪烁
main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        //第一步:使用RCC开启GPIO时钟
       
        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);
        //第二步:使用GPIO_Init()初始化GPIO
       
        //GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灯亮
        //GPIO_SetBits(GPIOA,GPIO_Pin_0);//灯灭
        //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//灯亮
        //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//灯灭
        //第三步:使用输出或者输入的函数控制GPIO口
        while(1)
        {
                GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                Delay_ms(100);
                GPIO_SetBits(GPIOA,GPIO_Pin_0);
                Delay_ms(100);
               
                GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
                Delay_ms(500);
                GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
                Delay_ms(500);
               
                GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
                Delay_ms(500);
                GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
                Delay_ms(500);
        }
}


LED流水灯
main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        //第一步:使用RCC开启GPIO时钟
       
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//初始化所有端口
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //第二步:使用GPIO_Init()初始化GPIO
       
        //GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灯亮
        //GPIO_SetBits(GPIOA,GPIO_Pin_0);//灯灭
        //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//灯亮
        //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//灯灭
        //第三步:使用输出或者输入的函数控制GPIO口
        while(1)
        {
//                GPIO_Write(GPIOA,~0x0001);
//                Delay_ms(500);
//                GPIO_Write(GPIOA,~0x0002);
//                Delay_ms(500);
//                GPIO_Write(GPIOA,~0x0004);
//                Delay_ms(500);
//                GPIO_Write(GPIOA,~0x0008);
//                Delay_ms(500);
//                GPIO_Write(GPIOA,~0x0010);
//                Delay_ms(500);
//                GPIO_Write(GPIOA,~0x0020);
//                Delay_ms(500);
//                GPIO_Write(GPIOA,~0x0040);
//                Delay_ms(500);
//                GPIO_Write(GPIOA,~0x0080);
//                Delay_ms(500);
               
                unsigned char i ;
               
                for( i = 0 ; i < 8 ;i++)
                {
                        GPIO_Write(GPIOA,~(0x0001 << i));
                        Delay_ms(500);
                }
        }
       
}


蜂鸣器

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        //第一步:使用RCC开启GPIO时钟
       
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//初始化12端口
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        //第二步:使用GPIO_Init()初始化GPIO
       
        //GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灯亮
        //GPIO_SetBits(GPIOA,GPIO_Pin_0);//灯灭
        //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//灯亮
        //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//灯灭
        //第三步:使用输出或者输入的函数控制GPIO口
        while(1)
        {
                GPIO_ResetBits(GPIOB,GPIO_Pin_12);
                Delay_ms(100);
                GPIO_SetBits(GPIOB,GPIO_Pin_12);
                Delay_ms(100);
                GPIO_ResetBits(GPIOB,GPIO_Pin_12);
                Delay_ms(100);
                GPIO_SetBits(GPIOB,GPIO_Pin_12);
                Delay_ms(700);
        }
       
}


















按键控制LED
key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

/**
  * @brief  初始化位于PB1以及PB11按键
  * @param  无
  * @retval 无
  */
void Key_Init(void)//配置按键
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
       
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//需要读取按键,设置上拉输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度,输入不影响
        GPIO_Init(GPIOB,&GPIO_InitStructure);       
}

/**
  * @brief  获取所按下的键值
  * @param  无
  * @retval KeyNum 按下的键值
  */
uint8_t Key_GetNum(void)
{
        uint8_t KeyNum = 0;
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
        {
                Delay_ms(20);
                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
                //此时处于一直按下的状态
                Delay_ms(20);
                KeyNum = 1;
        }
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
        {
                Delay_ms(20);
                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
                //此时处于一直按下的状态
                Delay_ms(20);
                KeyNum = 2;
        }
        return KeyNum;
}

LED.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  打开GPIO时钟,并进行初始化
  * @param  无
  * @retval 无
  */
void LED_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        //第一步:使用RCC开启GPIO时钟
       
        GPIO_InitTypeDef  GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //第二步:使用GPIO_Init()初始化GPIO
       
//        GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
}

/**
  * @brief  将位于PA1端口电平置零
  * @param  无
  * @retval 无
  */
void LED1_On(void)
{
        GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}

/**
  * @brief  将位于PA1端口电平置一
  * @param  无
  * @retval 无
  */
void LED1_Off(void)
{
        GPIO_SetBits(GPIOA,GPIO_Pin_1);
}

/**
  * @brief  查看PA1端口电平并将其翻转
  * @param  无
  * @retval 无
  */
void LED1_Turn(void)
{
        if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0)//查看当前端口输出
        {
                GPIO_SetBits(GPIOA,GPIO_Pin_1);//将其置一
        }
        else
        {
                GPIO_ResetBits(GPIOA,GPIO_Pin_1);//将其置零
        }
}

/**
  * @brief  将位于PA2端口电平置零
  * @param  无
  * @retval 无
  */
void LED2_On(void)
{
        GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}

/**
  * @brief  将位于PA1端口电平置一
  * @param  无
  * @retval 无
  */
void LED2_Off(void)
{
        GPIO_SetBits(GPIOA,GPIO_Pin_2);
}

/**
  * @brief  查看PA2端口电平并将其翻转
  * @param  无
  * @retval 无
  */
void LED2_Turn(void)
{
        if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0)//查看当前端口输出
        {
                GPIO_SetBits(GPIOA,GPIO_Pin_2);//将其置一
        }
        else
        {
                GPIO_ResetBits(GPIOA,GPIO_Pin_2);//将其置零
        }
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main(void)
{
        LED_Init();
        Key_Init();
       
        while(1)
        {
                KeyNum = Key_GetNum();//获取键值
                if(KeyNum == 1)//如果键1按下,则翻转LED1电平
                {
                        LED1_Turn();
                }
                if(KeyNum == 2)//如果键2按下,则翻转LED1电平
                {
                        LED2_Turn();
                }
               
        }
       
}


光敏传感器控制蜂鸣器
LightSensor.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  初始化端口在PB^13光敏传感器
  * @param  无
  * @retval 无
  */
void LightSensor_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        //第一步:使用RCC开启GPIO时钟
       
        GPIO_InitTypeDef  GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        //第二步:使用GPIO_Init()初始化GPIO
}

/**
  * @brief  获得当前光敏传感器输入电平
  * @param  无
  * @retval 返回周围光线情况
  */
uint8_t LightSensor_Get(void)
{
       
        return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
        //周围暗的时候输入1;亮的时候输入0
        //周围暗的时候输出0;亮的时候输出1
}

Buzzer.c

#include "stm32f10x.h"                  // Device header

/**
  * @brief  打开GPIO时钟,并进行初始化
  * @param  无
  * @retval 无
  */
void Buzzer_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        //第一步:使用RCC开启GPIO时钟
       
        GPIO_InitTypeDef  GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        //第二步:使用GPIO_Init()初始化GPIO
       
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
}

/**
  * @brief  将位于PB12端口电平置零
  * @param  无
  * @retval 无
  */
void Buzzer_On(void)
{
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}

/**
  * @brief  将位于PB12端口电平置一
  * @param  无
  * @retval 无
  */
void Buzzer_Off(void)
{
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
}

/**
  * @brief  查看PB12端口电平并将其翻转
  * @param  无
  * @retval 无
  */
void Buzzer_Turn(void)
{
        if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12) == 0)//查看当前端口输出
        {
                GPIO_SetBits(GPIOB,GPIO_Pin_12);//将其置一
        }
        else
        {
                GPIO_ResetBits(GPIOB,GPIO_Pin_12);//将其置零
        }
}


main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"

int main(void)
{
        Buzzer_Init();
        LightSensor_Init();
       
        while(1)
        {
                if(LightSensor_Get() == 1)//比较暗的时候
                {
                        Buzzer_On();
                }
                else{
                        Buzzer_Off();
                }
        }
       
}


————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_45981247/article/details/135852319

使用特权

评论回复
沙发
kzlzqi| | 2024-7-29 15:27 | 只看该作者
延时模块
Delay模块用于实现简单的延时功能。

Delay.h

c

#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"

void Delay_ms(uint16_t ms);

#endif


使用特权

评论回复
板凳
kzlzqi| | 2024-7-29 15:27 | 只看该作者
Delay.c

c

#include "Delay.h"

void Delay_ms(uint16_t ms)
{
    uint32_t i;
    for(i = 0; i < ms * 8000; i++)
    {
        __NOP();  // 空操作,耗时
    }
}


使用特权

评论回复
地板
范德萨发额| | 2024-7-29 15:42 | 只看该作者
LED 控制模块
LED模块用于控制两个LED的开关和翻转。

LED.h

c

#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

void LED_Init(void);
void LED1_On(void);
void LED1_Off(void);
void LED1_Turn(void);
void LED2_On(void);
void LED2_Off(void);
void LED2_Turn(void);

#endif


使用特权

评论回复
5
申小林一号| | 2024-7-29 22:38 | 只看该作者
感谢分享

使用特权

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

本版积分规则

1948

主题

15675

帖子

12

粉丝