Lập Trình Căn Bản ARM Cortex M3 STM32F103C8T6

Khám phá lập trình căn bản với ARM Cortex M3 STM32F103C8T6, từ cấu trúc đến ứng dụng thực tế, giúp nâng cao kỹ năng lập trình nhúng.

Trường đại học

Trường Đại Học

Chuyên ngành

Công Nghệ Thông Tin

Người đăng

Ẩn danh

Thể loại

bài giảng

2014

88
13
2

Phí lưu trữ

30 Point

Mục lục chi tiết

LỜI MỞ ĐẦU

1. CHƯƠNG 1: TÌM HIỂU VỀ ARM CORTEX M3 STM32F103

1.1. Giới thiệu về ARM Cortex M3 STM32F103

1.2. Đặc điểm nổi bật của STM32

1.3. Tổng quát về ARM Cortex M3 STM32F103

1.3.1. Các phiên bản cấu trúc ARM

1.3.2. Bộ xử lý và đơn vị xử lý trung tâm Cortex

1.3.3. Đơn vị xử lý trung tâm Cortex (Cortex CPU)

1.3.4. Bộ xử lý Cortex

1.3.5. Các chế độ năng lượng

1.3.6. Kiểu đóng gói chip và kiểu chân linh kiện

1.3.7. Nguồn cung cấp điện

1.4. Kiến trúc hệ thống

1.4.1. Cấu trúc bộ nhớ

1.4.2. Tối đa hiệu năng

1.5. Ngoại vi đa dụng

1.5.1. Kết nối với các giao tiếp khác

1.6. Chế độ tiêu thụ năng lượng thấp

1.6.1. Chế độ bình thường – RUN Mode

1.6.2. Các chế độ sử dụng công suất tiêu thụ thấp

1.7. Hỗ trợ Debug

1.8. Tính an toàn

1.8.1. Kiểm tra điện áp nguồn

1.8.2. Hệ thống an toàn xung nhịp

1.9. Tính năng ngoại vi

1.9.1. Lập trình và đảm bảo an toàn cho FLASH nội

1.9.2. Hoạt động xóa và ghi

2. CHƯƠNG 2: THIẾT KẾ KIT THÍ NGHIỆM ARM STM32F103

2.1. Thiết kế mạch nguyên lý

2.2. Thiết kế mạch in

3. CHƯƠNG 3: LẬP TRÌNH ỨNG DỤNG CHO KIT STM32F103

3.1. Hướng dẫn cơ bản cho một ứng dụng với KIT STM32F103

3.1.1. Các bước tạo một Project mới trên Keil C MDK

3.1.2. Nạp chương trình vào vi điều khiển

3.2. Lập trình ứng dụng

3.2.1. Nguồn Clock trong STM32

3.2.2. Tạo thư viện delay sử dụng SYSTICK trong STM32

3.2.3. Lập trình GPIO điều khiển led đơn và thư viện GPIO

3.2.5. Lập trình hiển thị Led 7 đoạn

3.2.6. Lập trình hiển thị LCD 1602

3.2.7. Giao tiếp USART với KIT STM32F103C8T6

3.2.8. Đo giá trị ADC và hiển thị LCD

3.2.9. Giao tiếp cảm biến nhiệt độ DS18B20

3.2.10. Giao tiếp I2C với IC EEPROM 24C02

4. CHƯƠNG 4: THIẾT KẾ WEB HOCARM

4.1. Giới thiệu về mã nguồn mở Nukeviet

4.2. Thiết kế giao diện website

TÀI LIỆU THAM KHẢO

Tóm tắt

I. Hướng Dẫn Tổng Quan Về Lập Trình ARM Cortex M3 STM32F103C8T6

Việc lập trình với ARM Cortex M3 STM32F103C8T6 đang trở thành xu hướng phổ biến trong lĩnh vực điện tử nhờ vào hiệu suất cao và khả năng tiêu thụ năng lượng thấp. Vi điều khiển này được thiết kế để đáp ứng nhu cầu đa dạng của các ứng dụng nhúng. Bài viết này sẽ cung cấp cái nhìn tổng quan về STM32F103C8T6, từ kiến trúc đến các ứng dụng thực tiễn.

1.1. Giới Thiệu Về ARM Cortex M3 STM32F103C8T6

ARM Cortex M3 là một bộ xử lý 32-bit, được thiết kế để tối ưu hóa hiệu suất và tiêu thụ năng lượng. STM32F103C8T6 là một trong những vi điều khiển phổ biến nhất trong dòng sản phẩm này, với khả năng xử lý mạnh mẽ và nhiều tính năng ngoại vi.

