STM32F4 Discovery – Bài 2: Làm việc với GPIO

0
3873

Giới thiệu chung

Vi điều khiển STM32F407VG có 5 bộ chân, mỗi bộ – gồm tối đa 16 chân – ta gọi là một cổng, ký hiệu A, B, C, D, E… Mỗi chân của cổng có thể được cấu hình làm đầu vào hoặc đầu ra cho tín hiệu số với các tham số phụ được thiết lập phù hợp với mục đích sử dụng (GPIO – General-purpose Input/Output). Bên cạnh đó, mỗi chân cũng có thể đảm trách một trong số 16 chức năng thay thế định trước (AFIO – Alternate Function Input/Output). Các tham số thiết lập cũng như các chức năng của chân có thể được cấu hình bằng chương trình người dùng thông qua việc ghi các giá trị phù hợp vào các thanh ghi bên trong vi điều khiển. Việc thay đổi giá trị các thanh ghi này cho phép xác định các tính chất của các chân và các cổng.

Mỗi cổng GPIO có:

  • 4 thanh ghi cấu hình 32-bit: GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR và GPIOx_PUPDR
  • 2 thanh ghi dữ liệu 32-bit: GPIOx_IDR and GPIOx_ODR
  • 1 thanh ghi 32-bit set/reset: GPIOx_BSRR
  • 1 thanh ghi khóa 32-bit: GPIOx_LCKR
  • 1 thanh ghi 32-bit lựa chọn chức năng thay thế (alternate function): GPIOx_AFRH và GPIOx_AFRL

Các cổng GPIO có thể làm việc ở nhiều chế độ khác nhau, việc cấu hình lựa chọn chế độ làm việc cho mỗi chân của cổng được thực hiện thông qua chương trình. Dưới đây là các chế độ làm việc của cổng:

  • Input floating
  • Input pull-up
  • Input pull-down
  • Analog
  • Output open-drain with pull-up or pull-down capability
  • Output push-pull with pull-up or pull-down capability
  • Alternate function push-pull with pull-up or pull-down capability
  • Alternate function open-drain with pull-up or pull-down capability
VDD_FT là chân vào/ra chịu được hiệu điện thế 5V, khác với chân VDD

Bảng các bit cấu hình của cổng:

GP=general-purpose, PP=push-pull, PU=pull-up, PD=pull-down, OD=open-drain, AF=alternate function

Để hiểu nguyên tắc làm việc với các cổng, chúng ta xem xét ví dụ lập trình điều khiển đèn LED. Trên board STM32F4Discovery có sẵn 8 đèn LED, trong đó có 4 đèn dành cho người dùng với các màu orange, green, red, blue. Chúng ta sẽ lập trình điều khiển 4 đèn này. 

Schematic khối LED đơn trên KIT STM32F4 Discovery

Ví dụ 1: Chớp tắt LED trên chân PD12

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

/* Ham giu cham */
void Delay(__IO uint32_t nCount)
{
while(nCount--)
{
}
}

int main(void) 
{
/* Khai bao struct de lam viec voi cong GPIO */
	GPIO_InitTypeDef CongD;

/* Ket noi GPIOD voi clock va bat clock */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

/* Khoi tao cong D la output, chuan bi xuat du lieu ra chan 12 */
	CongD.GPIO_Pin = GPIO_Pin_12;
	CongD.GPIO_Mode = GPIO_Mode_OUT;
	CongD.GPIO_OType = GPIO_OType_PP;
	CongD.GPIO_PuPd = GPIO_PuPd_NOPULL;
	CongD.GPIO_Speed = GPIO_Speed_100MHz;
	
/* Goi ham khoi tao cong */
	GPIO_Init(GPIOD, &CongD);

	while (1) 
{
	/* Dao bit chan 12 cua GPIOD */
		GPIO_ToggleBits(GPIOD, GPIO_Pin_12);

	/* Doi mot khoang thoi gian */
		Delay(100000);
}
}

Ví dụ 2:

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

int main(void) {
	GPIO_InitTypeDef CongD, CongA;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

	CongD.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
	CongD.GPIO_Mode = GPIO_Mode_OUT;
	CongD.GPIO_OType = GPIO_OType_PP;
	CongD.GPIO_PuPd = GPIO_PuPd_NOPULL;
	CongD.GPIO_Speed = GPIO_Speed_100MHz;
	
//Khoi tao cong D
	GPIO_Init(GPIOD, & CongD);

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

	CongA.GPIO_Pin = GPIO_Pin_0;
	CongA.GPIO_Mode = GPIO_Mode_IN;
	CongA.GPIO_OType = GPIO_OType_PP;
	CongA.GPIO_PuPd = GPIO_PuPd_DOWN;
	CongA.GPIO_Speed = GPIO_Speed_100MHz;
	//Khoi tao cong A
	GPIO_Init(GPIOA, & CongA);

	while (1) 
{
		if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) 
			GPIO_SetBits(GPIOD, GPIO_Pin_13 | GPIO_Pin_14);
else 
			GPIO_ResetBits(GPIOD, GPIO_Pin_13 | GPIO_Pin_14);
}
}
 

LEAVE A REPLY

Please enter your comment!
Please enter your name here