05-PHANTHANHTRUNG-NGUYENVANTHIEN.Đèn giao thông led đơn STM32F103docx.pdf

DongNgo14 111 views 44 slides Oct 29, 2024
Slide 1
Slide 1 of 44
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44

About This Presentation

Đèn giao thông led đơn STM32F103docx


Slide Content

TRƯỜNG ĐẠI HỌC THỦ DẦU MỘT
VIỆN KỸ THUẬT – CÔNG NGHỆ
***********


ĐỀ TÀI MÔN HỌC
MÔN: CHUYÊN ĐỀ LẬP TRÌNH HỆ THỐNG NHÚNG
TÊN ĐỀ TÀI: SỬ DỤNG STM32F103R6Tx LẬP TRÌNH HỆ THỐNG
ĐÈN TÍN HIỆU GIAO THÔNG LED ĐƠN.



GVGD: ThS. Ngô Thanh Đông.
SVTH: Phan Thành Trung-2225202160013
Nguyễn Văn Thiên-2225202160116




















Bình Dương, 09/2024

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
1



CHƯƠNG 1: GIỚI THIỆU LẬP TRÌNH HỆ THỐNG NHÚNG

1.1. Giới thiệu lập trình hệ thống nhúng

Hệ thống nhúng (embedded system) là một thuật ngữ để chỉ một hệ thống có khả năng tự trị
được nhúng vào trong một môi trường hay hệ thống mẹ.

Hệ thống nhúng là các hệ thống tích hợp cả phần cứng và phần mềm phục vụ các bài toán
chuyên dụng trong nhiều lĩnh vực công nghiệp, tự động hoá điều khiển, quan trắc và truyền
tin. Đặc điểm của các hệ thống nhúng là hoạt động ổn định và có tính năng tự động hoá cao.

1.2. Lập trinh hệ thống nhúng với STM32

Tập đoàn ST Microelectronic cho ra mắt dòng STM32, vi điều khiển đầu tiên dựa trên nền lõi
ARM Cortex-M3 thế hệ mới do hãng ARM thiết kế, lõi ARM Cortex-M3 là sự cải tiến của
lõi ARM7 truyền thống

Dòng ARM Cortex™-M là thế hệ mới, thiết lập các tiêu chuẩn mới về hiệu suất, chi phí, ứng
dụng cho các thiết bị cần tiêu thụ năng lượng thấp, và đáp ứng yêu cầu thời gian thực khắc
khe.

1.3. Các ứng dụng lập trình hệ thống nhúng của STM32

Một trong số đó phải kể đến là:

• Các máy móc thiết bị y tế: máy thẩm thấu, máy điều hòa nhịp tim, máy hút phổi tự
động, máy điều chỉnh dịch tử cung, và các thiết bị y tế khác. Các hệ thống nhúng
trong lĩnh vực y tế giúp cải thiện chất lượng chăm sóc sức khỏe và đảm bảo tính an
toàn cho bệnh nhân.
• Các thiết bị trong dân dụng như: tủ lạnh, lò vi sóng, lò nướng, nồi chiên, máy giặt,
máy sấy, và các thiết bị gia đình khác. Hệ thống nhúng trong các thiết bị này giúp
tăng cường tính năng và hiệu suất của chúng, đồng thời tiết kiệm năng lượng và
đảm bảo tiện ích cho người dùng.
• Các thiết bị dùng trong văn phòng: máy fax, máy in, máy photocopy, máy quét, máy
trả lời tự động, và các thiết bị văn phòng khác. Hệ thống nhúng trong các thiết bị này
giúp tăng cường khả năng xử lý thông tin và kết nối mạng, cải thiện hiệu suất làm
việc và tiết kiệm thời gian.
• Các thiết bị kết nối internet: router, hub, gateway, bộ chuyển đổi mạng, và các thiết bị
mạng khác. Hệ thống nhúng trong các thiết bị này đóng vai trò quan trọng trong việc
cung cấp kết nối mạng ổn định và an toàn cho các thiết bị và hệ thống khác.
• Các thiết bị điện tử: đồng hồ kỹ thuật số, máy nghe nhạc mp3, điện thoại di động,
máy tính bảng, và các thiết bị di động khác. Hệ thống nhúng trong các thiết bị này
giúp cung cấp các tính năng thông minh, tối ưu hóa hiệu suất và tiết kiệm năng lượng.
• Trong công nghiệp, các hệ thống nhúng được sử dụng trong hầu hết các dây chuyền
sản xuất tự động và các robot công nghiệp để tăng hiệu suất và độ chính xác trong quá
trình sản xuất. Chúng giúp điều khiển và theo dõi các quy trình tự động, đồng thời
tăng tính an toàn và đảm bảo chất lượng sản phẩm.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
2