1.2. Đặc Điểm Nổi Bật Của STM32F103C8T6

Vi điều khiển STM32F103C8T6 có tốc độ lên đến 72MHz, bộ nhớ FLASH 64KB và RAM 20KB. Nó hỗ trợ nhiều giao tiếp như I2C, SPI, và USART, giúp dễ dàng kết nối với các thiết bị ngoại vi.

II. Những Thách Thức Khi Lập Trình Với STM32F103C8T6

Mặc dù STM32F103C8T6 mang lại nhiều lợi ích, nhưng lập trình với nó cũng gặp phải một số thách thức. Việc hiểu rõ kiến trúc và cách thức hoạt động của vi điều khiển là rất quan trọng để tối ưu hóa hiệu suất và giảm thiểu lỗi.

2.1. Khó Khăn Trong Việc Tối Ưu Hóa Hiệu Suất

Một trong những thách thức lớn nhất là tối ưu hóa mã nguồn để đạt được hiệu suất cao nhất. Việc sử dụng các lệnh và cấu trúc dữ liệu phù hợp là rất quan trọng để giảm thiểu thời gian xử lý.

2.2. Quản Lý Nguồn Điện Hiệu Quả

Quản lý nguồn điện là một yếu tố quan trọng trong thiết kế hệ thống. STM32F103C8T6 cung cấp nhiều chế độ tiết kiệm năng lượng, nhưng lập trình viên cần phải biết cách sử dụng chúng một cách hiệu quả.

III. Phương Pháp Lập Trình Cơ Bản Cho STM32F103C8T6

Để lập trình STM32F103C8T6, cần nắm vững các phương pháp cơ bản. Việc sử dụng các công cụ phát triển như Keil MDK và STM32CubeMX sẽ giúp đơn giản hóa quá trình lập trình và cấu hình vi điều khiển.

3.1. Cài Đặt Môi Trường Phát Triển

Cài đặt Keil MDK và STM32CubeMX là bước đầu tiên để bắt đầu lập trình. Các công cụ này cung cấp giao diện thân thiện và hỗ trợ lập trình viên trong việc tạo dự án mới.

3.2. Viết Mã Lập Trình Cơ Bản

Việc viết mã lập trình cơ bản cho STM32F103C8T6 bao gồm việc cấu hình GPIO, thiết lập các giao tiếp như USARTI2C, cũng như lập trình các chức năng cơ bản như điều khiển LED.

IV. Ứng Dụng Thực Tiễn Của STM32F103C8T6 Trong Dự Án

Việc áp dụng STM32F103C8T6 trong các dự án thực tiễn mang lại nhiều lợi ích. Từ các ứng dụng đơn giản như điều khiển LED đến các hệ thống phức tạp hơn như cảm biến và giao tiếp không dây.

4.1. Dự Án Điều Khiển LED

Một trong những ứng dụng đơn giản nhất là điều khiển LED. Việc lập trình GPIO để bật tắt LED giúp lập trình viên làm quen với các khái niệm cơ bản của STM32F103C8T6.

4.2. Giao Tiếp Với Cảm Biến

Giao tiếp với các cảm biến như DS18B20 hoặc cảm biến nhiệt độ qua I2C là một ứng dụng thực tiễn phổ biến. Điều này giúp thu thập dữ liệu và xử lý thông tin trong thời gian thực.

V. Kết Luận Về Lập Trình ARM Cortex M3 STM32F103C8T6

Lập trình với ARM Cortex M3 STM32F103C8T6 mở ra nhiều cơ hội cho các kỹ sư và lập trình viên. Với khả năng linh hoạt và hiệu suất cao, vi điều khiển này là lựa chọn lý tưởng cho nhiều ứng dụng khác nhau.

5.1. Tương Lai Của Lập Trình Vi Điều Khiển

Với sự phát triển không ngừng của công nghệ, lập trình vi điều khiển sẽ ngày càng trở nên quan trọng. STM32F103C8T6 sẽ tiếp tục là một trong những lựa chọn hàng đầu cho các dự án nhúng.

5.2. Khuyến Khích Nghiên Cứu Và Phát Triển

Khuyến khích các lập trình viên nghiên cứu và phát triển các ứng dụng mới trên nền tảng STM32F103C8T6. Việc này không chỉ nâng cao kỹ năng mà còn đóng góp vào sự phát triển của công nghệ.

27/07/2025

Trích đoạn nội dung tài liệu

