You are on page 1of 77

Ha Noi Univesity of Industry

Bài 2 Faculty of Electronics Engineering

2.1 Phần mềm lập trình Keil - ARM

2.2 Các bước lập trình, biên dịch, nạp và mô phỏng.

2.3 Khung chương trình C cho ARM.


Ha Noi Univesity of Industry
2.1 Phần mềm lập trình Keil - ARM
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
2.1 Phần mềm lập trình Keil - ARM
Faculty of Electronics Engineering
3.1 Công cụ lập trình và thư viện Ha Noi Univesity of Industry
phát triển ứng dụng. Faculty of Electronics Engineering

3.1.1 Công cụ lập trình.


2.1 Phần mềm lập trình Keil - ARM Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
2.1 Phần mềm lập trình Keil - ARM
Faculty of Electronics Engineering

 Thư viện phát triển ứng dụng.

 STM32Snippets
 STM32Cube LL
 Standard Peripheral Libraries
 STM32Cube HAL
 Mbed core
2.1 Phần mềm lập trình Keil - ARM
 Thư viện phát triển ứng dụng.
 STM32Cube HAL + LL APIs
2.1 Phần mềm lập trình Keil - ARM
 Thư viện phát triển ứng dụng.
 STM32Cube HAL + LL APIs
HAL(Hardware Abstraction Layer) API:
 Dành cho người lập trình có kiến
thức nền tốt, muốn tìm cách nhanh
nhất để đánh giá và lựa chọn một
chip STM32.

LL(Low-Layer) API:
 Dành cho các developer có kiến thức
về lập trình vi điều khiển 8-bit.
2.1 Phần mềm lập trình Keil - ARM
 Thư viện phát triển ứng dụng.
 STM32Cube HAL + LL APIs
HAL(Hardware Abstraction Layer) API:
Tính năng
 Dễ chuyển đổi từ dòng STM32 này sang dòng khác mà không phải thay đổi code nhiều.
 Hỗ trợ 100% ngoại vi.
 Tương thích với các middleware như USB/TCP-IP/Graphic/Touch Sense/ RTOS
 Có thể dùng STM32CubeMX để sinh code
Nhược điểm
 Phức tạp khi cần phải tối ưu bộ nhớ.
 Khả năng tương thích với nhiều dòng STM32 sẽ làm tăng thời gian thực thi code, do đó
sẽ làm giảm tốc độ biên dịch chương trình.
2.1 Phần mềm lập trình Keil - ARM
 Thư viện phát triển ứng dụng.
 STM32Cube HAL + LL APIs
LL(Low-Layer) API:

Tính năng:
 Tối ưu cao, tác động tới mức thanh ghi.
 Code sinh ra nhỏ, Debug mức thanh ghi.
 Có các API để cấu hình ngoại vi.
 Không phải thao tác trực tiếp tới thanh ghi.
 Dễ dàng debug.
Nhược điểm
 Vẫn phụ thuộc từng loại STM32 riêng biệt, không thể chuyển trực tiếp từ serie này
sang serie khác.
 Vẫn còn phức tạp khi dùng các ngoại vi như USB.
 Developer vẫn cần phải hiểu hoạt động của ngoại vi ở mức thanh ghi.
 Chỉ hỗ trợ L4, L0 và F0.
 STM32Cube HAL + LL APIs
 STM32Cube HAL + LL APIs
Hỗ trợ của từng thư viện cho các dòng chip của ST
2.2. Các bước lập trình, biên dịch, Ha Noi Univesity of Industry
nạp và mô phỏng Faculty of Electronics Engineering

 Các bước lập trình:


B1: Sinh code bằng phần mềm STMCubeMX
 1 Lựa chọn vi điều khiển
 2 Lựa chọn bộ tạo dao động, tần số xung nhịp.
 3 Lựa chọn các chân vào ra, tài nguyên cần sử dụng theo yêu cầu
 4 Lựa chọn thư mục và trình biên dịch

B2: Thao tác trên Keil


 Viết chương trình theo yêu cầu
 Biên dịch và kiểm tra lỗi.
2.2. Các bước lập trình, biên dịch, Ha Noi Univesity of Industry
nạp và mô phỏng Faculty of Electronics Engineering

 Các bước lập trình và nạp chương trình: chương trình điển hình

