STM32对GPIO进行基础输出操作:点亮LED灯并闪烁,跑马流水灯(标准库GPIO输出模式)

这篇具有很好参考价值的文章主要介绍了STM32对GPIO进行基础输出操作:点亮LED灯并闪烁,跑马流水灯(标准库GPIO输出模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32GPIO输出流程:

操作STM32的GPIO需要三个步骤
第一步:RCC开启时钟
第二步:使用GPIO_Init函数初始化GPIO
第三步:使用输出或输入的函数控制GPIO口

1、RCC最常用的函数:

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

这三个函数分别是使能或失能AHB、APB1、APB2外设时钟控制。

2、GPIO库函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

GPIO复位函数

DeInit复位指定的GPIO外设
AFIODeInit函数,可以复位AFIO外设
GPIO_Init函数是通过结构体参数初始化GPIO口(最常用)
GPIO_StructureInit可以把结构体变量赋默认值

GPIO读函数

uint8_t GPIO_ReadInputDataBit
uint16_t GPIO_ReadInputData
uint8_t GPIO_ReadOutputDataBit
uint16_t GPIO_ReadOutputData

GPIO写函数

void GPIO_SetBits
void GPIO_ResetBits
void GPIO_WriteBit
void GPIO_Write

GPIO八种工作模式

代码后面有注释,可以看后面的定义

typedef enum
{ GPIO_Mode_AIN = 0x0,            //模拟输入(Analog IN)
  GPIO_Mode_IN_FLOATING = 0x04,   //浮空输入(In Floating)
  GPIO_Mode_IPD = 0x28,           //下拉输入(In Pull Down)
  GPIO_Mode_IPU = 0x48,           //上拉输入(In Pull Up)
  GPIO_Mode_Out_OD = 0x14,        //开漏输出(Out Open Drain)
  GPIO_Mode_Out_PP = 0x10,        //推挽输出(Out Push Pull)
  GPIO_Mode_AF_OD = 0x1C,         //复用开漏(Atl Open Drain)
  GPIO_Mode_AF_PP = 0x18          //复用推挽(Atl Push Pull)
}GPIOMode_TypeDef;

开始编程

将小灯正极连接到PA0引脚,串联一个10k或可调电阻,负极接到GND上。(采用高电平驱动模式),可采用面包板接线。

添加两个Delay库函数

Delay.h

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

Delay.c

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

 源代码:

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

int main() {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef GPIO_InitTStrusture;//如果不支持函数中间定义变量就需要把这一行写到函数内部最前面
    GPIO_InitTStrusture.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_InitTStrusture.GPIO_Pin = GPIO_Pin_0;// 0引脚//时钟设置也可以按位或
    GPIO_InitTStrusture.GPIO_Speed = GPIO_Speed_50MHz;//输出频率 
    GPIO_Init(GPIOA,&GPIO_InitTStrusture);
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);//ResetBits函数实现默认低电平
    GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//WriteBit函数实现默认低电平
    while(1) {
        GPIO_ResetBits(GPIOA, GPIO_Pin_0);
        Delay_ms(500);
        GPIO_SetBits(GPIOA, GPIO_Pin_0);
        Delay_ms(500);
        GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);//使用BitAction强制类型转换为Bit_RESET
        Delay_ms(500);
        GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
        Delay_ms(500);
    }
}

流水灯

初始化多个GPIO引脚

流水灯在GPIO初始化与上面同理,需要修改这一行部分代码

GPIO_InitTStrusture.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;

这样就可以把0、1、2三个GPIO引脚初始化

也可以采用这个代码直接将全部的GPIO端口初始化:

GPIO_InitTStrusture.GPIO_Pin = GPIO_Pin_All;

为什么这样可以呢?如下图所示

因为每个GPIO_Pin_的值代表了一个16进制数,如果将这个16进制数换为2进制的话对应的:

GPIO_Pin_0为0000 0000 0000 0001

GPIO_Pin_1为0000 0000 0000 0010

GPIO_Pin_1为0000 0000 0000 0100

...           ...        ...        ...        ...        ...

每个端口对应一个位,选取一些进行按位或的操作后,对应位置都为1。这样就同时选择了多个端口。

除了GPIO,时钟控制和GPIO_SetBits函数内部的参数也可以。

STM32对GPIO进行基础输出操作:点亮LED灯并闪烁,跑马流水灯(标准库GPIO输出模式),STM32基础,stm32,嵌入式硬件,单片机

 使用GPIO_Write函数

GPIO_Write(GPIOA,0x0001);//0000 0000 0000 0001

第二个参数对应16个GPIO口,某一位为1对应就是这个端口为高电平。这个代码就表示第一位为高电平,其余为低电平,也就是PA0为高电平,其余为低电平。因此我们可以写出流水灯的代码如下。文章来源地址https://www.toymoban.com/news/detail-778568.html

流水灯源代码:

#include "stm32f10x.h"                  // Device header
#include "DELAY.h"
int main() {
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitTStrusture;//如果不支持函数中间定义变量就需要把这一行写到函数内部最前面
	GPIO_InitTStrusture.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitTStrusture.GPIO_Pin = GPIO_Pin_All;// 0引脚//时钟设置也可以按位或
	GPIO_InitTStrusture.GPIO_Speed = GPIO_Speed_50MHz;//输出频率 
	GPIO_Init(GPIOA,&GPIO_InitTStrusture);
    while(1) {
        //GPIO_Write(GPIOA,0x0001);
		//使用GPIO_Write函数同时控制多个GPIO,第二个参数直接写到GPIO的ODR寄存器里//16进制数每一位
        对应一个GPIO端口,PA0-PA15。
		//若是低电平点亮,可以在前面加上~进行按位取反。例:~0x0001;
		GPIO_Write(GPIOA,0x0001);//0000 0000 0000 0001
		Delay_ms(500);
		GPIO_Write(GPIOA,0x0002);//0000 0000 0000 0010
		Delay_ms(500);
		GPIO_Write(GPIOA,0x0004);//0000 0000 0000 0100
		Delay_ms(500);

	}
	
}

