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


前言

之前讲解了初学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流水灯。

你可能感兴趣的:(stm32,单片机,嵌入式硬件,arm)