Nguồn: The Definitive Guide to ARM® Cortex®-M0 and Cortex-M0+ Processors - Joseph
Yiu
2.2. Các bước lập trình, biên dịch, Ha Noi Univesity of Industry
nạp và mô phỏng Faculty of Electronics Engineering

 Các bước lập trình và nạp chương trình : Arm cortex trên MDK

Nguồn: The Definitive Guide to ARM® Cortex®-M0 and Cortex-M0+ Processors - Joseph Yiu
2.2. Các bước lập trình, biên dịch, Ha Noi Univesity of Industry
nạp và mô phỏng Faculty of Electronics Engineering

 Các ứng dụng với mạch nạp trên dòng ARM – Cortex:

Nguồn: The Definitive Guide to ARM® Cortex®-M0 and Cortex-M0+ Processors - Joseph Yiu
Ha Noi Univesity of Industry
 Mạch nạp chương trình
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
 Mạch nạp chương trình
Faculty of Electronics Engineering

SWJ debug port (serial wire and JTAG)

STM32F10xxx tích hợp chuẩn nạp serial wire / JTAG debug


port (SWJ-DP). Với chuẩn JTAG-DP (5-pin) tích hợp SW-DP
(2-pin)

● JTAG debug port (JTAG-DP 5-pin) chuẩn JTAG tích hợp trên
cổng AHP-AP

● Serial wire debug port (SW-DP) sử dụng 2 chân (clock +


data) trên cổng AHP-AP
Ha Noi Univesity of Industry
 Mạch nạp chương trình
Faculty of Electronics Engineering

Sơ đồ chân mạch nạp


Ha Noi Univesity of Industry
 Mạch nạp chương trình
Faculty of Electronics Engineering

Kết nối với mạch nạp


Ha Noi Univesity of Industry
 Mạch nạp chương trình
Faculty of Electronics Engineering

Mạch nạp ST-LINK/V2 Mạch nạp SPC5-UDESTK

Mạch nạp ULINK


Ha Noi Univesity of Industry
 Mạch nạp chương trình
Faculty of Electronics Engineering

Kết nối mạch nạp ST-LINK/V2 với KIT STM32F103


Ha Noi Univesity of Industry
 Mạch nạp chương trình
Faculty of Electronics Engineering

Kết nối mạch nạp ST-LINK/V2 với KIT STM32F103


Ha Noi Univesity of Industry
 Mạch mô phỏng trên Proteus
Faculty of Electronics Engineering
2.3 KHUNG CHƯƠNG TRÌNH

#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
SystemClock_Config();
MX_GPIO_Init();
while (1)
{}
}
Ha Noi Univesity of Industry
Bài 3: Lập trình cơ bản trên ARM
Faculty of Electronics Engineering

3.1 Lập trình vào/ra GPIO.

3.2 Lập trình ngắt GPIO.

3.3 Lập trình với bộ đếm Timer.

3.4 Lập trình Bộ điều chế độ rộng xung PWM.

3.5 Bộ biến đổi tương tự số.

3.6 Truyền thông nối tiếp.


Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Các chân vào/ra của STM32 mang nhiều chức năng, nó có thể được
thiết lập là chân vào/ra dữ liệu hay là các chân chức năng đặc biệt của
các bộ ngoại vi, sử dụng các thanh ghi điều khiển của ngoại vi để lựa
chọn chức năng cho các chân.

 Mỗi cổng GPIO của vi điều khiển STM32F103 có:


• 2 thanh ghi cấu hình 32-bit: GPIOx_CRL, GPIOx_CRH.
• 2 thanh ghi dữ liệu 32-bit: GPIOx_IDR, GPIOx_ODR.
• 1 thanh ghi 32-bit set/reset: GPIOx_BSRR.
• 1 thanh ghi 16-bit reset: GPIOx_BRR.
• 1 thanh ghi khóa 32-bit: GPIOx_LCKR.
Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Các chân GPIO có thể làm việc ở nhiều chế độ khác nhau, việc cấu hình
lựa chọn chế độ làm việc cho mỗi chân GPIO được thực hiện bằng chương
trình.
 Các chế độ làm việc của GPIO:
• Input floating
• Input pull-up
• Input-pull-down
• Analog
• Output open-drain
• Output push-pull
• Alternate function push-pull
• Alternate function open-drain
Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 STM32F103C8T6 có 37 chân vào ra dữ liệu trên 4 PORT

• PORT A : PA0 ÷ PA15


