star twitter facebook envelope linkedin youtube alert-red alert home left-quote chevron hamburger minus plus search triangle x

Bài 1: Lập trình GPIO STM32


Bài 1: Lập trình GPIO STM32

1. Giới thiệu về GPIO

General-purpose Input/Output (GPIO) rất phổ biến, là một chức năng ngoại vi cơ bản của mỗi loại vi điều khiển, bao gồm các chân đầu vào và chân đầu ra, có thể được điều khiển bởi người dùng. Đối với chip STM32F107VC gồm có 5 Port chính đó là GPIOA, GPIOB, GPIOC, GPIOD, GPIOE. Mỗi Port có tối đa 16 chân

Cấu trúc 1 chân GPIO của chip:

GPIO bao gồm 2 khối cơ bản:

-Input Driver: Bao gồm thanh ghi Input Data (IDR), và 1 trigger. Tín hiệu Input ngoài việc được ghi vào IDR còn theo các đường Analog để vào bộ ADC, hoặc theo đường Alternate function input vào các ngoại vi khác

-Output Drive: Bao gồm thanh ghi Output Data (ODR), một khối output control để chọn tín hiệu ra là từ ODR hay từ các ngoại vi khác. Tiếp đến điều khiển 2 mosfet cho điện áp ra ở I/O pin

Các chức năng của GPIO bao gồm:

Mặc định khi người dùng không cấu hình, trạng thái của các chân I/O pins là input floating (trạng thái thả nổi).

2. Tạo project

Mở phần mềm STM32CubeIDE lên

Bước 1: Chọn File -> New -> STM32 Project

Bước 2: Chọn chip

Part Number: Chọn chip. Ở đây mình chọn STM32F107VC

Chọn LQFP(Chân chán)

Chọn Next

Bước 3: Đặt tên project rồi chọn next để tiếp tục.

Ở đây các bạn có thể đặt tên tùy thích. Ở trên hình là “stm32-test-project” do đang học bài GPIO mình sẽ đặt tên là “stm32f1-gpio”

Trong lần đầu tiên sử dụng dòng chip F1 sẽ tự động tải các file thư viện cần thiết cho dòng F1

Một số khu vực cần lưu ý:
(1)Workspace project
(2)File config
(3)Cấu hình 1 số ngoại vi cho chip
(4)Hình ảnh mô tả pinout của chip

Bước 4: Cấu hình mạch nạp ST- Link. Trong mục SYS các bạn chọn Serial Wire , để chọn 2 chân PA13 và PA14 là chân nạp.

Bước 5: Cấu hình xung clock. Phần Clock config, để mặc định đó là thạch anh nội 8Mhz

(1) Thạch anh nội 8Mhz

(2) Xung lock của Chip

This image has an empty alt attribute; its file name is Screenshot-from-2021-08-22-22-22-11-2-1024x516.png

Bước 6: Cấu hình GPIO

Ở đâymình sẽ chớp tắt led chân PD2 và PD3 (Chế độ GPIO Output).

Các bạn làm theo từng bước như hình.

Step 1: Mình click phải vào chân PD2 và PD3 rồi chọn GPIO_Output

Sau khi click xong thì sẽ hiện module GPIO Configuration.

Step2: Click vào lần lượt PD2 và PD3 để cấu hình GPIO. Mình sẽ cấu hình như bên dưới

Mình sẽ quan tâm tới các thông số cấu hình sau:

GPIO output level: “LOW” (Trạng thái ban đầu của led và sẽ được kích khi xuất mức “0” tại chân IO)

GPIO mode: Ở đây mình chọn chế độ ngõ ra với điện trở kéo nên sẽ để là “Output Push Pull”

GPIO Pull-ip/Pull-down: Chọn chế độ điện áp kéo lên hay kéo xuống. Chọn “Pull-up”

Bước 7: Sau đó các bạn ấn vào nút tạo project

Sau khi tạo project xong sẽ được giao diện code như bên dưới

Sau đó chọn Project → Build All để build project

Tại lần nạp đầu tiên sẽ yêu cầu cấu hình mạch nạp mình sẽ để mặc định như bên dưới

Kết nối kit STM32 với mạch nạp như bên dưới

ST Link STM32

3.3V ————————————3.3V

GND ————————————GND

SWDIO ———————————-SWDIO

SWCLK ———————————-SWCLK

Nhấn RUN nạp code để kiểm tra mạch nạp đã kết nối đúng chưa

3. Lập trình STM32 GPIO chớp tắt LED chân PD2 PD3

Đây là sơ đồ nguyên lý phần chớp tắt LED

Để LED1 và LED2 hình trên sáng thì mình phải xuất mức 1 tại chân vi điều khiển và ngược lại xuất mức 0 để tắt LED.

Một số hàm liên quan đến GPIO”

– HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) để đảo trạng thái của led PD2 PD3. Ở đây mình sẽ truyền vào 2 tham số, thứ nhất là Port cần sử dụng và tham số thứ 2 là chân IO cần sử dụng cụ thể: HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);

HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_2);

– Ngoài ra có thể xuất mức “1” hoặc mức “0” tại chân IO thông qua hàm HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState):

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);

– HAL_Delay(500) sẽ dừng chờ với 1 khoảng thời gian 500ms

Đây là code chương trình while (1):

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);

HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_3);

HAL_Delay(500);

}

/* USER CODE END 3 */

Các bạn build code và nạp để kiểm trang trạng thái chân PD2 và PD3.

Note:

Các bạn nên code ở trong comment

/* USER CODE BEGIN <Number>*/

/* USER CODE END <Number>*/

Nếu code ở bên ngoài thì khi generation code chúng ta sẽ bị mất.

Sau đây chúng ta sẽ sửa code đọc nút nhấn để cho phép PD2 với PD3 chớp tắt.Khi nhấn nút PC13 thì sẽ cho phép 2 chân LED PD2 và PD3 chớp tắt. Khi nhấn 1 lần nữa thì sẽ không cho phép 2 chân PD2 và PD3 chớp tắt.

Đây là sơ đồ nguyên lý:

Dựa vào sơ đồ nguyên lý trên thì khi không nhấn nút thì điện áp 3.3V đi đến chân PC13 . Khi nhấn nút thì điện áp âm 0V sẽ đi từ GND đến PC13.

Các bạn làm theo các bước như hình vẽ để cấu hình thêm chức năng input:

(1) Double click vào file stm32f1-gpio.ioc để hiển lên chỉnh sửa file cấu hình

(2) Chuột phải vào PC13 và chọn GPIO_Input

(3) Click để generation code

Hàm đọc tín hiệu nút nhấn:

– HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) sẽ đọc nút nhất tại chân 13 của port C và trả về GPIO_PIN_RESET hoặc GPIO_PIN_SET .Đây là code chương trình

/* USER CODE BEGIN 2 */

uint8_t status=0;

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)==GPIO_PIN_RESET){

status=~status;

HAL_Delay(500);

}

if(status!=0){

HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);

HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_3);

HAL_Delay(500);

}

}

/* USER CODE END 3 */

 

NGUỒN: https://talucgiahoang.com/