TỔNG QUAN VỀ CORTEX
Các phiên bản kiến trúc ARM
Hinh 1.1.Các phiên bản kiến trúc của lõi ARM
Tính đến nay, phiên bản kiến trúc lõi ARM mới nhất là ARMv7, kế tiếp các phiên bản trước đó như ARMv4, ARMv5 và ARMv6 Bộ xử lý Cortex-M3 được xây dựng dựa trên kiến trúc ARMv7 M, cho phép thực hiện tập lệnh Thumb-2.
Bộ xử lí Cortex và đơn vị xử lí trung tâm Cortex
Bộ xử lý Cortex-M3 là một phần quan trọng trong kiến trúc vi xử lý ARM, với thuật ngữ "bộ xử lý Cortex" và "đơn vị xử lý trung tâm Cortex" được sử dụng để phân biệt giữa lõi Cortex hoàn chỉnh và bộ xử lý RISC nội bộ.
Đơn vị xử lí trung tâm Cortex (Cortex CPU)
Bộ xử lý Cortex được trang bị CPU RISC 32-bit, với phiên bản đơn giản hóa từ mô hình lập trình của ARM7/9 Nó sở hữu tập lệnh phong phú hơn, hỗ trợ tốt cho các phép toán số nguyên, khả năng thao tác với bit vượt trội và đáp ứng thời gian thực hiệu quả hơn.
1.3.1 Kiến trúc đường ống (Pipline)
CPU Cortex có khả năng thực thi hầu hết các lệnh trong một chu kỳ đơn nhờ vào cấu trúc đường ống ba tầng, tương tự như CPU ARM7 và ARM9 Đặc biệt, Cortex-M3 còn có tính năng dự đoán nhánh, giúp giảm thiểu số lần làm rỗng đường ống, tối ưu hóa hiệu suất xử lý.
Hinh 1.3 Kiến trúc đường ống của ARM Cortex-M3
1.3.2 Mô hình lập trình (Programmer’s model)
CPU Cortex là bộ xử lý dựa trên kiến trúc RISC, hỗ trợ kiến trúc nạp và lưu trữ Để thực hiện lệnh xử lý dữ liệu, các toán hạng được nạp vào thanh ghi trung tâm, phép tính được thực hiện trên các thanh ghi này, và kết quả được lưu trữ trong bộ nhớ.
Hinh 1.4 Kiến trúc load và store của ARM Cortex-M3
Tập thanh ghi này bao gồm mười sáu thanh ghi 32-bit
Các thanh ghi R0-R12 là các thanh ghi đơn giản, có thể được dùng để chứa các biến của chương trình
Thanh ghi R13 được dùng như là con trỏ ngăn xếp (stack pointer) Trong CPU Cortex có hai ngăn xếp được gọi là main stack và process stack
Thanh ghi R14, hay còn gọi là thanh ghi liên kết, được sử dụng để lưu trữ địa chỉ trở về trong quá trình gọi thủ tục Điều này giúp CPU Cortex thực hiện nhanh chóng việc nhập và thoát khỏi một thủ tục, tối ưu hóa hiệu suất xử lý.
Thanh ghi R15là bộđếm chương trình (Program Counter)
Hinh 1.5 Mô hình lập trình của ARM Cortex-M3
Ngoài thanh ghi trung tâm, CPU Cortex còn có một thanh ghi quan trọng gọi là thanh ghi trạng thái chương trình (XPSR) Thanh ghi này chứa nhiều vùng chức năng thiết yếu, ảnh hưởng trực tiếp đến quá trình thực thi của CPU.
Hinh 1.6 Thanh ghi trạng thái chương trình của CPU Cortex
Năm bit đầu là những cờ mã điều kiện và được gán biệt hiệu (aliased) như thanh ghi trạng thái chương trình ứng dụng Bốn cờ N, Z, C,
Các bit V (Negative, Zero, Carry và Overflow) sẽ được thiết lập hoặc xóa dựa trên kết quả của lệnh xử lý dữ liệu Bit Q được sử dụng trong các lệnh toán học DPS để chỉ ra rằng một biến đã đạt đến giá trị tối đa hoặc tối thiểu của nó.
Giống như tập lệnh ARM32-bit, các lệnh Thumb-2 chỉ được thực hiện khi mã điều kiện phù hợp với trạng thái của các cờ trong thanh ghi trạng thái chương trình ứng dụng Nếu mã điều kiện không phù hợp, lệnh sẽ đi ngang qua đường ống như một lệnh NOP, không thực hiện bất kỳ thao tác nào Điều này giúp đảm bảo rằng các lệnh đi qua đường ống một cách trơn tru và giảm thiểu tình trạng làm rỗng đường ống.
1.3.3 Các chế độ hoạt động của CPU
Bộ xử lý Cortex hoạt động với hai chế độ chính: chế độ Thread và chế độ Handler Khi CPU thực hiện các tác vụ nền mà không có ngắt, nó hoạt động ở chế độ Thread, trong khi đó, chế độ Handler được kích hoạt khi xử lý các ngắt đặc biệt CPU Cortex có khả năng thực thi mã trong cả chế độ đặc quyền và không đặc quyền; trong chế độ đặc quyền, CPU có quyền truy cập vào tất cả các lệnh, trong khi chế độ không đặc quyền hạn chế một số lệnh như MRS và MSR, cũng như việc truy cập vào các thanh ghi điều khiển hệ thống Cách sử dụng ngăn xếp cũng có thể được cấu hình, với ngăn xếp chính (main stack-R13) phục vụ cho cả hai chế độ Thread và Handler, trong khi chế độ Handler có thể sử dụng ngăn xếp quá trình (process stack-R13 banked register).
Hình 1.7.Mô hình hoạt động của chế độ Thread và Handler
Sau khi khởi động lại, bộ xử lý Cortex hoạt động trong cấu hình phẳng, cho phép cả hai chế độ Thread và Handler chạy trong chế độ đặc quyền mà không bị giới hạn quyền truy cập vào tài nguyên bộ xử lý Cả hai chế độ này đều sử dụng ngăn xếp chính.
Các CPU ARM7 và ARM9 có thể thực thi hai tập lệnh: ARM 32-bit và
Thumb 16-bit Điều này cho phép người phát triển để tối ưu hoá chương trình của mình bằng cách lựa chọn tập lệnh nào được sử dụng cho thủ tục khác nhau: lệnh 32-bit để tăng tốc độ xử lí và lệnh 16-bit để nén mã chương trình CPU Cortex được thiết kế để thực thi tập lệnh Thumb-2, là một sự pha trộn của lệnh 16-bit và 32-bit Tập lệnh thumb-2 cải tiến 26% mật độ mã so với tập lệnh ARM 32-bit và 25% hiệu suất so với tập lệnh Thumb 16-bit Tập lệnh Thumb2 có một số lệnh nhân được cải tiến, có thể thực hiện trong một chu kì đơn và khả năng thực hiện phép chia bằng phần cứng và chỉ mất từ 2-
The benchmark performance of the Cortex processor is 1.25 DMIPS/MHz, surpassing that of the ARM7, which achieves 0.95 DMIPS/MHz with the ARM instruction set and 0.74 DMIPS/MHz with the Thumb instruction set, as well as the ARM9.
1.3.5 Bản đồ bộ nhớ (Memory Map)
Bộ xử lý Cortex-M3 là một lõi vi điều khiển tiêu chuẩn hóa với bản đồ bộ nhớ được xác định, cung cấp không gian địa chỉ tuyến tính 4 Gbyte Mặc dù có nhiều bus nội, bản đồ bộ nhớ này là chung cho tất cả các thiết bị dựa trên lõi Cortex.
Hình 1.9.Bản đồ bộ nhớ tuyến tính 4Gbyte của bộ xử lý Cortex-M3
Bộ nhớ 1 Gbyte đầu tiên được chia thành vùng mã và vùng SRAM, với không gian mã tối ưu hóa cho bus I-Code, trong khi SRAM kết nối với bus D-Code Mặc dù mã có thể nạp và thực thi từ SRAM, nhưng việc lấy lệnh qua bus hệ thống dẫn đến trạng thái chờ, khiến mã chạy trên SRAM chậm hơn so với từ bộ nhớ Flash trên chip Vùng 0,5 Gbyte tiếp theo chứa các thiết bị ngoại vi trên chip, trong khi 1 Mbyte đầu tiên bao gồm cả SRAM và vùng ngoại vi được định địa chỉ theo bit thông qua kỹ thuật dải bit, cho phép thao tác theo word-wide hoặc bitwise Không gian địa chỉ 2 Gbyte tiếp theo được phân cho bộ nhớ ngoài và thiết bị ngoại vi, trong khi vùng 0,5 Gbyte cuối cùng dành cho các thiết bị ngoại vi bên trong của bộ xử lý Cortex và khu vực cho các cải tiến tương lai Tất cả các thanh ghi của bộ xử lý Cortex được đặt cố định, giúp mã chương trình dễ dàng chuyển đổi giữa các biến thể STM32 và các vi điều khiển khác dựa trên lõi Cortex.
1.3.6 Truy cập bộ nhớ không xếp hàng (Unaligned Memory Accesses)
Tập lệnh ARM7 và ARM9 hỗ trợ truy cập các biến có dấu và không dấu với kích thước byte, half word (2 byte) và word (4 byte), giúp CPU làm việc với số nguyên mà không cần thư viện phần mềm hỗ trợ, điều này khác với vi điều khiển 8 và 16-bit Tuy nhiên, các phiên bản CPU ARM trước đó chỉ truy cập được dữ liệu kích thước word hoặc half word, dẫn đến việc trình liên kết của trình biên dịch không tối ưu hóa được việc đóng gói dữ liệu vào SRAM, gây lãng phí lên đến 25% tùy thuộc vào sự kết hợp của các biến Bộ xử lý Cortex-M3 cải thiện tình hình bằng cách cho phép truy cập bộ nhớ không xếp hàng, đảm bảo sử dụng SRAM hiệu quả hơn.
Hình 1.10.Khả năng truy cập bộ nhớ không xếp hàng của bộ xử lý Cortex-M3 so với các phiên bản CPU ARM trước đó
CPU Cortex hỗ trợ các chế độ định địa chỉ cho word, half word và byte, cho phép truy cập bộ nhớ không xếp hàng (unaligned memory) Điều này giúp trình liên kết của trình biên dịch linh hoạt hơn trong việc sắp xếp dữ liệu chương trình trong bộ nhớ Thêm vào đó, tính năng dải bit (bit banding) được tích hợp vào CPU Cortex cho phép đóng gói các cờ chương trình vào một biến word hoặc half-word, thay vì sử dụng một byte cho mỗi cờ.
Bộ xử lí Cortex
Bộ xử lí Cortex được tạo thành từ CPU Cortex kết hợp với nhiều thiết bị ngoại vi như Bus, system timer…
Bộ vi xử lý Cortex-M3 sử dụng kiến trúc Harvard với hai bus riêng biệt là Icode và Dcode để truy cập mã và dữ liệu trong phạm vi bộ nhớ từ 0x00000000 đến 0x1FFFFFFF Ngoài ra, một bus hệ thống bổ sung cho phép truy cập không gian điều khiển hệ thống Cortex trong các khoảng từ 0x20000000 đến 0xDFFFFFFF và 0xE0100000 đến 0xFFFFFFFF Hệ thống gỡ lỗi trên chip của Cortex còn có một bus ngoại vi riêng biệt.
Bus hệ thống và bus dữ liệu kết nối với vi điều khiển thông qua các bus tốc độ cao sắp xếp theo ma trận, cho phép nhiều đường dẫn song song giữa bus Cortex và các bus chủ khác như DMA Khi hai bus chủ, chẳng hạn như CPU Cortex và kênh DMA, cùng truy cập một thiết bị ngoại vi, bộ phân xử nội sẽ giải quyết xung đột, ưu tiên truy cập cho bus có mức ưu tiên cao nhất Trong STM32, khối DMA được thiết kế để hoạt động hài hòa với CPU Cortex.
1.4.3 Timer hệ thống (System timer)
Lõi Cortex được trang bị bộ đếm xuống 24-bit với tính năng tự động nạp lại và tạo sự kiện ngắt khi giá trị bộ đếm đạt zero, nhằm cung cấp một bộ đếm thời gian chuẩn cho các vi điều khiển dựa trên Cortex Đồng hồ SysTick đóng vai trò quan trọng trong việc cung cấp nhịp đập hệ thống cho RTOS hoặc tạo ngắt chu kỳ cho các tác vụ lập lịch Thanh ghi trạng thái và điều khiển của SysTick trong không gian điều khiển hệ thống Cortex-M3 cho phép lựa chọn nguồn xung clock cho SysTick Khi thiết lập bit CLKSOURCE, SysTick hoạt động với tần số tương đương tần số của CPU; nếu bit này bị xóa, SysTick sẽ chạy với tần số bằng 1/8 tần số CPU.
Đồng hồ SysTick bao gồm ba thanh ghi: giá trị hiện tại, giá trị tải và thanh ghi trạng thái điều khiển Để hoạt động hiệu quả, giá trị hiện tại và giá trị tải cần được khởi tạo với chu kỳ đếm Thanh ghi trạng thái và điều khiển có hai bit quan trọng: ENABLE bit để bắt đầu bộ đếm thời gian và TICKINT bit để cho phép tín hiệu ngắt.
1.4.4 Xử lí ngắt (Interrupt Handling)
Một trong những cải tiến đáng chú ý của lõi Cortex so với các CPU ARM trước đó là cấu trúc ngắt và khả năng xử lý các ngắt ngoại lệ.
1.4.5 Bộ điều khiển vector ngắt lồng nhau (Nested Vector Interrupt Controller)
NVIC (Bộ điều khiển ngắt lồng nhau) là một thành phần tiêu chuẩn trong lõi Cortex, đảm bảo rằng tất cả các vi điều khiển dựa trên lõi này đều có cấu trúc ngắt đồng nhất, không phân biệt nhà sản xuất chip như ST, Atmel, Luminary hay NXP.
Hình 1.14 Cấu trúc của NVIC trong bộ xử lí Cortex
NVIC được thiết kế với độ trễ đáp ứng ngắt rất thấp, nhờ vào đặc điểm của bộ NVIC và tập lệnh Thumb-2 Điều này cho phép thực thi các lệnh nhiều chu kỳ như lệnh tải và lưu trữ nhiều dữ liệu có thể bị ngắt trong quá trình thực thi Do đó, độ trễ khi đáp ứng ngắt được xác định rõ ràng, cùng với nhiều tính năng xử lý ngắt tiên tiến, NVIC hỗ trợ hiệu quả cho các ứng dụng thời gian thực.
Như tên gọi của nó,NVIC được thiết kế để hỗ trợ các ngắt lồng nhau (nested interrupts) và trênSTM32 có16 cấp độ ưu tiên ngắt
NVIC là một đơn vị tiêu chuẩn trong lõi Cortex, giúp duy trì số bóng bán dẫn ở mức tối thiểu Nó có khả năng cấu hình số đường tín hiệu ngắt vào NVIC khi vi điều khiển được thiết kế, bao gồm một ngắt không che mặt nạ và hơn 240 đường tín hiệu ngắt bên ngoài kết nối với ngoại vi người dùng Bên cạnh đó, còn có 15 nguồn ngắt bên trong lõi Cortex, phục vụ cho việc xử lý các ngắt nội ngoại lệ trong lõi này.
Bộ NVIC của STM32 được tổng hợp với tối đa là 43 đường ngắt che mặt nạ (maskable interrupt lines)
1.4.5.1 Nhập và thoát khỏi một ngoại lệ của NVIC (NVIC Operation
Khi một ngắt được kích hoạt bởi thiết bị ngoại vi, NVIC sẽ khởi động CPU Cortex để xử lý ngắt CPU Cortex sẽ chuyển sang chế độ ngắt và tự động lưu trữ một tập hợp các thanh ghi vào ngăn xếp, nhờ vào vi chương trình mà không cần thêm lệnh trong mã ứng dụng Trong quá trình lưu trữ khung ngăn xếp, địa chỉ bắt đầu của trình dịch vụ ngắt được truy xuất từ bus Icode Thời gian từ khi ngắt xảy ra đến khi lệnh đầu tiên của trình dịch vụ ngắt được thực thi chỉ mất 12 chu kỳ.
Hình 1.15 Stack frame trong chế độ ngắt
Khi quá trình phục vụ ngắt kết thúc, khung ngăn xếp sẽ được khôi phục tự động bởi vi chương trình, đồng thời địa chỉ trở về cũng được lấy về Nhờ đó, chương trình nền có thể tiếp tục thực hiện chỉ sau 12 chu kỳ.
Hình 1.16 Đáp ứng thời gian khi một ngắt bất kì xảy ra của Cortex-M3
1.4.5.2 Các chế độ xử lí ngắt cao cấp (Advanced Interrupt Handling Modes)
NVIC được thiết kế để xử lý nhanh chóng và hiệu quả nhiều ngắt trong các ứng dụng yêu cầu khắt khe về thời gian thực Với các phương pháp xử lý thông minh, NVIC đảm bảo độ trễ giữa các ngắt ở mức tối thiểu, ưu tiên phục vụ các ngắt có mức ưu tiên cao nhất trước.
1.4.5.2.1 Quyền ưu tiên ngắt (Interrupt Pre-emption)
NVIC được thiết kế nhằm cho phép các ngắt có mức ưu tiên cao chiếm quyền ưu tiên (pre-empt) so với các ngắt có mức ưu tiên thấp hơn đang được xử lý.
1.4.5.2.2 Kỹ thuật Tail Chaining trong NVIC
Khi một ngắt có mức ưu tiên cao đang hoạt động và một ngắt có mức ưu tiên thấp hơn cũng được kích hoạt, NVIC áp dụng phương pháp Tail Chaining để giảm thiểu thời gian trễ giữa các lần phục vụ ngắt Nếu có hai ngắt được kích hoạt, ngắt có mức ưu tiên cao nhất sẽ được phục vụ trước và quá trình phục vụ sẽ bắt đầu sau 12 chu kỳ xung nhịp Tuy nhiên, khi hoàn tất việc phục vụ ngắt, CPU Cortex không trở về chương trình ứng dụng nền; do đó, stack frame của ngắt này không được khôi phục, mà chỉ địa chỉ của hàm phục vụ ngắt có mức ưu tiên cao nhất tiếp theo được lấy về.
Cortex-M3 cho phép xử lý hai ngắt đồng thời chỉ trong 6 chu kỳ xung nhịp, sau đó trình phục vụ ngắt tiếp theo có thể bắt đầu Khi tất cả các ngắt đã được xử lý, ngăn xếp được khôi phục và chương trình ứng dụng nền có thể tiếp tục thực thi trong 12 chu kỳ xung nhịp Nếu một ngắt có mức ưu tiên thấp xảy ra trong khi một ngắt khác đang chuẩn bị thoát, thao tác POP sẽ bị bỏ qua, và con trỏ stack sẽ quay về giá trị ban đầu để lưu trữ stack frame của ngắt mới Điều này gây ra độ trễ từ 7-18 chu kỳ xung nhịp trước khi trình phục vụ ngắt mới có thể thực hiện.
Hình 1.18 Đáp ứng thời gian khi hai ngắt xảy ra lần lượt của Cortex-M3
Trong hệ thống thời gian thực, khi một ngắt ưu tiên thấp đang được phục vụ và một ngắt có mức ưu tiên cao hơn xuất hiện, NVIC sẽ chuyển sang phục vụ ngắt ưu tiên cao hơn Quá trình PUSH dữ liệu lên ngăn xếp sẽ tiếp tục trong ít nhất 6 chu kỳ xung nhịp cho đến khi địa chỉ của ISR mới được lấy về.
Các chế độ năng lượng
CPU Cortex có chế độ ngủ (sleep mode) giúp giảm năng lượng tiêu thụ bằng cách đưa lõi Cortex vào trạng thái tiết kiệm năng lượng và ngừng thực hiện các lệnh Trong khi đó, một phần nhỏ của NVIC vẫn hoạt động, cho phép các ngắt từ thiết bị ngoại vi của STM32 có thể đánh thức lõi Cortex khi cần thiết.
1.5.1 Cách đi vào chế độ năng lƣợng thấp của CPU Cortex
Lõi Cortex có thể chuyển sang chế độ ngủ thông qua lệnh WFI (Wait For Interrupt) hoặc WFE (Wait For Event) Khi thực hiện lệnh WFI, lõi sẽ xử lý ngắt đang chờ Sau khi trình phục vụ ngắt (ISR) hoàn tất, CPU Cortex có thể tiếp tục thực hiện chương trình ứng dụng hoặc tự động đi vào chế độ ngủ nếu bit SLEEPON EXIT được đặt trong thanh ghi điều khiển hệ thống Điều này cho phép hệ thống hoạt động ở chế độ năng lượng thấp, chỉ thức dậy khi có sự kiện từ ngắt, nhờ đó giúp quản lý hiệu quả năng lượng với mã chương trình tối thiểu.
Ngắt WFE cho phép lõi Cortex tiếp tục thực hiện chương trình từ điểm đã đặt vào chế độ sleep mà không cần nhảy đến một trình phục vụ nào Sự kiện đánh thức chỉ đến từ thiết bị ngoại vi, cho phép chúng báo để đánh thức lõi Cortex mà không cần trình phục vụ ngắt Mặc dù các lệnh WFI và WFE không thể gọi trực tiếp từ ngôn ngữ C, nhưng trình biên dịch cho tập lệnh Thumb-2 cung cấp các macro để sử dụng như lệnh C chuẩn.
Ngoài các chế độ năng lượng thấp SLEEPNOW và SLEEPONEXIT, lõi Cortex còn có khả năng phát tín hiệu SLEEPDEEP cho toàn bộ hệ thống vi điều khiển.
Thanh ghi điều khiển hệ thống cho phép cấu hình các chế độ ngủ của vi xử lý Cortex, giúp các khối chức năng như PLL và thiết bị ngoại vi ngừng hoạt động, từ đó cho phép STM32 chuyển vào chế độ năng lượng thấp nhất.
1.5.2 Khối hỗ trợ gỡ lỗi CoreSight
Tất cả các CPU ARM đều tích hợp hệ thống gỡ lỗi ngay trên chip, với CPU ARM7 và ARM9 trang bị ít nhất một cổng JTAG cho phép kết nối công cụ gỡ lỗi chuẩn để tải chương trình vào bộ nhớ RAM hoặc Flash Cổng JTAG hỗ trợ điều khiển động cơ bản như chạy từng bước và thiết lập breakpoint, đồng thời cho phép xem nội dung bộ nhớ Ngoài ra, CPU ARM7 và ARM9 còn cung cấp bộ theo dõi thời gian thực (ETM) thông qua thiết bị gỡ lỗi ngoại vi Tuy nhiên, hệ thống gỡ lỗi này có một số hạn chế, như JTAG chỉ cung cấp thông tin khi CPU dừng lại, không hỗ trợ cập nhật thời gian thực, và số lượng breakpoint phần cứng bị giới hạn chỉ hai điểm Mặc dù ARM7 và ARM9 hỗ trợ lệnh breakpoint có thể chèn vào mã qua công cụ phát triển, ETM lại yêu cầu chi phí bổ sung từ nhà sản xuất.
Do vậy ETM không phải lúc nào cũng được hỗ trợ Với lõi Cortex mới, toàn bộ hệ thống gỡ lỗi gọi là CoreSight đã được giới thiệu
The Cortex CoreSight debugging system utilizes JTAG or Serial Wire Debug (SWD) interfaces, offering control and monitoring capabilities Notably, it can operate even when the STM32 is in a low-power mode, marking a significant advancement in JTAG debugging standards.
Hệ thống gỡ lỗi CoreSight cung cấp cổng truy cập gỡ lỗi cho phép kết nối với vi điều khiển thông qua công cụ JTAG, sử dụng chuẩn giao diện JTAG 5 chân hoặc giao diện 2 dây nối tiếp Ngoài tính năng gỡ lỗi của JTAG, CoreSight còn tích hợp theo dõi dữ liệu và ETM, nâng cao khả năng phân tích và gỡ lỗi.
Hình 1.26 Hệ thống gỡ lỗi CoreSight bên trong Cortex
Cơ cấu gỡ lỗi CoreSight trên STM32 mang đến phiên bản thời gian thực cải tiến của chuẩn gỡ lỗi JTAG, với khả năng cung cấp 8 breakpoints phần cứng có thể đặt và xóa trong khi CPU Cortex đang hoạt động Hệ thống này cũng bao gồm bộ theo dõi Data Watch, cho phép người dùng theo dõi nội dung của các vị trí nhớ trong quá trình CPU Cortex chạy.
Hệ thống CoreSight duy trì hoạt động ngay cả khi lõi Cortex ở chế độ ngủ, cho phép tạm dừng các timer của STM32 khi CPU ngừng hoạt động Điều này giúp thực thi từng bước mã chương trình và giữ cho timer đồng bộ với hệ thống CoreSight cải thiện đáng kể khả năng gỡ lỗi thời gian thực của STM32 so với các CPU ARM7 và ARM9 trước đây, trong khi vẫn sử dụng phần cứng chi phí thấp.
Chương 2 KIẾN TRÚC HỆ THỐNG CỦA ARM CORTEX
ARM Cortex STM32 tích hợp nhân Cortex với bộ nhớ FLASH qua bus lệnh chuyên biệt Hệ thống bus dữ liệu và bus hệ thống kết nối tới ma trận bus tốc độ cao AHB SRAM nội liên kết với AHB, hoạt động như bộ DMA, trong khi các thiết bị ngoại vi được kết nối qua hệ thống này.
Hệ thống bus ngoại vi tốc độ cao APB-ARM bao gồm hai bus APBs kết nối với hệ thống AHB thông qua bus cầu nối AHB-APBs Ma trận bus AHB hoạt động với xung nhịp đồng hồ tương đương xung nhịp của nhân Cortex, tuy nhiên, thông qua bộ chia tần số AHB, hệ thống có thể hoạt động ở tần số thấp hơn để tiết kiệm năng lượng.
Hệ thống bus nội cung cấp một đường truyền chuyên biệt cho việc thực thi tập lệnh và ma trận bus đường dữ liệu, cho phép nhân Cortex và bộ điều khiển DMA truy cập hiệu quả vào các tài nguyên trên vi xử lý.
Hệ thống bus nội của STM32 không chỉ đa dạng mà còn cung cấp 4GB bộ nhớ liên tục cho lập trình, bắt đầu từ địa chỉ 0x00000000 On-chip SRAM được khởi đầu từ địa chỉ 0x20000000, với tất cả SRAM nội được bố trí ở vùng bit band Vùng nhớ thiết bị ngoại vi được ánh xạ từ địa chỉ 0x40000000 và cũng nằm trong vùng bit band, trong khi các thanh ghi điều khiển của nhân Cortex được ánh xạ từ địa chỉ 0xE0000000.
Vùng nhớ flash được chia thành ba phần: đầu tiên là User Flash bắt đầu từ địa chỉ 0x00000000, tiếp theo là System Memory có kích thước 4Kbytes, thường được cài đặt bootloader bởi nhà sản xuất Cuối cùng, vùng nhớ nhỏ từ địa chỉ 0x1FFFFF80 chứa thông tin cấu hình cho STM32 Bootloader, nằm trong User Flash, thường được sử dụng để tải chương trình qua USART1.
KIẾN TRÚC HỆ THỐNG CỦA ARM CORTEX
Cấu trúc bộ nhớ
Hệ thống bus nội của STM32 cung cấp 4GB bộ nhớ liên tục cho lập trình, bắt đầu từ địa chỉ 0x00000000 On-chip SRAM bắt đầu từ địa chỉ 0x20000000, với tất cả SRAM nội được bố trí tại điểm bắt đầu vùng bit band Vùng nhớ thiết bị ngoại vi được ánh xạ từ địa chỉ 0x40000000 và cũng nằm trong vùng bit band, trong khi các thanh ghi điều khiển của nhân Cortex được ánh xạ từ địa chỉ 0xE0000000.
Bộ nhớ flash được chia thành ba vùng chính: Vùng User Flash bắt đầu từ địa chỉ 0x00000000, tiếp theo là System Memory có kích thước 4Kbytes, nơi thường được cài đặt bootloader bởi nhà sản xuất Cuối cùng, vùng nhớ nhỏ từ địa chỉ 0x1FFFFF80 chứa thông tin cấu hình cho STM32 Bootloader được sử dụng để tải chương trình qua USART1 và được lưu trữ trong vùng User Flash.
Tối đa hiệu năng
Bên cạnh việc hỗ trợ hai bộ tạo xung nhịp ngoại, STM32 còn cung cấp thêm hai bộ tạo xung nhịp nội Sau khi đồng hồ tạo xung của nhân Cortex được reset, bộ tạo xung nhịp tốc độ cao (High Speed Internal Oscillator) hoạt động ở tần số 8MHz, trong khi bộ tạo xung nhịp thấp (Low Speed Internal Oscillator) hoạt động ở tần số 32.768KHz Bộ xung nhịp tốc độ thấp này thường được sử dụng cho đồng hồ thời gian thực và watchdog.
Hình 2.3 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ể nhận xung nhịp từ cả bộ tạo dao động nội và ngoại, cũng như từ PLL nội Tuy nhiên, bộ tạo dao động nội tốc độ cao 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 định thời thời gian thực, nên chọn bộ tạo dao động ngoại tốc độ cao Dù sử dụng bộ dao động nào, nhân Cortex vẫn cần xung nhịp từ bộ PLL Tất cả các thanh ghi điều khiển PLL và cấu hình bus được bố trí trong nhóm RCC (Reset and Clock Control).
2.2.1 Vòng Khóa Pha (Phase Lock Loop)
Sau khi hệ thống STM32 được reset, nó nhận xung nhịp từ bộ tạo dao động HIS, trong khi các bộ tạo dao động ngoại sẽ bị tắt Để STM32 hoạt động ở mức xung nhịp cao nhất, bước đầu tiên là bật bộ tạo dao động HSE và chờ cho đến khi nó hoạt động ổn định Đoạn mã dưới đây sẽ mô tả cách cấu hình CPU của STM32 để đạt được mức xung nhịp tối đa.
Bộ tạo dao động ngoại được kích hoạt qua các thanh ghi RCC_Control, với một bit trạng thái bật khi hoạt động ổn định Khi bộ tạo dao động ngoại hoạt động ổn định, nó có thể được chọn làm đầu vào cho bộ PLL Xung nhịp ra từ PLL được xác định qua các bội số nguyên trong thanh ghi RCC_PLL Nếu xung nhịp đầu vào của PLL là 8MHz, cần cấu hình bội số nhân là 9 để tạo ra xung nhịp 72MHz ở đầu ra Khi bộ tạo dao động ngoại và PLL hoạt động ổn định, bit điều khiển trạng thái sẽ bật, cho phép dao động từ PLL được cung cấp cho nhân CPU Cortex của STM32 Đoạn mã cấu hình STM32 sử dụng dao động từ PLL.
Khi PLL được chọn làm bộ tạo dao động cho hệ thống, Cortex CPU sẽ hoạt động ở tần số 72MHz Để tối ưu hóa hiệu suất cho toàn bộ hệ thống, người dùng cần cấu hình AHB và APB thông qua các thanh ghi cầu nối.
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 qua I-Bus, hoạt động cùng tần số với CPU, cho phép truy cập Flash mỗi 1.3ns Ban đầu, STM32 sử dụng bộ tạo dao động nội, dẫn đến thời gian truy cập Flash không đáng kể Tuy nhiên, khi PLL được kích hoạt, thời gian truy cập tăng lên khoảng 35ns, làm giảm hiệu năng hệ thống Để duy trì tần số 72MHz với thời gian chờ 0, Flash được trang bị bộ nhớ đệm 64-bit, cho phép thực thi lệnh đọc ghi dữ liệu 64-bit và chuyển lệnh 16 hay 32 bit cho Cortex Kỹ thuật này hiệu quả với các lệnh Thumb-2 và khả năng dự báo chỉ dẫn của Cortex pipeline Hệ thống bộ đệm Flash được quản lý bởi các thanh ghi cấu hình, và cần điều chỉnh số trạng thái chờ khi Flash đọc 8 bytes lệnh.
Thời gian trạng thái chờ giữa bộ đệm tiền xử lý và bộ nhớ Flash không ảnh hưởng đến nhân Cortex CPU Khi CPU thực thi lệnh ở nửa đầu bộ đệm, lệnh ở nửa sau sẽ được tiền xử lý và tải lên nhân để xử lý ngay sau đó, tối ưu hóa hiệu suất của Cortex CPU.
STM32 sở hữu 7 kênh DMA độc lập cho phép chuyển dữ liệu giữa bộ nhớ và ngoại vi, bao gồm: 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 Tốc độ dữ liệu trong việc trao đổi giữa bộ nhớ phụ thuộc vào kênh DMA, trong khi tốc độ giao tiếp với ngoại vi phụ thuộc vào bộ điều khiển của ngoại vi và hướng di chuyển của dữ liệu Ngoài việc chuyển dữ liệu theo luồng, bộ DMA của STM32 còn hỗ trợ bộ đệm vòng, giúp lưu trữ dữ liệu vào bộ nhớ SRAM do hầu hết các ngoại vi không có bộ nhớ FIFO Thiết kế của bộ DMA STM32 tối ưu cho việc truyền tải dữ liệu tốc độ cao và kích thước nhỏ.
Mỗi thao tác bộ nhớ DMA bao gồm 4 giai đoạn
Quá trình truyền dữ liệu diễn ra qua bốn giai đoạn: lấy mẫu và phân xử, tính toán địa chỉ, truy cập đường truyền, và hoàn tất Mỗi giai đoạn thực hiện trong một chu kỳ lệnh, trong đó giai đoạn truy cập đường truyền chiếm 5 chu kỳ lệnh, với mỗi từ (word) mất 3 chu kỳ lệnh để truyền Bộ DMA và CPU được thiết kế hoạt động song song mà không tranh chấp tài nguyên Giữa hai kênh DMA, mức ưu tiên hoạt động sẽ quyết định kênh nào được truy cập tài nguyên trước; nếu hai kênh có cùng mức ưu tiên, kênh có số thứ tự nhỏ hơn sẽ được ưu tiên sử dụng.
Bộ DMA được thiết kế cho truyền dữ liệu tốc độ và kích thước nhỏ
Bộ DMA chỉ sử dụng bus dữ liệu khi ở giai đoạn truy cập đường truyền
Bộ DMA có khả năng phân xử tài nguyên và tính toán địa chỉ trong khi một bộ DMA khác đang thực hiện truy cập đường truyền Khi bộ DMA đầu tiên hoàn tất việc truy cập, bộ DMA tiếp theo sẽ ngay lập tức bắt đầu quá trình của mình.
DMA 2 có thể ngay lập tức sử dụng đường truỳên dữ liệu Điều này vừa làm tăng tốc độ truyền dữ liệu, tối đa hóa viêc sử dụng tài nguyên Ở giai đoạn Bus Access CPU sẽ có 3 chu kỳ rảnh Khi chuyển dữ liệu từ vùng nhớ sang vùng nhớ điều này sẽ đảm bảo nhân Cortex-M3 sử dụng
60% dung lượng của đường truyền dữ liệu cho dù bộ DMA vẫn hoạt động liên tục
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 cần 2 chu kỳ để chuyển 2 bytes dữ liệu, với 1 chu kỳ cho việc đọc và 1 chu kỳ cho việc ghi, trong khi 3 chu kỳ còn lại được sử dụng để giải phóng đường dữ liệu cho nhân Cortex Bộ DMA chỉ sử dụng tối đa 40% băng thông của đường dữ liệu Tuy nhiên, giai đoạn Bus Access trở nên phức tạp khi dữ liệu được truyền giữa thiết bị ngoại vi hoặc giữa ngoại vi và bộ nhớ, liên quan đến AHB và APB Trao đổi trên bus AHB sử dụng 2 chu kỳ xung nhịp AHB, trong khi bus APB cần 2 chu kỳ xung nhịp APB cộng thêm 2 chu kỳ xung nhịp AHB Mỗi lần trao đổi dữ liệu, bộ DMA sẽ sử dụng bus AHB, bus APB và 1 chu kỳ xung nhịp AHB Ví dụ, để chuyển dữ liệu từ bus SPI tới SRAM, chúng ta sẽ áp dụng quy trình này.
SPI đến SRAM sử dung DMA = SPI transfer(APB) + SRAM transfer(AHB) + free cycle(AHB)
= (2 APB cycles + 2 AHB cycles) + (2 AHB cycles) + (1 AHB cycle) (2 APB cycles) + (5 AHB cycles)
* Lưu ý: Quá trình trên chỉ áp dụng cho các nhân Cortex sử dụng đường I-bus để nạp lệnh cho nhân xử lý
STM32 có 7 bộ DMA độc lập với nhau
Việc sử dụng DMA rất đơn giản Đầu tiên là kích hoạt đồng hồ xung nhịp
Khi được cấp nguồn, khối DMA sẽ được điều khiển thông qua 4 thanh ghi Hai thanh ghi đầu tiên đảm nhiệm việc điều khiển địa chỉ đích và nguồn của các thiết bị ngoại vi cũng như vùng nhớ Hai thanh ghi còn lại lưu trữ kích thước dữ liệu truyền và cấu hình tổng quan của DMA.
Mỗi bộ DMA có 4 thanh ghi điều khiển, 3 nguồn tín hiệu interrupt: hoàn tất, hoàn tất một nửa, lỗi
Mỗi kênh DMA được gán một mức ưu tiên từ rất cao đến thấp, và kích cỡ dữ liệu truyền có thể điều chỉnh cho phù hợp với ngoại vi và vùng nhớ Ngoài chế độ vòng lặp chờ, DMA còn hỗ trợ ngắt để theo dõi quá trình chuyển dữ liệu, với ba loại ngắt: 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 xong, Channel Enable Bit được kích hoạt để bắt đầu quá trình chuyển dữ liệu Ví dụ, mã sử dụng TIM2 để đo thời gian chuyển dữ liệu giữa hai vùng nhớ SRAM có kích thước 10 word.
220 chu kỳ, với cách sử dụng CPU tiêu tốn 536 chu kỳ
Hình 3.4 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
Kiểu truyền dữ liệu từ bộ nhớ sang bộ nhớ thường được sử dụng để khởi tạo vùng nhớ hoặc sao chép các vùng dữ liệu lớn Tác vụ DMA chủ yếu được áp dụng để chuyển dữ liệu giữa thiết bị ngoại vi và bộ nhớ.