CHƯƠNG I : TÌM HIỂU VỀ ARM CORTEX M3 STM32F103 Tùy chọn cung cấp năng lượng thứ hai được sử dụng để cung cấp cho ADC. Nếu ADC được sử dụng, nguồn điện chính VDD được giới hạn trong phạm vi 2. Đối với chip đóng gói 100 chân, khối ADC có thêm chân điện áp tham khảo VREF+ và VREF-. Chân VREF- phải được kết nối với VDDA và VREF+ có thể thay đổi từ 2,4V đến VDDA.

Tất cả các kiểu đóng gói chíp còn lại thì điện áp tham khảo được kết nối bên trong với các chân cung cấp điện áp ADC. Mỗi nguồn cung cấp năng lượng cần một tụ chống nhiễu đi kèm. Cách bố trí tụ chống nhiễu cho STM32 1.8 Mạch Reset STM32 chứa một mạch reset nội, mạch này giữ cho chip ở trạng thái reset cho tới khi nào VDD vẫn còn dưới mức 2. Đặc tính của mạch reset bên trong STM32 Bộ POR (Power On Reset) và PDR (Power Down Reset) đảm bảo xử lý chỉ chạy với một nguồn cấp điện ổn định, và không cần bất kì một mạch reset bên ngoài.

Một mạch reset bên ngoài không cần thiết trong thiết kế của STM32. Tuy nhiên, trong quá trình phát triển chân nRST có thể được kết nối với một nút reset đơn giản, đồng thời chân nRST cũng được kết nối đến cổng JTAG, để công cụ phát triển có thể tạo ra tín hiệu reset vi điều khiển.3 Kiến trúc hệ thống STM32 gồm nhân Cortex kết nối với bộ nhớ FLASH thông qua đường bus lệnh chuyên biệt. Các bus dữ liệu(Cortex Data busses) và hệ thống(Cortex System busses) được kết nối tới ma trận busses tốc độ cao( ARM Advanced High Speed Busses- AHB). Nguyễn Ngọc Hà hanguyen92205@gmail.com Trang 13 CHƯƠNG I : TÌM HIỂU VỀ ARM CORTEX M3 STM32F103 Hình 1.

Cấu trúc Bus Cấu trúc bus nội cung cấp đường truyền chuyên biệt dành cho tập lệnh thực thi và ma trận bus đường dữ liệu cho nhân Cortex and bộ điều khiển DMA truy cập tài nguyên trên vi xử lý.1 Cấu trúc bộ nhớ Hình 1. Vùng nhớ Flash trên STM32 Vùng nhớ dành cho flash được chia nhỏ thành 3 vùng. Vùng thứ nhất gọi là User Flash bắt đầu từ địa chỉ 0x00000000. Kế tiếp là System Memory hay còn gọi là vùng nhớ lớn.

Vùng này có độ lớn 4Kbytes thông thường sẽ được nhà sản xuất cài đặt bootloader. Cuối cùng là vùng nhớ nhỏ bắt đầu từ địa chỉ 0x1FFFFF80 chứa thông tin cấu hình dành cho STM32. Bootloader thường được dùng để tải chương trình thông qua USART1 và chứa ở vùng User Flash.2 Tối đa hiệu năng Ngoài việc hỗ trợ 2 bộ tạo xung nhịp ngoại STM32 cung cấp thêm 2 bộ tạo xung nhịp nội. Sau khi reset đồng hồ tạo xung của nhân Cortex, bộ tạo xung nhịp tốc độ cao( High Speed Internal Oscillator) hoạt động ở mức thấp 8MHz.

Bộ tạo xung nội còn lại là Low Speed Internal Oscillator hoạt động ở mức 32768KHz. Nguyễn Ngọc Hà hanguyen92205@gmail.com Trang 14 CHƯƠNG I : TÌM HIỂU VỀ ARM CORTEX M3 STM32F103 Hình 1.17 STM32 bao gồm 2 bộ tạo xung nhịp nội và 2 bộ tạo xung nhịp ngoại thêm vào đó là bộ vòng khóa pha( Phase Lock Loop -PLL). Nhân Cortex có thể được cấp xung nhịp từ bộ tạo dao động nội và ngoại, đồng thời từ PLL nội. Có một vấn đề là đối với bộ tạo dao động nội tốc độ cao xung nhịp không hoạt động chính xác ở 8MHz do đó khi sử dụng các thiết bị ngoại vi như: giao tiếp serial hay sử dụng định thời thời gian thực thì nên dùng bộ tạo dao động ngoại tốc độ cao.

