STM32F407 GPIO

//单片机:
    是典型的嵌入式微控制器,英文MCU;是一种集成电路芯片,采用超大规模集成电路技术把FPU,RAM,ROM,I/O口中断系统,定时器计数器等功能集成到一块硅片上,构成的小而完善的计算机系统。

//中央处理器(FPU)(168MHz)

//随机存储器(RAM)

//只读存储器(ROM)

//定时器:
    重要    DAC:数模转换器
    //基本定时器:
        ①起到计数、延时功能;②作为DAC外部触发
    //通用定时器
        ①完美继承基本定时器的所有功能;
        ②输出比较功能:输出一段有规律的波形(PWM波):控制LED亮度、控制电机转速、舵机转向等
        ③输入捕获功能:当检测到外界边沿变化,接收外界过来的波形:红外编码、超声波测距、获取按键时长等等
    //高级定时器:
        ①完美继承基本定时器和通用定时器的所有功能;
        ②增加了死区和刹车 ---  针对电机驱动
    //系统滴答定时器
        用来计数、延时;其实可以利用系统滴答提供时基(实时操作系统)
    //看门狗:
        检测程序是否正常运行,如程序异常则产生复位
        如果程序运行正常的话,在规定时间内进行喂狗,则单片机不会产生复位
    //RTC:
        实时时钟  ---  日历、闹钟
    //ADC:
        模数转换器

//单片机最小系统
    //电源电路:
        3.3V
    //振荡电路:
        外接晶振:    外部高速晶振:   8Mhz     12Mhz      25Mhz    外部低速晶振:      32.768Khz
        内部RC震荡电路:    单片机内部震荡源    缺点:RC震荡源偏频很大      频率:40Khz左右       实测:30Khz -  60Khz     看门狗(不需要那么准确)
    //复位电路:
        复位方式有:    硬件复位、软件复位、上电复位、看门狗复位

//如何获取单片机的详细信息:
    官网下载数据手册
    
    
//假如配置了开漏输出,但现在往输出数据寄存器里面写了一个1,接下来会发生什么?
    不会输出任何数据,配置为开漏输出,只能输出0(低电平),不能输出1(高电平)。
    如配置开漏输出,输出寄存器写1,则导致p-mos完全关闭,令输出功能完全关闭。
//配置输出模式之后,输入功能能不能正常工作?
    能,输入缓冲器被打开(施密特触发器开启),输入功能正常使用
//配置输入模式之后,输出功能能不能正常工作?
    不能,输出缓冲器被关闭,输出功能关闭


    
//流水灯:
#include "led.h"

/*
函数功能:LED灯IO初始化G
返回值:void
形参:void
函数说明:
LED1   ----   PC4   ----  通用推挽输出
LED2   ----   PC5   ----  通用推挽输出
LED3   ----   PC6   ----  通用推挽输出
LED4   ----   PC7   ----  通用推挽输出
*/

void Led_Init(void)
{
    //打开GPIOC的时钟
    RCC->AHB1ENR |= 1 << 2;
    //配置IO模式--通用推挽输出
    GPIOC->MODER &= ~(3 << 8); //清零
    GPIOC->MODER |= 1 << 8; //PC4配置为通用输出
    
    GPIOC->MODER &= ~(3 << 10);//5引脚清零
    GPIOC->MODER |= 1 << 10;//PC5配置为通用型输出
    
    GPIOC->MODER &= ~(3 << 12);//6引脚清零
    GPIOC->MODER |= 1 << 12;//配置PC6为通用型输出
    
    GPIOC->MODER &= ~(3 << 14);//7引脚清零
    GPIOC->MODER |= 1 << 14;

    
    //配置IO输出类型--推挽
    GPIOC->OTYPER &= ~(1 << 4);//4
    
    GPIOC->OTYPER &= ~(1 << 5);//5
    
    GPIOC->OTYPER &= ~(1 << 6);//6
    
    GPIOC->OTYPER &= ~(1 << 7);//7
    
    //配置IO速度
    GPIOC->OSPEEDR |= 2 << 8;//4
    
    GPIOC->OSPEEDR |= 2 << 10;//5
    
    GPIOC->OSPEEDR |= 2 << 12;//6
    
    GPIOC->OSPEEDR |= 2 << 14;//7
    
    
    //配置上下拉
    GPIOC->PUPDR &= ~(3 << 8);//4
    
    GPIOC->PUPDR &= ~(3 << 10);//5
    
    GPIOA->PUPDR &= ~(3 << 12);//6
    
    GPIOC->PUPDR &= ~(3 << 14);//7
    
    
    //配置LED默认电平为熄灭
    GPIOC->ODR |= 1 << 4; //4
    
    GPIOC->ODR |= 1 << 5;//5
    
    GPIOC->ODR |= 1 << 6;//6
    
    GPIOC->ODR |= 1 << 7;//7
}

/*
函数名称:流水灯
返回值:void
形参:
u8 flag   控制流水灯方向   DOWN--0   UP--1
u16 nms   控制流水灯速度   50--1000ms
函数功能:创造流水灯,并改变方向和速度
*/

void Water_Light(u8 flag,u16 nms)
{
    static u8 cnt = 0;
    cnt++;
    delay_ms(nms);    //速度
    
    if(flag == DOWN)        //方向向下
    {
        switch(cnt)
        {
            case 1:LED1_ON;break;
            case 2:LED2_ON;break;
            case 3:LED3_ON;break;
            case 4:LED4_ON;break;
            case 5:LED_OFF;break;
        }
    }
    else    //方向向下
    {
        switch(cnt)
        {
            case 1:LED4_ON;break;
            case 2:LED3_ON;break;
            case 3:LED2_ON;break;
            case 4:LED1_ON;break;
            case 5:LED_OFF;break;
        }
    }
        
    cnt %= 5;
}