• Các hệ thống dẫn đường trong không gian, hệ thống định vị và hệ thống thông tin địa
lý. Các hệ thống nhúng trong lĩnh vực này được sử dụng để điều hướng và định vị
trong không gian, cung cấp thông tin chi tiết về vị trí, hướng di chuyển và các dịch vụ
liên quan.
1.4. Cấu trúc STM32F103

Sơ đồ tổng quan
• 4 masters:
– Cortex®-M3 core DCode bus (D-bus) và System bus (S-bus)
– GP-DMA1 & 2 (general-purpose DMA)
• 4 slaves:
– Internal SRAM: Ram nội
– Internal Flash memory: Bộ nhớ Flash nội
– FSMC: Giao thức kết nối bộ nhớ ngoài
– AHB to APBx (APB1 or APB2), kết nối tới các ngoại vi APB

Kiến trúc vi điều khiển STM32f103





CHƯƠNG 2: KHẢO SÁT CHỨC NĂNG XUẤT NHẬP DỮ LIỆU SỐ

2.1. Giới thiệu về GPIO của STM32

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
3


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:

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
4




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).
2.2. Cấu trúc các thanh ghi xuất nhập dữ liệu số của STM32F103C8T6

Input Data Register (IDR): Nhận mức tín hiệu tại chân IO, thông qua việc đọc thanh ghi
GPIOx_IDR thì chúng ta có thể đọc được trạng thái mức “1” hay mức “0” của chân đó tại Port
tương ứng.
Khi cấu hình các chân ở Port tương ứng có chức năng Input thì các thanh ghi dữ liệu
Output (Output data register) sẽ tự động bị khóa lại vì chân đó đã được khai báo là Input. Lúc
này, chúng ta chỉ được phép đọc dữ liệu từ thanh ghi Input Data Register để biết trạng thái của
chân tại port đó chứ không được phép ghi.



2.3. Lệnh nhập dữ liệu số

2.4. Lệnh xuất dữ liệu số

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
5


2.5. Bài tập 01
STM32F103_ĐIỀU KHIỂN ĐỘNG CƠ ENCODER DC

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
6

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
7

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
8

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
9


CHƯƠNG 3: UART CỦA STM32F103

3.1. Giới thiệu về UART của STM32

UART (Universal synchronous asynchronous receiver transmitter ) là một ngoại vi cơ bản
của STM32 sử dụng 2 chân Rx và Tx để nhận và truyền dữ liệu.
UART truyền dữ liệu không đồng bộ, có nghĩa là không có tín hiệu để đồng bộ hóa đầu ra
của các bit từ UART truyền đến việc lấy mẫu các bit bởi UART nhận. Thay vì tín hiệu đồng
bộ, UART truyền thêm các bit start và stop vào gói dữ liệu được chuyển. Các bit này xác
định điểm bắt đầu và điểm kết thúc của gói dữ liệu để UART nhận biết khi nào bắt đầu đọc
các bit.


3.2. Cấu trúc các thanh ghi UART của STM32F103C8T6

1. USART_SR – Status register:


• TXE : bit báo có data đã truyền hay không, =0 tức là data rỗng, có thể truyền, =1 data đã
được truyền đi.
• RXNE: bit báo data đã nhận hay chưa =1: đã nhận, =0 chưa nhận hoặc nhận chưa xong.
• TC : cờ báo đã nhận data hoặc data vừa mới truyền xong.
2. USART_DR – Data register:

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
10





Thanh ghi này chứa Data nhận và Data truyền gồm 9bit. Và nó phụ thuộc vào trạng thái
truyền hoặc nhận sẽ quyết định đó là data truyền hoặc data nhận.
3. USART_BRR – Baud rate register:

Thanh ghi này chứa giá trị tốc độ baudrate được cài đặt. DIV_Mantissa[11:0] là thành phần
trước dấu “,” và DIV_Freaction[3:0] là thành phần sau dấu phẩy của tốc độ baud được quy
đổi theo bảng sau:

4. USART_CRx – Control register:


• UE: bit cho phép UART hoạt động.
• M: độ dài của data là 8 hay 9 bit.
• WAKE: phương pháp đáng thức UART là Idle line hoặc Address Mask.
• PCE : cho phép hoặc không cho phép parity.
• PS: chọn loại Parity chẵn hoặc lẻ.
• PEIE: cho phép ngắt PE hay không ngắt.
• TXEIE: cho phép ngắt truyền hay không.
• TCIE: cho phép ngắt khi truyền/nhận xong hay không.
• RXNEIE: cho phép ngắt nhận hay không.
• TE: cho phép truyền hay không.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
11


• RE: cho phép nhận hay không.
• RWU : cho phép thức tỉnh hay không khi nhận dc data từ bên ngoài.
5. USART_GTPR – Guard time and prescaler register:

Thanh ghi này chúng ta chỉ quan tâm đến PSC[7:0] là những bit cho phép bộ chia clock trong
UART từ clock hệ thống để từ đó chia tốc độ baud cho hợp lý.
3.3. Các chế độ truyền nhập UART của STM32F103C8T6

a. Chế độ Truyền (TX)
• Chân TX: Dữ liệu được gửi từ chân TX. Để gửi dữ liệu, bạn viết vào thanh ghi TDR
(Transmitter Data Register).
• Ngắt Truyền: Có thể thiết lập ngắt khi truyền hoàn tất để xử lý các tác vụ khác.
b. Chế độ Nhận (RX)
• Chân RX: Dữ liệu được nhận tại chân RX. Dữ liệu sẽ được lưu vào thanh ghi RDR
(Receiver Data Register).
• Kiểm tra Lỗi: Có các thanh ghi để kiểm tra lỗi như:
• Overrun error: Khi dữ liệu mới đến trong khi dữ liệu trước đó chưa được đọc.
• Framing error: Khi bit dừng không đúng.
• Parity error: Khi có sự không khớp với bit parity.


3.4. Bài tập 02
STM32F103 TRUYỀN DỮ LIỆU UART_ĐIỀU KHIỂN ĐỘNG CƠ ENCODER DC_P2

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
12

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
13

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
14



3.5.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
15


CHƯƠNG 4: NGẮT STM32

4.1. Giới thiệu về ngắt trong STM32

EXTI tạm dịch là ngắt ngoài hay ngắt sự kiện bên ngoài. Ngắt EXTI được kích hoạt khi có sự
kiện từ bên ngoài tác động vào chân EXTI đó, tùy theo sự kiện đó có phù hợp với điều kiện
ngắt không thì ngắt ngoài mới sảy ra.

Ngắt ngoài STM32 được mô tả như sau:

Các tham số (Main Features):

• Kích hoạt độc lập trên mỗi dòng ngắt (Line Interrupts)
• Truy cập đến từng Bit trong mỗi dòng ngắt
• Tạo ra tối đa 20 sự kiện/ngắt
• Tín hiệu phải có độ rộng xung thấp hơn chu kì xung nhịp của APB2 (vì APB2 cấp
xung cho GPIO)

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
16




4.2. Các trúc các thanh ghi ngắt của STM32F103C8T6

Ngắt ngoài của chip STM32F103 bao gồm có 16 line:


Ở đây chúng ta có thể thấy chip STM32F103C8 gồm có 16 Line ngắt riêng biệt.
Ví dụ:
• Line0 sẽ chung cho tất cả chân Px0 ở tất cả các Port, với x là tên của Port A, B…
• Line0 nếu chúng ta đã chọn chân PA0 (chân 0 ở port A) làm chân ngắt thì tất cả các chân 0
ở các Port khác không được khai báo làm chân ngắt ngoài nữa
• Line1 nếu chúng ta chọn chân PB1 là chân ngắt thì tất cả chân 1 ở các Port khác không được
khai báo làm chân ngắt nữa.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
17


4.3. Các lệnh về ngắt STM32F103

