Professional Documents
Culture Documents
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 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
● JTAG debug port (JTAG-DP 5-pin) chuẩn JTAG tích hợp trên
cổng AHP-AP
#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
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.
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
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
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.
• 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
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
• uint32_t Mode
• uint32_t Pull
• uint32_t Speed
CÁC BƯỚC LẬP TRÌNH VỚI GPIO
• uint32_t Mode
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
CÁC BƯỚC LẬP TRÌNH VỚI GPIO
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.
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.