Thứ Sáu, 15 tháng 3, 2019

[Học ARM-Bài2] GPIO STM32 với Standard Peripheral Library

Author: Cong Neb
Alias: Dark Neb
Studied at: SET BKHN K57
Nếu copy tài liệu: Nhớ ghi nguồn tác giả..Tks


Các Register của GPIO

__IO uint32_t MODER
__IO uint32_t OTYPER
__IO uint32_t OSPEEDR
__IO uint32_t PUPDR
__IO uint32_t IDR
__IO uint32_t ODR
__IO uint16_t BSRRL
__IO uint16_t BSRRH
__IO uint32_t LCKR
__IO uint32_t AFR

Các steps để sử dụng GPIO Driver...

1.   Enable the GPIO AHB clock (RCC: Reset Control Clock)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx,ENABLE);

GPIOx: Port mà bạn muốn sử dụng.... Eg : GPIOA/GPIOC...etc



2. Configure the GPIO pin(s) sử dụng hàm GPIO_Init()
Input: Floating, Pull-up, Pull-down.
Output: Push-Pull (Pull-up, Pull-down or no Pull). Open Drain (Pull-up, Pull-down
or no Pull). In output mode, the speed is configurable: 2 MHz, 25 MHz, 50 MHz or
100 MHz.
- Alternate Function: Push-Pull (Pull-up, Pull-down or no Pull). Open Drain (Pullup, Pull-down or no Pull).  Chức năng này sử dụng để dùng cho các ngoại vi như UART,SPI,I2C

- Analog: Sử dụng chức năng này khi dùng ADC channel or DAC output.


Các hàm() làm việc với GPIO

1. Khởi tạo và cấu hình
GPIO_DeInit()
GPIO_Init()
GPIO_StructInit()
GPIO_PicLockConfig()

2. GPIO Read and Write
GPIO_ReadInputDataBit()
GPIO_ReadInputData()
GPIO_ReadOutputDataBit()
GPIO_ReadOutputData()
GPIO_Setbits()
GPIO_Resetbits()
GPIO_Writebit()
GPIO_Write()
GPIO_ToggleBit()
GIPO_PinAFConfig()


Trước tiên ta phải hiểu GPIO_InitTypeDef
GPIO_InitTypeDefis được defined trong thư viện stm32f2xx_gpio.h
Nó thực chất là 1 kiểu dữ liệu struct trong C dùng để khai báo các tham số 1 PIN của GPIO...

uint32_t GPIO_Pin
GPIOMode_TypeDef GPIO_Mode
GPIOSpeed_TypeDef GPIO_Speed
GPIOOType_TypeDef GPIO_OType
GPIOPuPd_TypeDef GPIO_PuPd


1.1 GPIO_DeInit()
void GPIO_DeInit ( GPIO_TypeDef *  GPIOx)

Mục đích: Hủy tất cả các khởi tạo trước đó của GPIOx .

1.2 GPIO_Init()
void GPIO_Init ( GPIO_TypeDef *  GPIOx, GPIO_InitTypeDef *  GPIO_InitStruct)

Mục đích: Khởi tạo GPIOx để làm việc với nó.



2.1 GPIO_ReadInputDataBit()
uint8_t GPIO_ReadInputDataBit ( GPIO_TypeDef *  GPIOx,  uint16_t GPIO_Pin)

Mục đích: Đọc dữ liệu đầu vào trên PIN của Port GPIOx

2.2. GPIO_ReadInputData()
uint16_t GPIO_ReadInputData ( GPIO_TypeDef *  GPIOx)

Purpose: Đọc dữ liệu đầu vào trên Port GPIOx (Khác với hàm trên là đọc trên Pins thì hàm này đọc cả PORT)

2.3 GPIO_SetBits
void GPIO_SetBits ( GPIO_TypeDef *  GPIOx, uint16_t  GPIO_Pin)

Set giá trị bit cho Pin của PORT..
Nó sẽ mapping tới Register : BSRR

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

Ghi mức giá trị ra PIN ( HIGH or LOW)
Note: BitVal có 2 values là enum {Bit_RESET,Bit_SET}

2,5 GPIO_ToggleBits
void GPIO_ToggleBits ( GPIO_TypeDef *  GPIOx, uint16_t GPIO_Pin)

Purpose: Thực hiện Blink signal trên PIN

Một số ví dụ:

VD1: Output Mode
// Enable xung clock trên GPIOA
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA,ENABLE);

GPIO_InitTypeDef   GPIO_InitDef;

GPIO_InitDef.GPIO_Pin = GPIO_Pin_0; //Chon pin A0
GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitDef.GPIO_OType = GPIO_OType_PP;  //push pull
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitDef.GPIO_Speed = GPIO_Speed_36MHz;

GPIO_Init(GPIOA,&GPIO_InitDef);
// Done

VD2. Input Mode
// Enable RCC
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOB,ENABLE);

GPIO_InitTypeDef   GPIO_InitDef;

GPIO_InitDef.GPIO_Pin = GPIO_Pin_1;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_UP;
// Input mode không có OType và Speed nhé các bạn...

GPIO_Init(GPIOB,&GPIO_InitDef);
//done

VD3. Analog Mode
Các bạn cần đọc datasheet của Chip để biết Pin/Port nào support Mode ADC,DAC rồi mới config nhé. Ở đây mình dùng chip Stm32f10x nên nó ở PORTA

// Enable RCC
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA,ENABLE);

GPIO_InitTypeDef   GPIO_InitDef;

GPIO_InitDef.GPIO_Pin = GPIO_Pin_0;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_AIN; //AIN: Analog in,tức là đầu vào là Analog signal
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOB,&GPIO_InitDef);
//done

VD4...Alternate function mode
// Enable RCC
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOD,ENABLE);

GPIO_InitTypeDef   GPIO_InitDef;

// Kết nối chân PD5 tới USART2
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5, GPIO_AF_USART2);
//Kết nối chân PD6 tới USART2
GPIO_PinAFConfig(GPIOD,GPIO_PinSource6, GPIO_AF_USART2);

GPIO_InitDef.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitDef.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitDef.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitDef.GPIO_Speed = GPIO_Speed_36MHz;

GPIO_Init(GPIOD,&GPIO_InitDef);
//done


Contact me if u have any questions: https://www.facebook.com/coge8

Không có nhận xét nào:

Đăng nhận xét