Chúng ta bắt đầu tiến hành cấu hình để dùng EXTI
(1) Chuột phải vào PC13 chọn GPIO_EXTI13
(2) Trong tab NVIC enable interrupt

Cấu hình GPIO với các bước
(1) Chọn GPIO
(2) Chuột phải vào chân PD2 chọn GPIO_Output
(3) PC13 chọn Pull-up

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
18




Sau đó Generation để sinh code.
Mở file stm32f1xx_it.c trong thư mục Core/Src.
Vì tôi dùng chân PC13 nên thuộc line EXTI15_10, các chân khác thì tìm đến line tương ứng.
Các bạn tìm đến đoạn code bên dưới :

void EXTI15_10_IRQHandler(void)

{

/* USER CODE BEGIN EXTI15_10_IRQn 0 */



/* USER CODE END EXTI15_10_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */



/* USER CODE END EXTI15_10_IRQn 1 */

}

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
19


Sau đó ctrl +click trái để trỏ tới hàm:

và tìm tới hàm Hàm xử lý ngắt
/**

* @brief EXTI line detection callbacks.

* @param GPIO_Pin: Specifies the pins connected EXTI line

* @retval None

*/

weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

{

/* EXTI line interrupt detected */

if ( HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)

{

HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);

HAL_GPIO_EXTI_Callback(GPIO_Pin);

}

}

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
20




Từ khóa weak có tác dụng nếu một hàm cùng tên được gọi mạnh hơn thì hàm này sẽ không
được gọi. Giờ chúng ta sẽ copy và chỉnh sửa như bên dưới cho chương trình chính:

*/

}
/* USER CODE BEGIN PV */

volatile int flag_blink=0;

/* USER CODE END PV */
/* Private function prototypes */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code */
/* USER CODE BEGIN 0 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
if(GPIO_Pin==GPIO_PIN_13){

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
21


flag_blink=1;

}

}

/* USER CODE END 0 */



/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */



/* USER CODE END 1 */



/* MCU Configuration */



/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();



/* USER CODE BEGIN Init */

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
22




/* USER CODE END Init */



/* Configure the system clock */

SystemClock_Config();



/* USER CODE BEGIN SysInit */



/* USER CODE END SysInit */



/* Initialize all configured peripherals */

MX_GPIO_Init();

/* USER CODE BEGIN 2 */



/* USER CODE END 2 */



/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
23




4.4. Bài tập 03
STM32F103 ĐIỀU KHIỂN ĐỘNG CƠ ENCODER DC
if(flag_blink==1){
HAL_Delay(250);
flag_blink=0;
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);

}

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
24

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
25



4.5.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
26


CHƯƠNG 5: PWM STM32

5.1. Giới thiệu về PWM STM32F103

Ở PWM STM32F103 này có 4 kênh timer là TIM1,TIM2,TIM3,TIM4 để phát PWM, mỗi
kênh đó có 4 channel nhỏ nữa, riêng TIM1 có thêm 4 channel đảo nữa. Tùy từng ứng dụng
mà có thể sử dụng phối hợp nhiều kênh cũng như nhiều channel nhỏ khác nhau. TIM1 là
timer đặc biệt tạo ra riêng để ưu tiên cho việc phát xung với nhiều mode bảo vệ cũng như
điều khiển riêng. Nó có các kênh PWM đảo vd( CH1 – CH1N) giúp tránh tình trạng trùng
dẫn với nửa cầu H trên và nửa cầu H dưới của mạch driver điều khiển động cơ. Nó có chế độ
one-pulse để xuất ra 1 xung hay nhiều xung với số xung đếm được, ngắt input để bảo vệ động
cơ, có mode hỗ trợ encoder và cảm biến Hall.

Sử dụng PWM chủ yếu là để điều khiển động cơ, khi điều khiển cần chú ý là mỗi loại động
cơ đều có cơ cấu điều khiển khác nhau, tần số điều khiển cũng khác nhau. Cần chú ý về mục
đích điều khiển là tốc độ, vị trí, moment… để xuất xung với tần số và chu kì thích hợp.

Trên STM32F103 thì cần chú ý là sử dụng PWM của timer nào thì cần tra datasheet để biết
ngõ ra của timer đó là chân nào, có Remap hay trùng với các chân đặc biệt không.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
27





