Chương 3 của môn Vi điều khiển nâng cao sẽ giới thiệu những kiến thức cơ bản về vi điều khiển ARM như công cụ lập trình, thư viện phát triển ứng dụng, lập trình vào ra đa dụng GPIO, lập trình vào ra với ngắt ngoài GPIO, lập trình timer, lập trình PWM, lập trình ADC, lập trình UART.
Trang 1CHƯƠNG 3 Ha Noi Univesity of Industry
Faculty of Electronics Engineering
3.1 Công cụ lập trình và thư viện phát triển ứng dụng.
3.2 Lập trình vào ra đa dụng GPIO.
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
3.3 Lập trình vào ra với ngắt ngoài GPIO.
3.4 Lập trình bộ đếm Timer.
3.5 Lập trình điều chế độ rộng xung PWM.
3.6 Lập trình biến đổi tương tự số ADC.
3.7 Lập trình truyền thông nối tiếp UART.
Trang 23.1 Công cụ lập trình và thư viện
phát triển ứng dụng Ha Noi Univesity of IndustryFaculty of Electronics Engineering3.1.1 Công cụ lập trình.
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Trang 33.1 Công cụ lập trình và thư viện
phát triển ứng dụng Ha Noi Univesity of IndustryFaculty of Electronics Engineering3.1.1 Công cụ lập trình.
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Trang 43.1 Công cụ lập trình và thư viện
phát triển ứng dụng Ha Noi Univesity of IndustryFaculty of Electronics Engineering3.1.1 Công cụ lập trình.
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Trang 53.1 Công cụ lập trình và thư viện
phát triển ứng dụng Ha Noi Univesity of IndustryFaculty of Electronics Engineering3.1.2 Thư viện phát triển ứng dụng.
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Trang 63.1 Công cụ lập trình và thư viện
phát triển ứng dụng Ha Noi Univesity of IndustryFaculty of Electronics Engineering3.1.2 Thư viện phát triển ứng dụng.
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Trang 73.1 Công cụ lập trình và thư viện phát triển ứng dụng 3.1.2 Thư viện phát triển ứng dụng.
STM32Cube HAL + LL APIs
Trang 83.1 Công cụ lập trình và thư viện phát triển ứng dụng 3.1.2 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.
Trang 93.1 Công cụ lập trình và thư viện phát triển ứng dụng.
3.1.2 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.
Trang 103.1 Công cụ lập trình và thư viện phát triển ứng dụng 3.1.2 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.
Trang 11 STM32Cube HAL + LL APIs
Trang 12 STM32Cube HAL + LL APIs
Trang 13Hỗ trợ của từng thư viện cho các dòng chip của ST
Trang 143.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
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.
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.
Trang 153.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Các chế độ làm việc của GPIO:
• Alternate function push-pull
• Alternate function open-drain
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.
Trang 163.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
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
Trang 173.2 Lập trình vào ra đa dụng GPIO.
- PORT A : PA0 ÷ PA15
- PORT B : PB0 ÷ PB15
- PORT C : PC13 ÷ PC15
- PORT D : PD0 ÷ PD1
Trang 18Sơ đồ khối của chân GPIO
3.2 Lập trình vào ra đa dụng GPIO.
Trang 19Sơ đồ khối của chân GPIO
3.2 Lập trình vào ra đa dụng GPIO.
Trang 203.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Cấu hình các chế độ của GPIO:
Trang 213.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Cấu hình các chế độ của GPIO:
Trang 223.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Cấu hình chiều vào GPIO:
Trang 233.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
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
Trang 243.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Cấu hình chiều ra GPIO:
Trang 253.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
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.
Trang 263.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Cấu hình Alternate GPIO: OSC, JTAG/SWD, Timer, UART, I2C, CAN, USB
Trang 273.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Cấu hình Analog GPIO:
Trang 283.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Các thanh ghi GPIO và AFIO:
Trang 293.2 Lập trình vào ra đa dụng GPIO Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Ha Noi Univesity of Industry
Faculty of Electronics Engineering
Các thanh ghi GPIO và AFIO:
Trang 313.2 Lập trình vào ra đa dụng
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 ”
Trang 33KHUNG 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)
Trang 34{ Error_Handler(); }
}
Trang 35static 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;
Trang 363.2.1 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.
Trang 37CÁC BƯỚC LẬP TRÌNH VỚI GPIO
Trang 38CÁ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};
Trang 39CÁ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
Trang 40CÁC BƯỚC LẬP TRÌNH VỚI GPIO
• RCC_OscInitStruct.PLL.PLLState =
RCC_PLL_NONE;
Trang 41CÁ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
Trang 42CÁC BƯỚC LẬP TRÌNH VỚI GPIO
Trang 43CÁC BƯỚC LẬP TRÌNH VỚI GPIO
Cho phép xung nhịp GPIO
Trang 44CÁC BƯỚC LẬP TRÌNH VỚI GPIO
Trang 45CÁ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;
Trang 46CÁC BƯỚC LẬP TRÌNH VỚI GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
• uint32_t Mode : Thiết lập chế độ
Trang 47GPIO_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
GPIO_MODE_IT_RISING External Interrupt Mode with Rising edge trigger
detectionGPIO_MODE_IT_FALLING External Interrupt Mode with Falling edge trigger
detectionGPIO_MODE_IT_RISING_FALLING External Interrupt Mode with Rising/Falling edge trigger
detectionGPIO_MODE_EVT_RISING External Event Mode with Rising edge trigger detectionGPIO_MODE_IT_RISING_FALLING External Interrupt Mode with Rising/Falling edge trigger detectionGPIO_MODE_EVT_RISING External Event Mode with Rising edge trigger detectionGPIO_MODE_EVT_FALLING External Event Mode with Falling edge trigger detectionGPIO_MODE_EVT_RISING_FALLING External Event Mode with Rising/Falling edge trigger
detection
Trang 48CÁC BƯỚC LẬP TRÌNH VỚI GPIO
• uint32_t Mode
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
Trang 49CÁC BƯỚC LẬP TRÌNH VỚI GPIO
• uint32_t Pull : Thiết lập trở treo
ví dụ: GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_NOPULL No Pull-up or Pull-down activation
GPIO_PULLUP Pull-up activation
GPIO_PULLDOWN Pull-down activation
Trang 50CÁC BƯỚC LẬP TRÌNH VỚI GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
• uint32_t Speed
ví dụ: GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW ;
GPIO_SPEED_FREQ_LOW Low speed
GPIO_SPEED_FREQ_MEDIUM Medium speed
GPIO_SPEED_FREQ_HIGH High speed
Trang 51CÁC BƯỚC LẬP TRÌNH VỚI GPIO
trong hàm GPIO_Init
GPIO_InitTypeDef * GPIO_Init)
ví dụ: HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Trang 52CÁC BƯỚC LẬP TRÌNH VỚI 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);
Trang 53CÁ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);
Trang 54CÁ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 GPIOo
Ví dụ: Đảo mức 1 trên chân PA0.
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
Trang 55CÁ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);
Trang 56 Giới thiệu KIT STM32F103C8T6 Blue Pill
3.2 Lập trình vào ra đa dụng
- Thiết kế ứng dụng vào/ra.
KIT STM32F103 BLUE PILL
Trang 57Sơ đồ chân chức nằng KIT STM32F103 BLUE PILL
Trang 58Sơ đồ nguyên lý KIT STM32F103C8T6
Nguồn: easyeda.com
Trang 59A- Đ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
Trang 60A- Đ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
Trang 61A- Đ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
Trang 62A- Đ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
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); }
}
Trang 63Bài 4: Lập trình điều khiển đọc số lần
nhấn của nút Select (kết nối với chân
PA7), nếu số lần nhấn lẻ thì LED (kết nối
với chân PA0) sáng, ngược lại LED tắt.
BOOT0 44
NRST 7PA0-WKUP
10
OSCIN_PD0 5OSCOUT_PD1 6
PB8 45
PA2
1211 PA1PA3 13 PA4 14
PB9 46
PA5 15 PA6 16 PA7 17 PA8 29 PA9 30
PB10 21
PA10 31
PB0 18 PB1 19 PB2 20 PB3 39
PB11 22
PB4 40 PB5 41 PB6 42 PB7 43
PB12 25
PB13 26
PB14 27
PB15 28
PA11 32 PA12 33
PA13 34
PA14 37
PA15
38 PC13_RTC 2
PC14-OSC32_IN 3PC15-OSC32_OUT 4
Trang 64B- 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.