Tuy vậy, cho dù sử dụng bộ dao động nào đi nữa thì nhân Cortex luôn phải sử dụng xung nhịp tạo ra từ bộ PLL. Tất cả thanh ghi điều khiển PLL và cấu hình bus đều được bố trí ở nhóm RCC ( Reset and Clock Control). Vòng khóa pha ( Phase Lock Loop ) Sau khi hệ thống reset STM32 nhận xung nhịp từ bộ tạo dao động HIS. Tại thời điểm đó các bộ tạo dao động ngoại sẽ bị tắt.

Bước đầu tiên để STM32 hoạt động ở mức xung nhịp cao nhất là bật bộ tạo dao động HSE và chờ cho đến khi đi vào hoạt động ổn định. Bộ tạo dao động ngoại có thể được kích hoạt thông qua các thanh ghi điều khiển RCC_Control. Sẽ có 1 bit trạng thái được bật khi chúng đi vào hoạt động ổn định. Một khi bộ tạo dao động ngoại hoạt động ổn đinh, nó có thể được chọn là đầu vào cho bộ PLL.

Xung nhịp ra được tạo bởi PLL được xác định bằng cách thiết lập các bội số nguyên trong thanh ghi cấu hình RCC_PLL. Trong trường hợp xung nhịp đầu vào của PLL là 8MHz khi đó cần cấu hình bội số nhân cho PLL là 9 để tạo xung nhịp 72MHz ở đầu ra. Đoạn mã cấu hình STM32 sử dụng dao động từ PLL //HSE clock, PLLx9 RCC->CFGR = 0x001D0000; //Enable PLL RCC->CR |= 0x01000000; While( !(RCC->CR & 0x02000000)); //Set the remaining control fields RCC->CR |= 0x00000001; //Set the remaining configuration fields RCC->CFGR |= 0x005D0402; - Cấu hình cho bus Nguyễn Ngọc Hà hanguyen92205@gmail.com Trang 15 CHƯƠNG I : TÌM HIỂU VỀ ARM CORTEX M3 STM32F103 Khi PLL đã được chọn là bộ tạo dao động cho hệ thống, Cortex CPU sẽ hoạt động ở mức 72MHz. Để cho toàn bộ các phần còn lại của hệ thống hoạt động ở mức tối ưu người dùng cần phải cấu hình AHB và APB thông qua các thanh ghi cầu nối.

//Enable clocks to the AHB,APB1 and APB2 busses AHBENR = 0x00000014; RCC->APB2ENR = 0x00005E7D; RCC->APB1ENR = 0x1AE64807; //Release peripheral reset line on APB1 and APB2 buses RCC->APB2RSTR = 0x00000000; RCC->APB1RSTR = 0x00000000; - Flash Buffer Khi xem xét kiến trúc hệ thống của STM32 chúng ta có thể thấy nhân Cortex kết nối với Flash thông qua đường dữ liệu chuyên biệt I -Bus. Bus dữ liệu này hoạt động cùng tần số với CPU, do vậy nếu CPU lấy dao động từ PLL thì bus dữ liệu sẽ hoạt động ở mức xung nhịp cao nhất 72Mhz. Cortex CPU sẽ truy cập vào Flash cứ mỗi 1. Khi mới hoạt động, nhân STM32 sử dụng bộ tạo dao động nội, do đó thời gian truy cập Flash là không đáng kể.

- Direct Memory Access Mặc dù có thể sử dụng chính nhân Cortex để trao đổi dữ liệu giữa các thiết bị ngoại vi và SRAM nội, tuy nhiên chúng ta có thể hoàn toàn sử dụng cơ chế tự động cho việc này với bộ quản lý DMA. STM32 có 7 kênh DMA độc lập dùng để chuyển dữ liệu từ: bộ nhớ sang bộ nhớ, ngoại vi tới bộ nhớ, bộ nhớ tới ngoại vi và ngoại vi tới ngoại vi.18 Mỗi thao tác bộ nhớ DMA bao gồm 4 giai đoạn. Quá trình truyền dữ liệu gồm 4 giai đoạn: lấy mẫu và phân xử, tính toán địa chỉ, truy cập đường truyền, và cuối cùng là hoàn tất.19 Bộ DMA được thiết kế cho truyền dữ liệu tốc độ và kích thước nhỏ. Nguyễn Ngọc Hà hanguyen92205@gmail.com Trang 16 CHƯƠNG I : TÌM HIỂU VỀ ARM CORTEX M3 STM32F103 Bộ DMA chỉ sử dụng bus dữ liệu khi ở giai đoạn truy cập đường truyền.