5.2. Các thanh ghi PWM của STM32F103C8T6

1. TIMx_CCER – TIMx capture/compare enable register.

4 cặp bit tương ứng với 4 channel của 1 Timer. CCxE : cho phép output xung ra bên
ngoài hay không. CCxP cho phép xuất mức PWM ở mức cao hay thấp vd CC4P = 0
thì khi Duty cycle =100% thì điện áp output = 3V3, CC4P = 1 thì khi Duty cycle
=100% thì điện áp output = 0V.

2. TIMx_CCMRx- TIMx capture/compare mode register x.

• OcxM: lựa chọn mode Output cho chân PWM. Giá trị tương ứng từ 000 ->111 với
các mode như PWM1, PWM2, Frozen, Toggle...
• OCxPE: bit này cho phép bộ đếm tự động lặp lại sau khi thực hiện xong đếm lần
1.
• OcxFE: bit này sử dụng cho mode Input capture: đo tín hiệu xung đầu vào với các
xung có tần số cao.
• CCxS: bit này cho phép lựa chọn là ngõ vào hay ngõ(Capture/Compare) ra tương
ứng với các mode.
3. TIMx_CCRx – TIMx Capture/Compare register.

Nếu là mode output thì nó sẽ so sánh với thanh ghi CNT và xuất ra giá trị PWM, giá
trị được làm mới khi có update xảy ra. Nếu là mode input: nó sẽ chứa giá trị đọc về
của giá trị đọc cuối cùng.

5.3. Các lệnh về PWM của STM32F103C8T6

Trong KeilC bạn chỉ cần gọi hàm Start PWM là PWM sẽ chạy như sau:

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
28




Ta mắc kênh CH0 của bộ Analyzer vào CH1 của Timer 1 rồi đo xung nhé. Nếu bạn chưa biết
sử dụng thì hãy đọc bài : Hướng dẫn sử dụng Logic Analyzer

Nhấn Start ta sẽ đo được sóng có chu kì 100ms và duty là 25%


Muốn thay đổi Duty Cycles chúng ta gọi hàm
HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1, 50);

Với 50 là duty cần nạp vào. Sau đó nạp lại.

Đo lại kết quả sẽ được như sau:

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
29





Trong thực tế chúng ta sẽ quản lý duty bằng 1 biến, sau đó thay đổi giá trị duty nạp vào như
sau.

Khởi tạo một biến u8_Duty

Trong while(1) tăng giảm u8_Duty đó mỗi 1s một lần


Lắp thêm Led tại chân PA0( CH1 của Timer 2) và thấy rằng Led thay đổi độ sáng theo Duty
đó.

Lưu ý: Các kênh PWM của cùng 1 Timer dùng chung thanh ghi ARR và PRS vì vậy chu kì
PWM sẽ giống nhau. Chúng ta chỉ setup được Duty khác nhau mà thôi.

5.4. Bài tập 04

STM32F103 ĐIỀU KHIỂN ĐỘNG CƠ ENCODER DC

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
30

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
31

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
32

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
33


CHƯƠNG 6: NGẮT TIMER STM32

6.1. Giới thiệu Timer của STM32F103C8T6
Timer dịch đơn giản là người ghi giờ, bộ hẹn giờ.
Trong STM32F103C8 có 4 bộ Timer trong đó:

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
34


• Timer 1: Là bộ Advanced – control Timer hay là bộ Timer điều khiển nâng cao, có
nhiều chức năng nhất
• 3 bộ Timer chung là Timer 2,3,4 Có chức năng tương tự nhau và độc lập với nhau
6.2. Các thanh ghi Timer của STM32F103C8T6