到了这里,关于STM32对GPIO进行基础输出操作:点亮LED灯并闪烁,跑马流水灯(标准库GPIO输出模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED

    今日继续学习使用  STM32 F103C8T6开发板 点亮一个LED灯,文章提供源码,测试工程,实验效果图,希望我的归纳总结会对大家有帮助~ 目录 GPIO的认识与分类 : 引脚安排整理: 定时器的引脚例举: 串口的引脚例举:  CAN串口通信: SPI通信: IIC通信:  其余引脚: 烧录引脚:

    2024年02月11日
    浏览(34)
  • GPIO(STM32)点亮LED灯、按键KEY

    GPIO(general porpose intputoutput):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。 在STM32F4xx芯片上的GPIO口被分成各个组,一共有7组IO口,以A、B、C、D、E、F、G等命名(不同

    2024年04月14日
    浏览(27)
  • STM32--GPIO点亮LED灯(手把手,超详细)

    写在前面: 在前面的学习中,我们学习了 STM32的编译环境(MDK)、时钟树以及GPIO的8种工作模式 ;这节我们学习正式入门STM32--- 点亮第一个LED灯 ;即利用GPIO进行电灯,尽管是一个十分简单的实现,但是其步骤也是一个完整的STM32项目,可以说是“麻雀虽小,五脏俱全”;因

    2024年02月03日
    浏览(39)
  • 【ARM裸机编程 | 海思SS528】- 操作 GPIO 寄存器输出低电平点亮 LED 灯

    这篇文章主要介绍在 海思SS528 开发板,去操作某个 GPIO 寄存器输出高、低电平,来熄灭或点亮 LED 灯。 首先,了解一下 ARM裸机编程 ,也就是在一块没有移植操作系统的ARM开发板去编程,相当于把它当成单片机去使用,很多与硬件相关的操作都需要直接读写该硬件的寄存器。

    2024年02月10日
    浏览(30)
  • STM32F103ZET6 GPIO工作模式介绍+使用寄存器点亮第一个LED灯

    目录  GPIO的工作模式介绍 1.输入模式(模拟、上拉、下拉、浮空) 2.输出模式(推挽/开漏) 3.复用功能(推挽/开漏) 4.模拟输入输出(上下拉无影响) 如何使用寄存器点亮第一个LED灯         在输入模式时,施密特触发器打开,输出被禁止。可通过输入数据寄存器 GPIOx_

    2024年02月06日
    浏览(40)
  • 3、stm32:GPIO输出——LED闪烁、LED流水灯、蜂鸣器

    目录 一、GPIO简介 二、GPIO基本结构 三、GPIO模式 四、GPIO常用寄存器 (1)端口配置低高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E) (2)端口输入数据寄存器(GPIOx_IDR)(x=A…E) (3)端口输出数据寄存器(GPIOx_ODR)(x=A…E) (4)端口位设置/清除寄存器(GPIOx_BERR)(x=A…E) (5)端口位清除寄存器(GP

    2024年02月09日
    浏览(34)
  • STM32 HAL库 通用定时器介绍及相关应用例程 定时器中断 输出PWM (点亮LED呼吸灯、输出PWM、输入捕获) CubeMX

    (部分图引自于ATK) 前情提要(基本定时器) 点此进入 通用定时器类别 通用定时器和基本定时器相比大致的工作方式是相似的,不过通用定时器比基本定时器多了一些很好用的功能,比如: 外部输入捕获 输出比较 输出PWM 时钟源 CubeMX为我们提供了配置时钟的非常方便的工

    2024年04月15日
    浏览(69)
  • 江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)

            使用USART串口通信,通过上位机串口助手发送符串给STM32执行LED灯点亮熄灭操作的流程。         基本的配置如下所示,GPIO口配置的为PA9推挽输出,用于LED灯的操作。其余注意USART_ITConfig和USART_Cmd开启USART接收中断和使能USART运行。         接下来要进行发送字

    2024年03月21日
    浏览(42)
  • 【STM32零基础入门教程03】GPIO输入输出之GPIO框图分析

             本章节主要讲解点亮LED的基本原理,以及GPIO框图的讲解。         首先我们查看原理图,观察电路图中LED的连接情况,如下图可以看出我们的板子中LED一端通过限流电阻连接的PB0另一端连接的是高电平VCC,那么我们将PB0位置接地是不是灯就亮了,那我们就想

    2024年02月14日
    浏览(30)
  • STM32F103C8T6基础开发教程(HAL库)—点亮第一颗LED灯

    STM32F103C8T6基础开发教程(HAL库)—开发环境配置 STM32F103C8T6基础开发教程(HAL库)—Keil添加注释的快捷键 STM32F103C8T6基础开发教程(HAL库)—点亮第一颗LED灯 STM32F103C8T6基础开发教程(HAL库)—LED灯交替闪烁 STM32F103C8T6基础开发教程(HAL库)—LED灯呼吸闪烁 STM32F103C8T6基础开发

    2024年01月18日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包