GPIO知识总结STM32的

1.STM32函数GPIO

看stm32 library的资料应该这样写的:

GPIO_WriteBit(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2,Bit_SET);

这是函数的说明

void GPIO_WriteBit ( GPIO_TypeDef * GPIOx,

uint16_t GPIO_Pin,

BitAction BitVal

)

Parameters:

GPIOx,: where x can be (A..G) to select the GPIO peripheral.

GPIO_Pin,: specifies the port bit to be written. This parameter can be one of GPIO_Pin_x where x can be (0..15).

BitVal,: specifies the value to be written to the selected bit. This parameter can be one of the BitAction enum values:

Bit_RESET: to clear the port pin

Bit_SET: to set the port pin

在stm32f10x_gpio.h

108行

typedef enum

{ Bit_RESET = 0,

Bit_SET

}BitAction;

stm32f10x_gpio.c里的原函数:

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)

{

/* Check the parameters */

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

assert_param(IS_GET_GPIO_PIN(GPIO_Pin));

assert_param(IS_GPIO_BIT_ACTION(BitVal));

if (BitVal != Bit_RESET)

{

GPIOx->BSRR = GPIO_Pin;

}

else

{

GPIOx->BRR = GPIO_Pin;

}

}

2.请问STM32怎么才能并行操作低八位的IO口或高八位的IO口

您好,STM32的GPIO口的功能是非常之强大的。

关于GPIO输出的赋值可以使用两种方法,

方法A:逐个配置法,优点是不会影响到其它的GPIO口,缺点是操作比较繁琐。

方法B:ODR设置法,优点是操作轻松,缺点是需要硬件电路作配合。

下面我们详细描述这两种方法:

方法A:所谓逐个配置法, 就是对需要输出数据的IO口线逐个配置,

需要输出为1的IO口使用GPIOx->BSS = 1 << N; (N表示第N根线,如PA9, N值为9)

需要输出为0的IO口使用GPIOx->BRSS = 1 << N;

使用如下语句可以完成

//to do 先将输出口配置为输出功能

for( i = start; i < end; i++ )

{

if( value & 0x01 )

{ GPIOx->BSS = 1 << i; }

else

{ GPIOx->BRSS = 1 << i; }

}

方法B: ODR配置法,可以直接使用 GPIO->ODR = value << N;给对应的IO口进行输出操作。

但是此时在硬件上要保证:

1. 该功能口(如GPIOA)上的其余的IO口不作为普通的IO输出口使用(因为是键盘扫描,当列输出的时候,行应当是输入;同理,当列输入时,行应当是输出)

2. 行列之外的GPIO口,要么是普通的IO输入口,要么是功能口。功能口就是UART、USB、PWM、ADC等,对GPIO的ODR进行操作时,不会对功能口产生影响。

以上第2条是对第1条的详细解释。

总结:如果在硬件上可以满足方法B的应用条件,建议优先采用方法B。

在其它一些需要使用并行输出,如并口液晶、NandFlash等应该的时候,也可以考虑使用方法B。

3.请问STM32怎么才能并行操作低八位的IO口或高八位的IO口

您好,STM32的GPIO口的功能是非常之强大的。

关于GPIO输出的赋值可以使用两种方法,方法A:逐个配置法,优点是不会影响到其它的GPIO口,缺点是操作比较繁琐。方法B:ODR设置法,优点是操作轻松,缺点是需要硬件电路作配合。

下面我们详细描述这两种方法:方法A:所谓逐个配置法, 就是对需要输出数据的IO口线逐个配置,需要输出为1的IO口使用GPIOx->BSS = 1 <BRSS = 1 << N;使用如下语句可以完成//to do 先将输出口配置为输出功能for( i = start; i BSS = 1 <BRSS = 1 <ODR = value << N;给对应的IO口进行输出操作。但是此时在硬件上要保证:1. 该功能口(如GPIOA)上的其余的IO口不作为普通的IO输出口使用(因为是键盘扫描,当列输出的时候,行应当是输入;同理,当列输入时,行应当是输出)2. 行列之外的GPIO口,要么是普通的IO输入口,要么是功能口。

功能口就是UART、USB、PWM、ADC等,对GPIO的ODR进行操作时,不会对功能口产生影响。以上第2条是对第1条的详细解释。

总结:如果在硬件上可以满足方法B的应用条件,建议优先采用方法B。在其它一些需要使用并行输出,如并口液晶、NandFlash等应该的时候,也可以考虑使用方法B。

%title插图%num