首页 > 其他分享 >STM32F407 GPIO

STM32F407 GPIO

时间:2024-08-07 19:52:47浏览次数:8  
标签:__ 输出 void GPIOC GPIO STM32F407 NOP

//单片机:
    是典型的嵌入式微控制器,英文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);
    }
}

标签:__,输出,void,GPIOC,GPIO,STM32F407,NOP
From: https://blog.csdn.net/txz2629310036/article/details/140965585

相关文章

  • 基于两颗CH582芯片实现GPIO模拟SPI全双工通讯__从机通过GPIO中断读写数据
    简介:此程序是根据标准SPI协议规范使用模式0编写的一份模拟SPI全双工数据收发例程,经过测试,一个字节收发时长可压缩至最低115us左右,约9091字节每秒=73Kbps的通讯速率,注释中尽可能解释了每一步的含义,后续有想法应该会对其进行优化。注:笔者开发经验较少,在编程上或许复杂了一些。......
  • STM32学习记录(二):GPIO
    何为高低电平?高电平电压(highlevelvoltage),输出的电压值相对较高低电平电压(lowlevelvoltage),输出的电压值相对较低高低电平的电压具体值是多少需要参考数据手册,举个例子,如下表所示,VDD的典型值是3.3V,根据数据手册可以知道低电平下GPIO输出的最大电压是0.4V;高电平下GPIO输......
  • [米联客-安路飞龙DR1-FPSOC] SDK入门篇连载-03 GPIO PS/PL实验
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 1概述本课对FPSoC芯片GPIO进......
  • STM32之GPIO(General Purpose Input/Output,通用型输入输出)
    文章目录前言一、GPIO简介二、GPIO结构2.1GPIO基本结构2.2GPIO位结构2.2.1输入部分2.2.1输出部分四、GPIO模式4.1浮空/上拉/下拉输入4.2模拟输入4.3开漏/推挽输出4.4复用开漏/推挽输出前言提示:本文主要用作在学习江协科大STM32入门教程后做的归纳总结笔......
  • 嵌入式Linux中的LED驱动控制(使用Pinctrl和GPIO子系统)
    在前面驱动LED的所有案例中,都是在驱动程序中去设置每个引脚的复用功能,这会导致所编写的驱动程序移植困难,可重用性差,缺乏对引脚的统一管理,容易出现引脚的重复定义等等弊病。为此,Linux内核引入了pinctrl子系统和GPIO子系统的概念。pinctrl子系统主要用于芯片引脚功能的管理,它基本上......
  • STM32学习三GPIO操作
    点灯:二极管利用的是两边的电压差点亮,如图外接有3.3v电压,所以只需要引脚给低电平即可驱动。当外接地时,需要芯片给出高电平驱动,在推挽输出的模式下输入输出都有很强的驱动能里。但一般都是led外接高电压,因为很多芯片都采用高电平弱驱动,低电平强驱动的规则。1.芯片数据手册......
  • 【STM32】GPIO口以及EXTI外部中断
    个人主页~有关结构体的知识在这~有关枚举的知识在这~GPIO口以及EXTI外部中断GPIO一、简介二、基本结构三、输入输出模式1、输入模式(1)上拉输入(2)下拉输入(3)浮空输入(4)模拟输入2、输出模式(1)推挽输出(2)开漏输出(3)复用推挽输出(4)复用开漏输出EXIT外部中断一、中断系统二、......
  • STM32—GPIO
    1.GPIO介绍GPIO可配置8种输入输出模式模式名称性质特征浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平下拉输入数字输入可读取引脚电平,内部链接下拉电阻,悬空时默认低电平模拟输入模拟输入GPIO无效,......
  • STM32F1基于HAL库的学习记录实用使用教程分享(二、GPIO_Input 按键)
    往期内容STM32F1基于HAL库的学习记录实用使用教程分享(一、GPIO_Output)文章目录往期内容前言一、GPIO_Input1.浮空输入(GPIO_Mode_IN_FLOATING)2.上拉输入(GPIO_Mode_IPU)3.下拉输入(GPIO_Mode_IPD)4.上拉和下拉的区分原因二、配置1.RCC2.SYS(1).Debug(2).SystemWa......
  • 0730_驱动1 gpio子系统
    一、介绍gpio子系统1.1基于gpio子系统框架1.2基于gpio子系统API接口#include<linux/of_gpio.h>intof_get_named_gpio(structdevice_node*np,constchar*propname,intindex)函数功能:获取gpio编号参数:np:节点结构体指针......