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