• PORT B : PB0 ÷ PB15
• PORT C : PC13 ÷ PC15
• PORT D : PD0 ÷ PD1
3.1. Lập trình vào/ra GPIO.
- PORT A : PA0 ÷ PA15
- PORT B : PB0 ÷ PB15
- PORT C : PC13 ÷ PC15
- PORT D : PD0 ÷ PD1
3.1. Lập trình vào/ra GPIO.

Sơ đồ khối của chân GPIO


3.1. Lập trình vào/ra GPIO.

Sơ đồ khối của chân GPIO


Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình các chế độ của GPIO:


Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình các chế độ của GPIO:


Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình chiều vào GPIO:


Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình chiều vào GPIO:

Khi chân I/O được thiết lập là chiều vào:


• Bộ đệm đầu ra bị tắt.
• Đầu vào Schmitt Trigger được thiết lập.
• Điện trở Pull-up hoặc Pull-down tùy thuộc vào cấu hình đầu vào với 3 lựa
chọn (pull-up, pull-down hoặc floating):
• Dữ liệu trên chân GPIO được lấy mẫu vào thanh ghi APB2.
• Trạng thái trên chân GPIO sẽ được cho phép đọc bằng thanh ghi dữ liệu
Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình chiều ra GPIO:


Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình chiều vào GPIO:

Khi chân I/O được thiết lập là chiều ra:


• Bộ đệm đầu ra bật:
– Open Drain Mode: P-MOS không được kích hoạt.
Thanh ghi Output thiết lập mức “0” hoặc “1” trên N-MOS.
– Push-Pull Mode: N-MOS,P-MOS được kích hoạt
• Đầu vào Schmitt Trigger được thiết lập.
• Không thiết lập Điện trở pull-up and pull-down đầu vào .
• Dữ liệu trên chân GPIO được lấy mẫu vào thanh ghi APB2.
Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình Alternate GPIO: OSC, JTAG/SWD, Timer, UART, I2C, CAN, USB
Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Cấu hình Analog GPIO:


Ha Noi Univesity of Industry
3.1. Lập trình vào/ra GPIO.
Faculty of Electronics Engineering

 Các thanh ghi GPIO và AFIO:


Ha Noi Univesity of Industry
3.2 Lập trình vào ra đa dụng GPIO.
Faculty of Electronics Engineering

 Các thanh ghi GPIO và AFIO:


3.1. Lập trình vào/ra GPIO.
- Các hàm điều khiển GPIO

 Lập trình với ARM bằng thanh ghi phức tạp và mất nhiều thời
gian. Để người dùng tiếp cận nhanh hãng sản xuất cung cấp
các hàm API để hỗ trợ lập trình.

 Lập trình đối với ARM STM32F103C8T6 sẽ sử dụng tài liệu


chứa các hàm API trong file: 7 Description-of-stm32f1-hal-
and-lowlayer-drivers-stmicroelectronics.pdf trong thư mục
“1. Tai lieu ARM STM 32 ”
3.1. Lập trình vào/ra GPIO.
- Các hàm điều khiển GPIO

• GPIO_InitTypeDef • HAL_GPIOEx_ConfigEventou
• HAL_GPIO_Init • HAL_GPIOEx_EnableEventout
• HAL_GPIO_DeInit • HAL_GPIOEx_DisableEventout
• HAL_GPIO_ReadPin
• HAL_GPIO_WritePin
• HAL_GPIO_TogglePin
• HAL_GPIO_LockPin
• HAL_GPIO_EXTI_IRQHandler
• HAL_GPIO_EXTI_Callback
KHUNG CHƯƠNG TRÌNH LẬP TRÌNH VỚI GPIO

#include "main.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
SystemClock_Config();
MX_GPIO_Init();
while (1)
{}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue =
RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{ Error_Handler();}
RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) !=
HAL_OK)
{ Error_Handler(); }
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin|LED3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}

#ifdef USE_FULL_ASSERT
#endif /* USE_FULL_ASSERT */
3.1. Lập trình vào/ra GPIO.
- Các bước lập trình với GPIO

1. Thiết lập xung nhịp cho hệ thống.


2. Cho phép xung nhịp GPIO APB2.
3. Cấu hình GPIO.
4. Đọc dữ liệu hoặc ghi dữ liệu.
CÁC BƯỚC LẬP TRÌNH VỚI GPIO
 Cấu hình xung nhịp hệ thống:
SystemClock_Config();

 Cho phép xung nhịp GPIO APB2:


_HAL_RCC_GPIOx_CLK_ENABLE().

 Cấu hình GPIO: GPIO_InitTypeDef


