第四讲—讲解GPIO_Write函数以及相关例程

本文介绍了STM32中用于批量操作GPIO端口的GPIO_Write函数,通过实例展示了如何使用该函数配置GPIOA的16个端口,实现LED流水灯效果。首先开启GPIO时钟并初始化所有端口为推挽输出,然后在循环中通过按位取反和GPIO_Write函数交替点亮LED,配合延迟函数实现流水灯的动态效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

之前讲解了初学GPIO的几个函数,下面介绍又一个函数,此函数对所有端口进行操作

GPIO_Write函数,与上一篇里边讲解的其他函数相比,最大的特点是它可以对多个端口进行赋值操作。

先看函数定义:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  
  GPIOx->ODR = PortVal;
}

第一个参数与之前一样,因为是对多个端口操作,我们以GPIOA的所有端口为例,第一个参数还是GPIOA,重点看第二个参数,看参数定义:

  * @param  PortVal: specifies the value to be written to the port output data register.

它的意思是,指定要写入端口输出数据寄存器的值。

以LED流水灯为例,用该函数我们可以直接配置PA0-PA15 16个端口

直接上代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main()
{
	
		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;//把16个端口全部配置为推挽输出 
		//GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ;//按位“或”选中多个端口
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
		GPIO_Init(GPIOA,&GPIO_InitStructure);
	    //到上边为止,GPIO初始化完成 
	  while(1)

	  {
		
        GPIO_Write(GPIOA,~0X0001);//因为低电平点亮,所以按位取反,此时第一个LED点亮其他为灭			
		//0000 0000 0000 0001  对应PA0-PA15  16个端口,最低位PA0
		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);
		GPIO_Write(GPIOA,~0X0008);//0000 0000 0000 1000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0X0010);//0000 0000 0001 0000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0X0020);//0000 0000 0010 0000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0X0040);//0000 0000 0100 0000
		Delay_ms(500);
		GPIO_Write(GPIOA,~0X0080);//0000 0000 1000 0000 
		Delay_ms(500);
       
     }
}

需要注意的是,在GPIO_Init中结构体的Pin要改为全部端口,即为GPIO_Pin_All 。

在死循环中,第二个参数用十六进制数表示,因为我们选择LED为低电平点亮,所以我们按位取反,此时第一个LED点亮其他为灭,按位取反操作依次点亮每个端口上的LED,加入延时即可实现LED流水灯。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值