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).
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
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
Đâ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/