HAL_GPIO_Init().

 Đọc dữ liệu sử dụng HAL_GPIO_ReadPin().

 Ghi dữ liệu sử dụng HAL_GPIO_WritePin()


/HAL_GPIO_TogglePin().

 Thiết lập khóa GPIO HAL_GPIO_LockPin().


CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình cho xung nhịp GPIO:


 SystemClock_Config();

• RCC_OscInitTypeDef RCC_OscInitStruct = {0};


• RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình cho xung nhịp GPIO: Lựa chọn nguồn xung
 RCC_OscInitTypeDef :
• uint32_t OscillatorType
• uint32_t Prediv1Source
• uint32_t HSEState
• uint32_t HSEPredivValue
• uint32_t LSEState
• uint32_t HSIState
• uint32_t HSICalibrationValue
• uint32_t LSIState
• RCC_PLLInitTypeDef PLL
• RCC_PLL2InitTypeDef PLL2
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 RCC_OscInitTypeDef :
• RCC_OscInitStruct.OscillatorType =
RCC_OSCILLATORTYPE_HSI;
• RCC_OscInitStruct.HSIState =
RCC_HSI_ON;
• RCC_OscInitStruct.HSICalibrationValue =
RCC_HSICALIBRATION_DEFAULT;
• RCC_OscInitStruct.PLL.PLLState =
RCC_PLL_NONE;
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình cho xung nhịp GPIO: Lựa chọn xung nhịp
 RCC_ClkInitTypeDef :
• uint32_t ClockType
• uint32_t SYSCLKSource
• uint32_t AHBCLKDivider
• uint32_t APB1CLKDivider
• uint32_t APB2CLKDivider
CÁC BƯỚC LẬP TRÌNH VỚI GPIO
 RCC_ClkInitTypeDef :
• RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

• RCC_ClkInitStruct.SYSCLKSource =
RCC_SYSCLKSOURCE_HSI;

• RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

• RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

• RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cho phép xung nhịp GPIO


 _HAL_RCC_GPIOx_CLK_ENABLE().

 _HAL_RCC_GPIOA_CLK_ENABLE().Cho phép PORTA


CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO :


 GPIO_InitTypeDef GPIO_InitStruct = {0};
• uint32_t Pin

• uint32_t Mode

• uint32_t Pull

• uint32_t Speed
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO


 GPIO_InitTypeDef GPIO_InitStruct = {0};
• uint32_t Pin : Thiết lập chân GPIO
GPIO_PIN_0; GPIO_PIN_1; GPIO_PIN_2; GPIO_PIN_3;
GPIO_PIN_4; GPIO_PIN_5;GPIO_PIN_6; GPIO_PIN_7;
GPIO_PIN_8; GPIO_PIN_9; GPIO_PIN_10; GPIO_PIN_11
GPIO_PIN_12; GPIO_PIN_13; GPIO_PIN_14; GPIO_PIN_15;
GPIO_PIN_All; GPIO_PIN_MASK

ví dụ: GPIO_InitStruct.Pin = GPIO_PIN_0;


CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO


 GPIO_InitTypeDef GPIO_InitStruct = {0};
• uint32_t Mode : Thiết lập chế độ
GPIO_MODE_INPUT Input Floating Mode
GPIO_MODE_OUTPUT_PP Output Push Pull Mode
GPIO_MODE_OUTPUT_OD Output Open Drain Mode
GPIO_MODE_AF_PP Alternate Function Push Pull Mode
GPIO_MODE_AF_OD Alternate Function Open Drain Mode
GPIO_MODE_ANALOG Analog Mode
External Interrupt Mode with Rising edge trigger
GPIO_MODE_IT_RISING
detection
External Interrupt Mode with Falling edge trigger
GPIO_MODE_IT_FALLING
detection
External Interrupt Mode with Rising/Falling edge trigger
GPIO_MODE_IT_RISING_FALLING
detection
External Event Mode with Rising edge trigger detection
GPIO_MODE_EVT_RISING
External Interrupt Mode with Rising/Falling edge trigger
GPIO_MODE_IT_RISING_FALLING detection

External Event Mode with Rising edge trigger detection


GPIO_MODE_EVT_RISING

GPIO_MODE_EVT_FALLING External Event Mode with Falling edge trigger detection

External Event Mode with Rising/Falling edge trigger


GPIO_MODE_EVT_RISING_FALLING
detection
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO


 GPIO_InitTypeDef GPIO_InitStruct = {0};