//延时:
#include "delay.h"
/*

*/
void delay_us(u32 nus)
{
    while(nus--)
    {
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        
    }

}

void delay_ms(u32 nms)
{
    while(nms--)
    {
        delay_us(1000);
    }
    
    
    
}

//蜂鸣器:
#include "buzzer.h"

/*
返回值:void
形参:void
函数名:Buzzer_Init
函数功能:蜂鸣器管脚初始化
函数说明:
Buzzer----PE0-----通用推挽输出
*/

void Buzzer_Init(void)
{
    //打开时钟
    RCC->AHB1ENR |= 1 << 4;
    
    //初始化PE0
    GPIOE->MODER &= ~(3 << 0);
    GPIOE->MODER |= 1 << 0;
    
    GPIOE->OTYPER &= ~(1 << 0);
    
    GPIOE->OSPEEDR |= 2 << 0;
    
    GPIOE->PUPDR &= ~(3 << 0);
    
    //默认电平
    GPIOE->ODR &= ~(1 << 0);
}

//开机提醒
void Star_Buzzer(void)
{
    Buzzer_On;
    delay_ms(50);
    Buzzer_Off;
}

//GPIO定义:
    通用性输入输出接口;
    GPIO是单片机与外界进行信息交换的唯一窗口;
//stm32的GPIO口的数量:
    数据手册的第二大点;
//GPIO的命名方式:
    端口号 + 管脚号
//GPIO口的八大模式:
    输入:
    上拉输入     数字量        带有上拉功能         弱上拉        IO默认电平为高电平      
    下拉输入     数字量        带有下拉功能         弱下拉        IO默认电平为低电平
    浮空输入     数字量        不带有上下拉功能      如果没有特殊需求,IO输入一般配置为浮空
    模拟输入     模拟量        接收模拟量,需要借助ADC转换
    输出:
    通用推挽输出;通用开漏输出;复用推挽输出;复用开漏输出
    通用:作为普通IO口,实现普通IO输出的功能
    复用:复用输出一般与片上外设有关,如片上外设需要与外界进行信息交换,则对应IO需要配置为复用模式
    推挽:IO口既可以输出0(低电平),也可以输出1(高电平)
    开漏:IO口只能输出0(低电平),不能输出1(高电平)
//GPIO寄存器的操作方法:
    GPIO端口号->寄存器名
//GPIO相关寄存器:
    GPIO端口模式寄存器(MODER)
    GPIO端口输出类型寄存器(OTYPER)
    GPIO端口输出速度寄存器(OSPEEDR)
    GPIO端口上拉/下拉寄存器(PUPDR)
    GPIO端口输入数据寄存器(IDR)
    GPIO端口输出数据寄存器(ODR)


#define KEY1 (GPIOA->IDR & 1 << 0)
#define KEY2 (GPIOE->IDR & 1 << 2)
#define KEY3 (GPIOE->IDR & 1 << 3)
#define KEY4 (GPIOE->IDR & 1 << 4)
//按键扫描:
/*
    函数功能:扫描并返回按下的键值:
    返回值:u8
    形参:void
    函数说明:
    KEY1--------------------key1按下
    !KEY2-------------------key2按下
    !KEY3-------------------key3按下
    !KEY4-------------------key4按下
*/
u8 key_scan(void)
{
    static u8 flag = 0;
    
    if(KEY1 || !KEY2 || !KEY3 || !KEY4 && !flag)   //按下按键的过程,条件符合代表键位被按下
    {
        delay_ms(50);
        flag = 1;
        if(KEY)
        {
            return 1;
        }
        else if(!KEY2)
        {
            return 2;
        }
        else if(!KEY3)
        {
            return 3;
        }
        else if(!KEY4)
        {
            return 4;
        }
    }
    else if(!KEY1 && KEY2 && KEY3 && KEY4 && flag)  //松开按键的过程,符合条件代表键位松开
    {
        flag = 0;
        delay_ms(50);
    }
}

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]和\[2\]提供了关于STM32F407GPIO配置的代码示例。在这些示例中,使用了GPIO_InitTypeDef结构体来定义GPIO的配置参数,然后通过调用相应的函数来进行GPIO的初始化和设置。在引用\[1\]中,使用了GPIOB的Pin_10引脚作为输出模式,并设置了推挽输出和下拉。而在引用\[2\]中,使用了GPIOF的Pin_9引脚作为输出模式,并设置了推挽输出和上拉。这些代码示例展示了如何使用STM32F407GPIO模块进行配置和控制。 引用\[3\]提供了关于输入模式的配置示例。在这个示例中,使用了GPIOE的Pin_9引脚作为输入模式,并设置了上拉。这个示例还提到了外接了一个NPN型的限位开关,用来获取开关状态。 综上所述,STM32F407GPIO模块可以通过配置相应的参数来实现不同的输入和输出功能。可以根据需要选择不同的引脚和模式进行配置,并通过相应的函数进行控制。 #### 引用[.reference_title] - *1* *3* [STM32F407入门学习(1)---GPIO配置](https://blog.csdn.net/shadowfiend10086/article/details/53229724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32F407GPIO设置流程、和相关寄存器的理解及总结](https://blog.csdn.net/weixin_47937575/article/details/123620052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值