Các Timer chính
TIM1: Timer 16-bit, hỗ trợ chế độ PWM và có khả năng sử dụng cho các ứng dụng điều
khiển động cơ.
TIM2: Timer 32-bit, có thể sử dụng cho các ứng dụng đếm và tạo ra các tín hiệu thời gian.
TIM3: Timer 16-bit, tương tự như TIM2 nhưng với một số tính năng bổ sung.
TIM4: Timer 16-bit, cũng có các chế độ PWM và có thể dùng để tạo ra các tín hiệu thời gian.
Các thanh ghi chính
Mỗi Timer sẽ có các thanh ghi điều khiển chính sau:
CR1 (Control Register 1): Điều khiển hoạt động của Timer.
CR2 (Control Register 2): Cấu hình các chức năng bổ sung cho Timer.
SMCR (Slave Mode Control Register): Cấu hình chế độ hoạt động của Timer.
DIER (DMA/Interrupt Enable Register): Điều khiển các ngắt và DMA liên quan đến Timer.
SR (Status Register): Trạng thái của Timer, cho biết các sự kiện đã xảy ra.
EGR (Event Generation Register): Tạo ra sự kiện để khởi động Timer.
CCMR1/CCMR2 (Capture/Compare Mode Register): Cấu hình chế độ Capture/Compare.
CCER (Capture/Compare Enable Register): Kích hoạt các kênh Capture/Compare.
CNT (Counter Register): Giá trị bộ đếm hiện tại.
PSC (Prescaler Register): Chia tỉ lệ xung nhịp vào Timer.
ARR (Auto-Reload Register): Giá trị tự động tải lại cho bộ đếm.
CCR (Capture/Compare Register): Giá trị so sánh cho các kênh Capture/Compare.
6.3. Các lệnh về timer của STM32F103C8T6

Open Project Nhấn F7 để Build Code, Trong stm32f1xx_it.c các bạn tìm đến hàm
HAL_TIM_IRQHandler(&htim2); và Goto define nó

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
35





Trong phần Define hàm đó các bạn sẽ tìm thấy hàm Call_back cho ngắt Input Capture, Go to
Define hàm đó coppy và paste vào phần tiền xử lý trên hàm main()


Trong main.c chúng ta tạo một biến chứa Giá trị đọc được từ Counter, trong hàm xử lý ngắt
ta sẽ phân luồng ngắt, đọc giá trị Capture, sau đó xóa giá trị Counter về 0.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
36





Trước While(1), chúng ta viết các hàm khởi chạy IC và OC


Build và nạp chương trình vào Kit.

Kết nối chân PA0 và chân PA6 vào nhau. (Timer 2 sẽ đọc xung từ Timer 3 truyền tới). Bật
Debug, click vào tên của biến u16_CaptureVal chọn Add to Watch 1

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
37




Nhấn Run(F5) sẽ thấy u16_CaptureVal có giá trị là 100




6.4. Bài tập 05
STM32F103 ĐIỀU KHIỂN ĐỘNG CƠ ENCODER DC

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
38

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
39

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
40







Chương 7: Đề tài ứng dụng STM32F103 tự chọn

7.1. Giới thiệu đề tài
Trong bối cảnh giao thông ngày càng phức tạp, việc quản lý và điều khiển các hệ
thống giao thông hiệu quả là rất cần thiết. Đèn giao thông đóng vai trò quan trọng
trong việc điều tiết lưu lượng xe cộ, đảm bảo an toàn cho người tham gia giao

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
41


thông. Đề tài này tập trung vào việc phát triển một hệ thống điều khiển đèn giao
thông LED sử dụng vi điều khiển STM32F103

7.2. Cơ sở lý thuyết
STM32F103 là một trong những vi điều khiển nổi bật trong dòng sản phẩm STM32
của STMicroelectronics. Nó được thiết kế dựa trên kiến trúc ARM Cortex-M3, cho
phép thực hiện các tác vụ với hiệu suất cao và tiêu thụ năng lượng thấp.
STM32F103 có nhiều tính năng, bao gồm:
• Tốc độ xử lý: Tốc độ xung nhịp lên đến 72 MHz.
• Bộ nhớ: Flash memory từ 16 KB đến 512 KB và RAM từ 20 KB đến 64 KB.
• Giao tiếp ngoại vi: Hỗ trợ nhiều giao thức như UART, I2C, SPI, GPIO
Hệ thống điều khiển đèn giao thông LED bao gồm các thành phần chính:
• Vi điều khiển (STM32F103): Là bộ não của hệ thống, thực hiện các phép
toán và điều khiển tín hiệu.
• LED: Thực hiện chức năng phát sáng để hiển thị trạng thái giao thông.
• Mạch điều khiển: Bao gồm các linh kiện điện tử như điện trở, transistor để
điều khiển nguồn cấp cho LED.
• Nguồn cung cấp: Cung cấp năng lượng cho toàn bộ hệ thống


