Mục tiêu
- Học cách setup pin và port của GPIO với CubeIDE, CubeMX
- Học cách Generate Code dùng CubeIDE và cách sử dụng HAL function
Kết quả
- Cấu hình GPIO pin trong CubeMX của CubeIDE và sinh code
- Thêm vào project 2 hàm
HAL_Delay
vàHAL_GPIO_Toggle
- Kiểm tra lại các chức năng bật tắt LED
Trước khi bắt đầu nếu bạn chưa biết về STM32CubeIDE có thể xem qua bài viết sau

Cấu hình GPIO
Tạo project mới
- File > New > STM32 Project

- Chọn chip STM32F4 > STM32F07VETx, sau đó điền tên project tương ứng


Cấu hình chân LED là GPIO_Output

Đã code thì lúc nào cũng có bug nên cần phải có debug, mình khuyến khích mọi người sử dụng chân debug SWD hoặc JTAG, nhà nghèo không có JTAG thì chơi SWD với ST-Link

- Chọn Categories >SYS
- Chọn Debug là Serial Wire và bạn sẽ thấy 2 chân SYS_TCK_SWCLK và SYS_JTMS_SWDIO sẽ hiển thị
- Nếu SWD/JTAG không được chọn thì chúng ta sẽ không dùng được debug nhé
Cấu hình clock
- Vào thẻ Clock Configuration

- Clock configuration này là một phiên bản minh họa sơ đồ clock trong RM(Reference Manual DM00031020_stm32f4x_reference_manual.pdf)

- Clock source có 2 loại internal oscillators và external clock source như hình

Với internal oscillator (thạch anh nội) ta có 2 dạng
- LSI
- HSI

Với external clock source sẽ có 2 dạng là
- LSE
- HSE

Để enable external clock thì cần làm như sau RCC > High Speed Clock HSE là Crystal Ceramic Resonator

Bạn có thể thấy HSE đã hiện hình để mình có thể dùng bên thẻ Clock Configuration
Sau đây là một số mô tả cụ thể về clock tree cho core
- System multiplexer
- PLL
- PLL source multiplexer

Core clock từ HSI, cấu hình mặc định sau khi reset

Core clock từ HSE

Core clock từ PLL và HSI

Core clock từ PLL và HSE

AHB, APB prescaler và tốc độ ngoại vi

Còn những clock mà có màu xám làm sao để enable nó lên ?

MCO1

RTC

USB

Cấu hình GPIO pin
- Chọn Push Pull mode
- No pull-up và pull-down
- Output speed là HIGH đối với các ngoại vi như SPI UART
- Ấn nút OK

Cấu hình tốc độ GPIO output
- Thay đổi rising và falling edge khi trạng thái của pin thay đổi từ high qua low và ngược lại
- Với cấu hình GPIO speed càng cao thì sẽ làm tăng nhiễu EMI của STM32 và tăng năng lượng tiêu thụ
- Ở đây tốt nhất là đưa tốc độ GPIO tương ứng với tốc độ của ngoại vi. Ví dụ: Chớp GPIO với 1Hz là LOW để tối ưu cấu hình, nhưng với SPI thì 45MHz thì cần set HIGH.

Giờ thì ta có thể Generate Source code bằng cách save lại, với CubeMX thông thường thì bạn sẽ có thêm nhiều option generate với các compiler khác nhau.
Sau đó quan sát file main.c
bằng IDE
- Function mà bạn cần code sẽ nằm trong main.c hoặc được gọi từ main.c
- Viết code của mình vào những đoạn có BEGIN, END như sau /* USER CODE BEGIN 3 */ và /* USER CODE END 3 */
- Code trong vòng lặp while(1){ }
Để blink LED thì ta cần sử dụng 2 function sau đây
HAL_HAL_Delay
HAL_GPIO_WritePin
hoặcHAL_GPIO_TogglePin
/* USER CODE BEGIN 3 */
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);
/* USER CODE END 3 */
Chương trình GPIO cơ bản bạn có thể xem ở đây