Bộ DMA có thể thực hiên việc phân xử tài nguyên và tính toán địa chỉ trong khi bộ DMA khác đang ở giai đoạn truy cập đường truỳên như mô tả ở hình trên. Ngay khi bộ DMA thứ nhất kết thúc việc truy cập đường truyền, bộ DMA 2 có thể ngay lập tức sử dụng đường truỳên dữ liệu.20 Ở giai đoạn Bus Access CPU sẽ có 3 chu kỳ rảnh. Trong trường hợp trao đổi dữ liệu từ vùng nhớ sang vùng nhớ mỗi kênh DMA chỉ sử dụng đường truyền dữ liệu ở giai đoạn Bus Access và 5 chu kỳ CPU để chuyển 2 bytes dữ liệu. Trong đó 1 chu kỳ để đọc và 1 chu kỳ để ghi, 3 chu kỳ còn lại được bố trí xen kẽ nhằm giải phóng đường dữ liệu cho nhân Cortex.

Điều đó có nghĩa là bộ DMA chỉ sử dụng tối đa 40% băng thông của đường dữ liệu. Việc sử dụng DMA rất đơn giản. Đầu tiên là kích hoạt đồng hồ xung nhịp RCC->AHBENR |= 0x00000001; //enable DMA clock Mỗi kênh DMA có thể được gắn với một mức ưu tiên: rất cao, cao, trung bình và thấp. Có ba loại ngắt hỗ trợ cho DMA: hoàn thành chuyển dữ liệu, hoàn thành một nửa, và lỗi.

Sau khi cấu hình hoàn tất, chúng ta kích hoạt Channel Enable Bit để thực hiện quá trình chuyển dữ liệu Hình 1.21 Mỗi kênh DMA được gán với ngoại vi nhất định. Khi được kích hoạt, các thiết bị ngoại vi sẽ điều khiển bộ DMA tương ứng. Nguyễn Ngọc Hà hanguyen92205@gmail.com Trang 17 CHƯƠNG I : TÌM HIỂU VỀ ARM CORTEX M3 STM32F103 Kiểu truyền dữ liệu từ bộ nhớ sang bộ nhớ thường hay được dùng để khởi tạo vùng nhớ, hay chép các vùng dữ liệu lớn. Phần lớn tác vụ DMA hay được sử dụng để chuyển dữ liệu giữa ngoại vi và vùng nhớ.4 Các ngoại vi Phần này sẽ giới thiệu các thiết bị ngoại vi trên các phiên bản STM32.

Để tiện theo dõi, chúng tôi chia ra thành 2 loại: ngoại vi đa dụng và ngoại vi giao tiếp. Tất cả ngoại vi trên STM32 được thiết kế và dựa trên bộ DMA. Mỗi ngoại vi đều có phần điều khiển mở rộng nhằm tiết kiệm thời gian xử lý của CPU 1.1 Ngoại vi đa dụng Ngoại vi đa dụng trên STM32 bao gồm: các cổng I/O đa dụng, bộ điều khiển ngắt ngoại, bộ chuyển đổi ADC, bộ điều khiển thời gian đa dụng và mở rộng, đồng hồ thời gian thực, và chân “tamper”. Các cổng I/O đa dụng STM32 có 5 cổng I/O đa dụng với 80 chân điều khiển.

Các cổng I/O được đánh số từ A ->E và mức áp tiêu thụ ở 5V. Nhiều chân ngoại có thể được cấu hình như là Input/Output tương tác với các thiết bị ngoại vi riêng của người dùng như USART hay I2C. Thêm nữa có thể cấu hình các chân này như là nguồn ngắt ngoại kết hợp với cổng GPIO khác. Mỗi cổng GPIO đều có 2 thanh ghi 32 -bit điều khiển.

Như vậy ta có 64-bit để cấu hình 16 chân của một cổng GPIO. Như vậy mỗi chân của cổng GPIO sẽ có 4 bit để điều khiển: 2 bit sẽ quy định hướng ra vào dữ liệu: input hay output, 2 bit còn lại sẽ quy định đặc tính dữ liệu. Sau khi cổng được cấu hình, ta có thể bảo vệ các thông số cấu hình bằng cách kích hoạt thanh ghi bảo vệ. Trong thanh ghi này, mỗi chân trong cổng đều có một bit bảo vệ tương ứng để tránh các thay đổi vô ý ở các 4 bit cấu hình.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