• uint32_t Mode

ví dụ: GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO


 GPIO_InitTypeDef GPIO_InitStruct = {0};

• uint32_t Pull : Thiết lập trở treo


GPIO_NOPULL No Pull-up or Pull-down activation

GPIO_PULLUP Pull-up activation

GPIO_PULLDOWN Pull-down activation

ví dụ: GPIO_InitStruct.Pull = GPIO_PULLUP;


CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO HAL_GPIO_Init().


 GPIO_InitTypeDef GPIO_InitStruct = {0};
• uint32_t Speed
GPIO_SPEED_FREQ_LOW Low speed

GPIO_SPEED_FREQ_MEDIUM Medium speed

GPIO_SPEED_FREQ_HIGH High speed

ví dụ: GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;


CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO:


 HAL_GPIO_Init(); Khởi tạo GPIO theo các tham số
trong hàm GPIO_Init .
 HAL_GPIO_Init (GPIO_TypeDef * GPIOx,
GPIO_InitTypeDef * GPIO_Init).

ví dụ: HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Cấu hình các chân GPIO


Ví dụ:
GPIO_InitStruct.Pin = GPIO_Pin_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Xuất nhập dữ liệu


 Xuất dữ liệu : HAL_GPIO_WritePin();
 HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin,
GPIO_PinState PinState)
o GPIO_TypeDef * GPIOx : cổng GPIO
o uint16_t GPIO_Pin: chân GPIO

o GPIO_PinState PinState: thiết lập giá trị theo bit :


0 – GPIO_PIN_RESET: to clear the port pin
1 – GPIO_PIN_SET: to set the port pin

Ví dụ: Xuất dữ liệu mức 1 trên chân PA0.


HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Xuất nhập dữ liệu


 Xuất dữ liệu : HAL_GPIO_TogglePin();
 HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

o GPIO_TypeDef * GPIOx : cổng GPIO

o uint16_t GPIO_Pin: chân GPIO


o

Ví dụ: Đảo mức 1 trên chân PA0.


HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
CÁC BƯỚC LẬP TRÌNH VỚI GPIO

 Xuất nhập dữ liệu


 Nhập dữ liệu : HAL_GPIO_ReadPin();
 HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
o GPIO_TypeDef * GPIOx : cổng GPIO

o uint16_t GPIO_Pin: chân GPIO

Ví dụ: Nhập dữ liệu mức 1 trên chân PA1.

x = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
3.1 Lập trình vào/ra GPIO
- Ví dụ thiết kế ứng dụng vào/ra.

 Giới thiệu KIT STM32F103C8T6 Blue Pill

KIT STM32F103 BLUE PILL


Sơ đồ chân chức nằng KIT STM32F103 BLUE PILL
Sơ đồ nguyên lý KIT STM32F103C8T6
Nguồn: easyeda.com
A- Điều khiển Led đơn

Bài 1: Lập trình điều khiển LED (kết nối với chân PA0) sáng

#include "main.h"

int main(void)
{
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
}
}
A- Điều khiển Led đơn

Bài 2: Lập trình điều khiển LED (kết nối với chân PA0) nhấp nháy với chu kì 1s

#include "main.h"

int main(void)
{
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
A- Điều khiển Led đơn

Bài 3: Lập trình điều khiển khi nhấn nút Select (kết nối với chân PA11)
LED (kết nối với chân PA0) sáng
A- Điều khiển Led đơn

Bài 3: Lập trình điều khiển khi nhấn nút Select (kết nối với chân PA11)
LED (kết nối với chân PA0) sáng

#include "main.h"
int main(void)
{
SystemClock_Config();
MX_GPIO_Init();
while (1){
if(HAL_GPIO_ReadPin(GPIOA, GPIO_Pin_11)==0)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
}
}
B- Bài tập

Bài tập 1. Lập trình nhấn nút BT1 led Status sáng nhấp nháy 5 lần.
Bài tập 2. Lập trình nhấn nút BT1 - LED sáng, nhấn nút BT2 LED tắt.
Bài tập 3. Lập trình nhấn nút BT1 led vàng sáng, nhấn tiếp led tắt và lặp lại.
Bài tập 4. Lập trình điều khiển đèn giao thông bao gồm 3 LED xanh, vàng, đỏ.
Khi nhấn nút BT1 LED vàng nhấp nháy(tương ứng với chế độ ban đêm),
ngược lại sáng chế độ ban ngày.

You might also like