7.3. Phương án thực hiện
7.31. Thiết kế hệ thống
1.1. Sơ đồ khối hệ thống
• Vi điều khiển STM32F103: Là bộ não của hệ thống.
• LED: Đại diện cho các tín hiệu đèn giao thông (đỏ, vàng, xanh).
• Mạch điều khiển: Bao gồm điện trở và transistor để điều khiển LED.
• Nguồn cung cấp: Cung cấp điện cho toàn bộ hệ thống.
1.2. Sơ đồ nối dây
• Kết nối chân GPIO của STM32F103 với các chân điều khiển của LED thông
qua transistor.
• Sử dụng điện trở để hạn chế dòng cho LED, đảm bảo chúng hoạt động trong
giới hạn an toàn.

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
42


7.3.2. Lập trình
2.1. Môi trường phát triển
• STM32CubeIDE: Được sử dụng để lập trình và nạp chương trình cho vi điều
khiển.
2.2. Cấu trúc chương trình
• Khởi tạo hệ thống: Cấu hình chân GPIO cho LED và các timer.
• Vòng lặp chính: Điều khiển trạng thái của LED theo chu kỳ xác định.
o Đèn đỏ: Bật trong 30 giây.
o Đèn vàng: Bật trong 5 giây.
o Đèn xanh: Bật trong 30 giây.
• Chuyển đổi giữa các trạng thái: Sử dụng hàm delay để điều khiển thời gian
hiển thị của từng đèn.
7.3.3. Kiểm tra và hiệu chỉnh
3.1. Kiểm tra chức năng
• Kiểm tra LED: Đảm bảo tất cả các LED hoạt động đúng.
• Đánh giá thời gian: Kiểm tra thời gian chuyển đổi giữa các đèn và điều
chỉnh nếu cần.
3.2. Tối ưu hóa
• Điều chỉnh thời gian: Theo dõi và thay đổi thời gian cho phù hợp với thực tế
giao thông.
• Kiểm tra độ ổn định: Đảm bảo hệ thống hoạt động liên tục và ổn định.
7.3.4. Triển khai thực tế
• Lắp đặt: Thiết lập hệ thống trong một mô hình giao thông nhỏ hoặc trong
một không gian thực tế.
• Giám sát: Theo dõi hoạt động của hệ thống và thu thập dữ liệu để phân tích
hiệu quả.

7.5. đề tài Kết quả
Hoàn thành hệ thống
Hệ thống điều khiển đèn giao thông LED sử dụng vi điều khiển STM32F103 đã
được thiết kế, đặt và lập trình thành công. Các thành phần chính của hệ thống
bao gồm:

GVHD: Ngô Thanh Đông Chuyên đề lập trình hệ thống nhúng
43


• Vi điều khiển STM32F103: Hoạt động ổn định, xử lý các tín hiệu điều
khiển.
• LED: Hoạt động đúng theo chu kỳ đã định (đỏ, vàng, xanh).
• Mạch điều khiển: Hoàn chỉnh, đảm bảo an toàn và hiệu quả.

7.6. Kết luận
• Mục tiêu chính: Ứng dụng vi điều khiển STM32F103 để thiết kế và lập trình
hệ thống điều khiển đèn giao thông sử dụng đèn LED đơn 7.6.
• Công nghệ sử dụng: STM32F103, các chân GPIO để điều khiển đèn LED,
kỹ thuật lập trình nhúng, cấu hình timer và ngắt (interrupt).
• Kết quả đạt được: Xây dựng thành công hệ thống đèn giao thông cơ bản với
ba trạng thái (xanh, vàng, đỏ) và chu kỳ điều khiển phù hợp.
• Tính khả thi: Hệ thống có chi phí thấp, dễ bảo trì, và có khả năng mở rộng
với các tính năng mới như cảm biến và điều khiển thông minh.
• Khả năng mở rộng: Có thể nâng cấp hệ thống, tích hợp IoT, và điều chỉnh tự
động dựa trên mật độ giao thông.
Đề tài đã hoàn thành mục tiêu và mở ra tiềm năng phát triển trong lĩnh vực điều
khiển giao thông thông minh.
Tags