Lập trình ARM của Ngô Vinh Những đặc điểm nổi trội của dòng ARM Cortex đã thu hút các nhà sản xuất IC, hơn 240 dòng vi điều khiển dựa vào nhân Cortex đã được giới thiệu. Không nằm ngoài xu hướng đó, hãng sản xuất chip ST Microelectronic đã nhanh chóng đưa ra dòng STM32. STM32 là vi điều khiển dựa trên nền tảng 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 từ lõi ARM7 truyền thống từng mang lại thành công vang dội cho công ty ARM. Một vài đặc điểm nổi bật của STM32 ST đã đưa ra thị trường 4 dòng vi điều khiển dựa trên ARM7 và ARM9, nhưng STM32 là một bước tiến quan trọng trên đường cong chi phí và hiệu suất (price/performance), giá chỉ gần 1 Euro với số lượng lớn, STM32 là sự thách thức thật sự với các vi điều khiển 8 và 16-bit truyền thống. STM32 đầu tiên gồm 14 biến thể khác nhau, được phân thành hai dòng: dòng Performance có tần số hoạt động của CPU lên tới 72Mhz và dòng Access có tần số hoạt động lên tới 36Mhz. Các biến thể STM32 trong hai nhóm này tương thích hoàn toàn về cách bố trí chân (pin) và phần mềm, đồng thời kích thước bộ nhớ FLASH ROM có thể lên tới 512K và 64K SRAM. Nhánh Performance hoạt động với xung nhịp lên đến 72Mhz và có đầy đủ các ngoại vi, nhánh Access hoạt động với xung nhịp tối đa 36Mhz và có ít ngoại vi hơn so với nhánh Performance. a. Sự tinh vi Thoạt nhìn thì các ngoại vi của STM32 cũng giống như những vi điều khiển khác, như hai bộ chuyển đổi ADC, timer, I2C, SPI, CAN, USB và RTC. Tuy nhiên mỗi ngoại vi trên đều có rất nhiều đặc điểm thú vị. Ví dụ như bộ ADC 12-bit có tích hợp một cảm biến nhiệt độ để tự động hiệu chỉnh khi nhiệt độ thay đổi và hỗ trợ nhiều chế độ chuyển đổi. Mỗi bộ định thời có 4 khối capture compare (dùng để bắt sự kiện với tính năng input capture và tạo dạng sóng ở ngõ ra với output compare), mỗi khối định thời có thể liên kết với các khối định thời khác để tạo ra một mảng các định thời tinh vi hơn. Một bộ định thời cao cấp chuyên hỗ trợ điều khiển động cơ, với 6 đầu ra PWM với dead time (khoảng thời gian được chèn vào giữa hai đầu tín hiệu xuất PWM bù nhau trong điều khiển mạch cầu H) lập trình được và một đường break input (khi phát hiện điều kiện dừng khẩn cấp) sẽ buộc tín hiệu PWM sang một trạng thái an toàn đã được cài sẵn. Ngoại vi nối tiếp SPI có một khối kiểm tổng (CRC) bằng phần cứng cho 8 và 16 word hỗ trợ tích cực cho giao tiếp thẻ nhớ SD hoặc MMC. STM32 có hỗ trợ thêm tối đa 12 kênh DMA (Direct Memory Access). Mỗi kênh có thể được dùng để truyền dữ liệu đến các thanh ghi ngoại vi hoặc từ các thanh ghi ngoại vi đi với kích thước từ (word) dữ liệu truyền đi có thể là 8/16 hoặc 32-bit. Mỗi ngoại vi có thể có một bộ điều khiển DMA (DMA controller) đi kèm dùng để gửi hoặc đòi hỏi dữ liệu như yêu cầu. Một bộ phân xử bus nội (bus arbiter) và ma trận bus (bus matrix) tối thiểu hoá sự tranh chấp bus giữa truy cập dữ liệu thông qua CPU (CPU data access) và các kênh DMA. Điều đó cho phép các đơn vị DMA hoạt động linh hoạt, dễ dùng và tự động điều khiển các luồng dữ liệu bên trong vi điều khiển. STM32 là một vi điều khiển tiêu thụ năng lượng thấp và đạt hiệu suất cao. Nó có thể hoạt động ở điện áp 2V, chạy ở tần số 72MHz và dòng tiêu thụ chỉ có 36mA với tất cả các khối bên trong vi điều khiển đều được hoạt động. Kết hợp với các chế độ tiết kiệm năng lượng của Cortex, STM32 chỉ tiêu thụ 2μA khi ở chế độ Standby. Một bộ dao động nội RC 8MHz cho phép chip nhanh chóng thoát khỏi chế độ tiết kiệm năng lượng trong khi bộ dao động ngoài đang khởi động. Khả năng nhanh đi vào và thoát khỏi các chế độ tiết kiệm năng lượng làm giảm nhiều sự tiêu thụ năng lượng tổng thể. b. Sự an toàn Ngày nay các ứng dụng hiện đại thường phải hoạt động trong môi trường khắc khe, đòi hỏi tính an toàn cao, cũng như đòi hỏi sức mạnh xử lý và càng nhiều thiết bị ngoại vi tinh vi. Để đáp ứng các yêu cầu khắc khe đó, STM32 cung cấp một số tính năng phần cứng hỗ trợ các ứng dụng một cách tốt nhất. Chúng bao gồm một bộ phát hiện điện áp thấp, một hệ thống bảo vệ xung Clock và hai bộ Watchdogs. Bộ đầu tiên là một Watchdog cửa sổ (windowed watchdog). Watchdog này phải được làm tươi trong một khung thời gian xác định. Nếu nhấn nó quá sớm, hoặc quá muộn, thì Watchdog sẽ kích hoạt. Bộ thứ hai là một Watchdog độc lập (independent watchdog), có bộ dao động bên ngoài tách biệt với xung nhịp hệ thống chính. Hệ thống bảo vệ xung nhịp có thể phát hiện lỗi của bộ dao động chính bên ngoài (thường là thạch anh) và tự động chuyển sang dùng bộ dao động nội RC 8MHz. c. Tính bảo mật Một trong những yêu cầu khắc khe khác của thiết kế hiện đại là nhu cầu bảo mật mã chương trình để ngăn chặn sao chép trái phép phần mềm. Bộ nhớ Flash của STM32 có thể được khóa để chống truy cập đọc Flash thông qua cổng Debug. Khi tính năng bảo vệ đọc được kích hoạt, bộ nhớ Flash cũng được bảo vệ chống ghi để ngăn chặn mã không tin cậy được chèn vào bảng vector ngắt. Hơn nữa bảo vệ ghi có thể được cho phép trong phần còn lại của bộ nhớ Flash. STM32 cũng có một đồng hồ thời gian thực và một khu vực nhỏ dữ liệu trên SRAM được nuôi nhờ nguồn pin. Khu vực này có một đầu vào chống giả mạo (anti-tamper input), có thể kích hoạt một sự kiện ngắt khi có sự thay đổi trạng thái ở đầu vào này. Ngoài ra một sự kiện chống giả mạo sẽ tự động xóa dữ liệu được lưu trữ trên SRAM được nuôi bằng nguồn pin. d. Phát triển phần mềm Nếu bạn đã sử dụng một vi điều khiển dựa trên lõi ARM, thì các công cụ phát triển cho ARM hiện có đã được hỗ trợ tập lệnh Thumb-2 và dòng Cortex. Ngoài ra ST cũng cung cấp một thư viện điều khiển thiết bị ngoại vi, một bộ thư viện phát triển USB như là một thư viện ANSI C và mã nguồn đó là tương thích với các thư viện trước đó được công bố cho vi điều khiển STR7 và STR9. Có rất nhiều RTOS mã nguồn mở và thương mại và middleware (TCP/IP, hệ thống tập tin, v.v.) hỗ trợ cho họ Cortex. Dòng Cortex-M3 cũng đi kèm với một hệ thống gỡ lỗi hoàn toàn mới gọi là CoreSight. Truy cập vào hệ thống CoreSight thông qua cổng truy cập Debug (Debug Access Port), cổng này hỗ trợ kết nối chuẩn JTAG hoặc giao diện 2 dây (serial wire-2 Pin), cũng như cung cấp trình điều khiển chạy gỡ lỗi, hệ thống CoreSight trên STM32 cung cấp hệ thống điểm truy cập(data watchpoint) và một công cụ theo dõi (instrumentation trace). Công cụ này có thể gửi thông tin về ứng dụng được lựa chọn đến công cụ gỡ lỗi. Điều này có thể cung cấp thêm các thông tin gỡ lỗi và cũng có thể được sử dụng trong quá trình thử nghiệm phần mềm. e. Dòng Performance và Access của STM32 Họ STM32 có hai nhánh đầu tiên riêng biệt: dòng Performance và dòng Access. Dòng Performance tập hợp đầy đủ các thiết bị ngoại vi và chạy với xung nhịp tối đa 72MHz. Dòng Access có các thiết bị ngoại vi ít hơn và chạy tối đa 36MHz. Quan trọng hơn là cách bố trí chân (pins layout) và các kiểu đóng gói chip (package type) là như nhau giữa dòng Access và dòng Performance. Điều này cho phép các phiên bản khác nhau của STM32 được hoán vị mà không cần phải sửa đổi sắp sếp lại footprint (mô hình chân của chip trong công cụ layout bo mạch) trên PCB (Printed Circuit Board). Ngoài hai dòng Performance và Access đầu tiên, hiện nay ST đã đưa ra thị trường thêm hai dòng USB Access và Connectivity như hình bên dưới.
Trang 1MỤC LỤC
CHƯƠNG 1: CÁC KHÁI NIỆM CƠ BẢN TRONG HỆ THỐNG NHÚNG 3
1.1 Hệ nhúng 3
1.2 Hệ thời gian thực 3
1.3 Biễu diễn số và dữ liệu 3
1.4 Cấu trúc phần cứng của hệ thống nhúng 4
1.5 Hệ điều hành nhúng và phần mềm nhúng 5
1.5.1 Hệ điều hành nhúng 5
1.5.2 Hệ điều hành thời gian thực –RTOS: (Realtime Operationg System ) 6
1.5.3 Phần mềm nhúng 7
1.6 Quy trình thiết kế hệ thống nhúng 8
1.7 Mô hình hệ thống nhúng 10
CHƯƠNG 2: HỌ VI ĐIỀU KHIỂN ARM 11
2.1 Tổng quan 11
2.2 Cơ chế Pipeline 12
2.3 Các thanh ghi 13
2.4 Thanh ghi trạng thái chương trình hiện hành 14
2.5 Các mode ngoại lệ 15
2.6 Tập lệnh ARM 7 16
2.6.1 Các lệnh rẽ nhánh 18
2.6.2 Các lệnh xử lý dữ liệu 18
2.6.3 Các lệnh truyền dữ liệu 19
2.6.4 Lệnh SWAP 20
2.7 Ngắt mềm (SWI – Software Interrupt Instruction) 20
2.8 Đơn vị MAC (Multiply Accumulate Unit (MAC) 21
2.9 Tập lệnh THUMB 21
2.10 Phần mềm phát triển và công cụ phần cứng 23
2.10.1 Cấu trúc file start up 23
2.10.2 Công cụ phần cứng 25
2.10.3 Cách viết chương trình C với tập lệnh ARM và tập lệnh THUMB 25
2.11 Cấu trúc bên trong 26
2.11.1 Bản đồ bộ nhớ 26
2.11.2 Lập trình thanh ghi 27
Trang 22.11.3 Memory Acelerator Module (MAM) 27
2.11.4 PLL- Phase Locked Loop 29
2.11.5 Bộ chia bus (VLSI Peripheral Bus Divider) 32
2.12 Các cổng vào ra 33
CHƯƠNG 3: LẬP TRÌNH VI ĐIỀU KHIỂN ARM 34
3.1 Hướng dẫn sử dụng phần mềm Keil C 34
3.2 Truy nhập các chân vào ra chung 42
Thí dụ 1: Viết chương trình điều khiển led đơn sáng nhấp nháy 43
Thí dụ 2: Chương trình hiển thị chữ trên LCD 44
3.3 Lập trình ngắt 50
3.3.1 Chân Connect Block 50
3.3.2 Các chân ngắt ngoài 51
3.3.3 Cấu trúc ngắt 52
3.3.4 Ngắt FIQ 54
3.3.5 Kết thúc ngắt 56
3.3.6 Vecto IRQ 56
3.3.7 Kết thúc một ngắt IRQ 57
3.3.8 Ngắt không có địa chỉ 58
3.3.9 Kết thúc ngắt không địa chỉ 59
3.4 Lập trình Timer 59
3.4.1 Các Timer 59
3.4.2 Đồng hồ thời gian thực (Real Time Clock - RTC) 67
3.5 Lập trình qua UART 70
3.6 Giao diện I2C 78
3.7 Giao diện SPI 81
3.8 Chuyển đổi ADC và DAC 83
3.8.1 Chuyển đổi ADC 83
3.8.2 Chuyển đổi D/A 85
3.9 Truyền dữ liệu qua CAN(Controller Area Network) 85
TÀI LIỆU THAM KHẢO 92
Trang 3CHƯƠNG 1: CÁC KHÁI NIỆM CƠ BẢN TRONG HỆ THỐNG NHÚNG
(tổng số tiết: 3T, số tiết lý thuyết: 3T, số tiết thực hành: 0)
1.1 Hệ nhúng
Hệ nhúng là một phần hệ thống xử lý thông tin nhúng trong các hệ thống lớn, phức hợp và độc lập T h í dụ: ôtô, tủ lạnh, các thiết bị đo lường, điều khiển,
truyền thông
Là những tổ hợp của phần cứng và phần mềm để thực hiện một hoặc một
nhóm chức năng chuyên biệt, cụ thể (Trái ngược với máy tính PC là đa năng)
Một hệ thống nhúng là một máy tính với chất lượng cao, yêu cầu về độ tin cậy cao hơn các loại máy tính khác
Các thiết bị PDAs, Web pad không phải là hệ thống nhúng
1.2 Hệ thời gian thực
Chia làm 2 loại:
Thời gian thực cứng là khi hệ thống hoạt động với yêu cầu thoả mãn sự ràng
buộc trong khung thời gian cứng tức là nếu vi phạm thì sẽ dẫn đến hoạt động của toàn hệ thống bị sai hoặc bị phá huỷ Thí dụ: Lò phản ứng hạt
nhân,…
Thời gian thực mềm là khi hệ thống hoạt động với yêu cầu thoả mãn ràng
buộc trong khung thời gian mềm, nếu vi phạm và sai lệch nằm trong khoảng cho phép thì hệ thống vẫn có thể hoạt động được và chấp nhận được Thí dụ
như hệ thống phát thanh truyền hình
Hầu hết hệ nhúng là các hệ thời gian thực và hầu hết các hệ thời gian thực là hệ nhúng-> Thuộc tính thời gian là thuộc tính tiêu biểu cho hệ thống nhúng
1.3 Biễu diễn số và dữ liệu
Đơn vị cơ bản nhất trong biểu diễn thông tin của hệ thống số được gọi là bit,
chính là ký hiệu viết tắt của thuật ngữ binary digit
1964, IBM đã thiết kế và chế tạo máy tính số sử dụng một nhóm 8 bit để
đánh địa chỉ bộ nhớ và định nghĩa ra thuật ngữ 8 bit = 1 byte
Ngày nay sử dụng rộng rãi thuật ngữ word là một từ dữ liệu dùng để biểu
diễn kích thước dữ liệu mà được xử lý một cách hiệu quả nhất đối với mỗi
Trang 4loại kiến trúc xử lý số cụ thể Chính vì vậy một từ có thể là 16 bits, 32 bits, hoặc 64 bits…
Mỗi một byte có thể đƣợc chia ra thành hai nửa 4 bit và đƣợc gọi là các
0 1
cơ số binary (nhị phân), cơ số decimal (thập phân), cơ số hexadecimal, cơ số
8 Octal (bát phân)
1.4 Cấu trúc phần cứng của hệ thống nhúng
Hình 1.1 Kiến trúc cơ bản của của các chip vi điều khiển nhúng
CPU: Đóng vài trò là bộ não, giả mã và thực thi lệnh, gồm khối ALU, bộ giả
mã, bộ tuần tự và các thanh ghi
Trang 5Xung nhịp và trạng thái tín hiệu: Hoạt động của hệ thống được thực hiện đồng bộ hoặc
dị bộ theo các xung nhịp chuẩn Các nhịp đó được lấy trực tiếp hoặc gián tiếp từ một
nguồn xung chuẩn thường là các mạch tạo xung hoặc dao động thạch anh
Bus: có 3 loại, bus dữ liệu, địa chỉ và điều khiển (Bus điều khiển phục vụ
truyền tải các thông tin dữ liệu để điều khiển hoạt động của hệ thống)
Bộ nhớ: có 2 loại kiến trúc
- Kiến trúc von neumann: không phân biệt vùng chứa dữ liệu và mã
chương trình Cả chương trình và dữ liệu đều được truy nhập theo cùng một đường
- Kiến trúc Havard: tách/phân biệt vùng lưu mã chương trình và dữ liệu
Mã chương trình chỉ có thể được lưu và thực hiện trong vùng chứa ROM và dữ liệu cũng chỉ có thể lưu và trao đổi trong vùng RAM
Hầu hết các vi xử lý nhúng ngày nay sử dụng kiến trúc bộ nhớ Havard hoặc kiến trúc Havard mở rộng (tức là bộ nhớ chương trình và dữ liệu tách biệt nhưng vẫn cho
phép khả năng hạn chế để lấy dữ liệu ra từ vùng mã chương trình)
Bộ nhớ chương trình: Eprom và Flash
Là các chíp khả trình, cấu tạo từ các transitor, eprom có thể xóa bằng tia cực tím, trong khi Flash có thể xóa bằng các xung điện, có thể lập trình trực tiếp và không cần tháo ra khỏi mạch
Bộ nhớ RAM: gồm SRAM và DRAM
Bộ điều khiển ngắt: Xử lý yêu cầu ngắt
Bộ định thời chó canh (Watchdog Timer): Là một bộ định thời đặc biệt để
định nghĩa 1 khung thời gian hoạt động bình thường của hệ thống Tự động reset lại hệ thống khi phát hiện các sự cố mềm như hệ thống bị treo hoặc chạy quẩn
Khung thời gian do người lập trình đặt ra
1.5 Hệ điều hành nhúng và phần mềm nhúng
1.5.1 Hệ điều hành nhúng
- Đóng vai trò trung gian để tương tác trực tiếp với phần cứng và các chương trình ở lớp trên cũng như người sử dụng: Quản lý các tiến trình, quản lý tài ngyên và bảo về các tài nguyên khỏi sự xâm phạm
Trang 6- Được nạp và thực thi đầu tiên khi hệ thống khởi động
- Để nạp hệ điều hành cần sử dụng bộ nạp boot-loader, có kích thước nhỏ gọn, đảm
nhiệm chức năng tiền hệ điều hành
- Bộ nạp khởi tạo cũng có nhiệm vụ khởi tạo vùng nhớ dữ liệu và các thanh ghi hệ
thống trước khi nhảy tới chương trình ứng dụng chính
- Có rất nhiều dạng khác nhau của bộ nạp khởi tạo, từ dạng đơn giản đến phức tạp
1.5.2 Hệ điều hành thời gian thực –RTOS: (Realtime Operationg System )
- Các chức năng chính như định thời, giải quyết xung đột dữ liệu, giao tiếp giữa các
tác vụ process/task.->Ngắn gọn: RTOS là hệ điều hành đa nhiệm - multitasking dùng
cho các ứng dụng thời gian thực
- RTOS: Cung cấp các giao tiếp giữa phần cứng và chương trình ứng dụng, với các
tính năng chủ yếu sau: Đa nhiệm - Multitasking, Đồng bộ - Sync , xử lý sự kiện và
ngắt, I/O, truyền thông giữa các tách vụ process/task, quản lý Timer, Clock và bộ nhớ
(tựa chung là quản lý tài nguyên)
Hình 1.2 Cấu trúc của OSEK
Phân loại:
a Các hệ điều hành mang tính thương mại: thường nhỏ và nhanh, như QNX,
PDOS, pSOS, VxWorks, Nulceus, ERCOS, EMERALDS, Windows CE, chúng có các
đặc điểm sau:
Trang 7+ Có thời gian chuyển ngữ cảnh và thời gian đáp ứng nhanh
+ Kích thước rất nhỏ
+ Không có bộ nhớ ảo và có thể cố định mã, dữ liệu trong bộ nhớ
+ Hệ thống đa tác vụ và chuẩn giao tiếp liên quá trình Các mailbox, các
sự kiện, các tín hiệu và các đèn báo được định nghĩa tốt
Những hệ điều hành này thường có các đặc tả tốt và có các công cụ tốt để phát triển các ứng dụng nhúng thời gian thực Nó hỗ trợ các ràng buộc thời gian thực với các dịch vụ như:
+ Các giới hạn thời gian thực hiện
+ Đồng hồ thời gian thực
+ Lập lịch thứ tự ưu tiên
+ Cảnh báo đặc biệt và thời gian quá hạn (timeout)
+ Hỗ trợ các hàng đợi thời gian thực
+ Cung cấp việc xử lý độ trễ, treo hay kích hoạt việc thực hiện
b Hệ điều hành thời gian thực mở rộng tới Unix và các hệ điều hành khác
Các hệ điều hành này như: RT-UNIX, RT-LINUX, RT-MACH, RT-POSIX Chúng chậm hơn và có khả năng dự đoán ít hơn so với các hệ điều hành thời gian thực thương mại ở trên nhưng chúng lại có nhiều chức năng và môi trường phát triển tốt hơn dựa trên tập các giao tiếp chuẩn và thân thiện
c Các nhân cho mục đích nghiên cứu
Thí dụ như: Spring, MARS, HARTOS, MARUTI, ARTS, CHAOS, DARK
Các hệ điều hành này có các đặc điểm sau:
+ Hỗ trợ các thuật toán lập lịch thời gian thực và việc phân tích thời gian + Hỗ trợ các dịch vụ cơ bản để đồng bộ thời gian thực
+ Nhấn mạnh khả năng dự đoán hơn là hiệu năng trung bình
+ Hỗ trợ cho khả năng chịu lỗi
- Đối với LPC2000 thì OS được xem là hệ điều hành tốt nhất
Trang 8- Simulator là một chương trình phần mềm cho phép người phát triển mã chương
trình chạy mô phỏng một chương trình viết cho một nền VXL/VĐK (nền phần cứng đích) trên một môi trường phần cứng khác (hay còn gọi là môi trường phát triển); cho phép chạy từng bước, kiểm thử, điều chỉnh với các giá trị khác nhau, sử dụng các thuật toán khác nhau
Hỗ trợ các chức năng giống như trên phần cứng đích, có thể kèm theo emulator
- Emulator là một thiết bị phần cứng có khả năng thực hiện như một nền phần cứng
đích ( Còn gọi là cộng cụ phát triển thời gian thực bởi vì nó cho ta phản ứng với các
Khi tiếp cập kiển trúc hệ thống nhúng dưới góc nhìn kỹ thuật có thể sử dụng một số
mô hình để miêu tả chu kỳ thiết kế Một số mô hình điển hình như sau:
Mô hình big-bang: Mô hình này về cơ bản là không cần có kế hoạch và quy trình trước và trong quá trình thiết kế
Mô hình code anh fix: Đưa ra ra các yêu cầu nhưng không có quy trình trước khi bắt đầu phát triển dự án
Mô hình waterfall(thác nước): Phát triển hệ thống theo từng bước, có được kết quả của bước trước mới thực hiện bước sau và lặp lại từ đầu
Trang 9Hình 1.3 Mô hình thác nước
Mô hình spiral (xoáy ốc): Là một quy trình phát triển hệ thống theo từng bước,
tại mỗi bước có sự thay đổi và quay lại thiết kế bước trước sao cho phù hợp
Hình 1.4 Mô hình xoán ốc Thực tế người ta thường kết hợp các mô hình, như mô hình chu kỳ thời gian sống là sự
kết hợp của mô hình waterfall và mô hình spiral
Trang 10Hình 1.5 Mô hình phát triển hệ thống theo chu kỳ thời gian sống
1.7 Mô hình hệ thống nhúng
Mô hình hệ thống nhúng gồm 3 lớp
Hình 1.5 Mô hình tổng thể của hệ thống nhúng
Trang 11CHƯƠNG 2: HỌ VI ĐIỀU KHIỂN ARM
2.1 Tổng quan
- Họ vi điều khiển LPC2000 là ARM7, người lập trình không cần thiết phải thành thạo ARM 7 để sử dụng LPC2000 mà vấn đề phức tạp là ở trình biên dịch C
- Người lập trình cần có kiến thức cơ bản về cách CPU làm việc và các đặc tính của nó
để tạo ra các thiết kế tin cậy
- ARM 7 là một máy tính nhỏ với tập lệnh nhỏ, khả năng tính toán cao, tiêu thụ năng lượng thấp
- Vi điều khiển ARM được phát triển theo kiến trúc RISC (Reduced Instruction Set
Computer):
- Chỉ có các lệnh nạp hoặc lưu trữ là có thể tham chiếu tới bộ nhớ,
- Tồn tại ít lệnh và kiểu định địa chỉ, khuôn dạng lệnh cố định,
- Có nhiều tập thanh ghi,
- Các lệnh thực hiện trong một chu ky máy,
- Lệnh được thực hiện trực tiếp trên phần cứng(CISC có 1 chương trình thông dịch nhỏ),
- Chương trình biên dịch mã nguồn phức tạp(CISC-chương trình thông dịch phức tạp),
- Hỗ trợ cơ chế pipeline,
- Kích thước chương trình lớn
Cấu trúc các chân:
Thí dụ các chân của LPC2101:
Trang 12Hình 2.1 Cấu trúc các chân của LPC2101
2.2 Cơ chế Pipeline
- Trái tim của ARM7 là cơ chế pipeline, thực thi lệnh theo ba bước: đọc lệnh, giải mã lệnh và thực thi lệnh
Hình 2.2 Ba bước thực hiện của pipepline
- Pipeline có phần cứng độc lập để thực hiện các bước, trong khi lệnh thứ nhất đang thực thi, lệnh thứ 2 được giải mã và lệnh thứ 3 được đọc lên pipeline
- Hầu hết các lệnh của ARM 7 được thực thi trong 1 chu kỳ máy
Trang 13- Pipeline làm việc rất tốt trong trường hợp chương trình không rẽ nhánh ARM chỉ cho phép thực hiện các bước nhảy ngắn trong đoạn chương trình
- Pipeline là một thành phần của CPU, thanh ghi PC chạy ở 8 bytes đầu của lệnh hiện hành sẽ được thực thi Thí dụ: 0x4000 LDR PC,[PC,#4]-> PC=0x400C
2.3 Các thanh ghi
- ARM7 có kiến trúc kiểu load and store, bởi vậy, để thực hiện các lệnh xử lý dữ liệu
thì tất cả các dữ liệu phải được tải từ bộ nhớ vào một tập các thanh ghi trung tâm, lệnh
xử lý dữ liệu được thực hiện và lưu trữ dữ liệu trở lại bộ nhớ
Hình 2.3 Kiến trúc load and store của ARM 7
- ARM7 có 17 thanh ghi 32 bít:
- Các thanh ghi R0 đến R12 là các thanh ghi chung,
- Thanh ghi R13 là thanh ghi con trỏ ngăn xếp,
- R14 là thanh ghi liên kết,
- R15 là thanh ghi bộ đếm chương trình (PC) và
- Thanh ghi trạng thái chương trình CPSR
- Thanh ghi R14 dùng trong chương trường hợp gọi đến chương trình con “gần” thì nó
sẽ cất giữ địa chỉ của trả về của chương trình chính, nếu trong chương trình con này gọi đến một chương trình con khác thì địa chỉ của chương trình chính phải được cất giữa vào ngăn xếp
Trang 14Hình 2.4 Các thanh ghi của ARM7
2.4 Thanh ghi trạng thái chương trình hiện hành
Hình 2.5 Thanh ghi trạng thái chương trình CPSR
- CPU ARM7 thực thi 2 loại lệnh: Tập lệnh ARM 32 bít và tập lệnh được nén 16 bít Bít T sẽ quyết định loại lệnh nào sẽ được thực thi, người lập trình không nên set hay xóa giá trị của bít này
- ARM7 có 7 chế độ hoạt động khác nhau, người lập trình thường chạy trong chế độ người dùng để truy cập đến các bank thanh ghi từ R0-R15 và thanh ghi trạng thái chương trình(CPSR) Tuy nhiên khi gặp các ngoại lệ như ngắt, lỗi bộ nhớ, ngắt mềm CPU sẽ chuyển sang chế độ khác Mỗi chế độ các thanh ghi R13 và R14 có giá trị
Trang 15riêng Ở chế độ ngắt nhanh FIQ các thanh ghi R7-R12 có giá trị giống nhau (không cần dùng stack để lưu chữ)
Hình 2.6 6 chế độ hoạt động của APU ARM7
Trang 16Hình 2.7 Thứ tự ƣu tiên của các ngắt
Hình 2.8 Thí dụ về trật tự xử lý khi có một ngoại lệ ngắt xảy ra
Hình 2.9 CPU trở lại trạng thái ban đầu khi kết thúc phụ vụ ngoại lệ
2.6 Tập lệnh ARM 7
- ARM7 có 2 tập lệnh: Tập lệnh mở rộng 32 bít và tập lệnh nén (THUMB) 16 bít
- CPU ARM7 đƣợc thiết kế để hỗ trợ xử lý theo kiểu big endian hay little endian:
Trang 17Hình 2.10 Hai kiểu xử lý của CPU ARM7
- Một đặc điểm thú vị của ARM7 là tất cả các lệnh đều có thể là các lệnh có điều
kiện, bằng cách so sánh 4 bít từ bit 28 đến bít 31 của kết quả thực hiện lệnh với các bít
điều kiện trong thanh ghi CPSR, nếu điều khiện không thỏa mãn thì lệnh sẽ không
được thực thi
- Các lệnh xử lý dữ liệu sẽ bị ảnh hưởng bởi các bít điều kiện trong thanh ghi CPSR Hai lệnh cơ bản MOV và ADD có thể đặt các tiến tố đằng trước với 16 điều kiện như sau:
Hình 2.11 16 điều kiện được kiểm tra trước khi thực thi lệnh
Trang 18Thí dụ: EQMOV R1,#0x00800000;
Giá trị 0x00800000 chỉ đưa vào R1 khi kết quả cuối cùng của lệnh có các bít tương ứng với 4 bít trong thanh ghi CPSR và bít cờ Z được set =1
- Các lệnh của ARM7 có thể chia thành 6 nhóm: Các lệnh rẽ nhánh, các lệnh xử lý
dữ liệu, truyền dữ liệu, truyền khối dữ liệu, lệnh số học và ngắt mềm
2.6.2 Các lệnh xử lý dữ liệu
Cú pháp tổng quát:
Hình 2.12 Cú pháp tổng quát của một lệnh xử lý dữ liệu có điều kiện
Mỗi lệnh đều có 2 toán hạng, trong đó toán hạng thứ nhất phải là thanh ghi, toán hạng còn lại có thể thanh ghi hoặc giá trị cụ thể
Bít „S‟ được sử dụng để điều khiển điều kiện của lệnh:
S=1 thì điều kiện của lệnh phụ thuộc vào kết quả của lệnh,
S=0 thì không có điều gì xảy ra
Nếu S=1 và PC là thanh ghi chứa kết quả thì SPSR của chế độ hiện hành được copy vào CPSR
Trang 19Hình 2.13 Bảng các lệnh xử lý dữ liệu
2.6.3 Các lệnh truyền dữ liệu
Hình 2.14 Các lệnh truyền dữ liệu
Trang 20Hình 2.15 Các lệnh truyền một khối dữ liệu
2.6.4 Lệnh SWAP
- ARM7 hỗ trợ các tín hiệu thời gian thực với một lệnh swap cho phép trao đổi chỗ nội dung của hai thanh ghi
- Lệnh này đƣợc hỗ trợ trong thƣ viện ARM chứ không trực tiếp từ ngôn ngữ C
Hình 2.16 Mô tả lệnh swap trong ARM7
2.7 Ngắt mềm (SWI – Software Interrupt Instruction)
Trang 21Các ngắt mềm sinh ra một ngoại lệ khi thực thi, đưa vi xử lý vào chế độ hoạt động giám sát và PC nhảy tới địa chỉ 0x00000008 Cũng như các lệnh ARM khác, lệnh ngắt mềm chứa một mã điều kiện thực thi trong 4 bít thấp của toán hạng, các bít còn lại là trống rỗng
Hình 2.17 Điều kiện của ngắt mềm để CPU vào chế độ giám sát
Có thể giả lặp chương trình con phục vụ ngắt của ngắt mềm như sau:
switch( *(R14-4) & 0x00FFFFFF) // Kiểm tra giá trị
//được lưu trữ trong thanh ghi liên kết {
case ( SWI-1):
…}
2.8 Đơn vị MAC (Multiply Accumulate Unit (MAC)
- MAC hỗ trợ phép nhận số nguyên kiểu integer và long integer, khi nhân kiểu integer 2 thanh ghi 32 bít với nhau thì kết quả là 32 bít được đặt vào thanh ghi thứ 3 Khi nhân 32 bít kiểu long integer thì kết quả là 64 bít và được đặt vào 2 thanh ghi
- Các lệnh nhận dạng ASM:
MULA Multiply accumulate 32 bit
UMULL Unsigned multiply 64 bit
UMLAL Unsigned multiply accumulate 64 bit
SMULL Signed multiply 64 bit
SMLAL Signed multiply accumulate 64 bit
Bảng 2.1 Các lệnh nhân trong vi điều khiển ARM
2.9 Tập lệnh THUMB
- Tập lệnh ARM là tập lệnh 32 bít, ARM có tập lệnh 16 bít gọi là tập lệnh THUMB Tập lệnh THUMB thực chất là tập lệnh nén lại từ tập lệnh ARM
Trang 22Hình 2.18 Tập lệnh THUMB đƣợc nén lại từ tập lệnh ARM
- Tập lệnh THUMB cho giá trị kết quả thấp hơn tập lệnh ARM nhƣng mà các kết quả này chiếm một tỷ lệ lớn hơn Tập lệnh THUMB tiết kiệm đƣợc không gian nhớ 30% và chạy nhanh hơn 40% so với tập lệnh ARM
- Tập lệnh THUMB không có điều kiện thực thi trừ các lệnh rẽ nhánh Các lệnh xử
lý dữ liệu thì cần có một thanh ghi nguồn và một thanh ghi đích
Thí dụ: Với lệnh cộng thanh ghi R0 và R1:
Trang 23Người lập trình không thể truy cập trực tiếp vào thanh ghi CPSR và SPSR Người lập trình có thể sử dụng 2 lệnh BLX và BX để chuyển chế độ hoạt động với các lệnh Khi reset vi điều khiển làm việc với tập lệnh THUMB, khi có 1 ngoại lệ xảy ra thì sẽ chuyển sang làm việc với tập lệnh ARM, khi kết thúc ngoại lệ thì quay trở về làm việc với lệnh ARM
Hình 2.20 Trao đổi giữa lệnh ARM và lệnh THUMB
2.10 Phần mềm phát triển và công cụ phần cứng
- Keil C ARM là công cụ cho phép lập trình mô phỏng vi điều khiển ARM với hệ thống thư viện được hỗ trợ tương đối đầy đủ về vi điều khiển core ARM 7 như: họ vi điều khiển LPCxxxx và ARM966E-S, cortex-M0 đến cortex-M3
- Phần mềm isp của atmel và H-jtag để biên dịch và nạp code lên board
2.10.1 Cấu trúc file start up
- Phần đầu cung cấp bảng vecto ngắt:
Trang 24Hình 2.21 Các định nghĩa các vecto ngắt trong file startup.s Bảng vecto ngắt được định nghĩa tại địa chỉ 0x00000000 và cho phép bộ đếm chương trình nhảy đến chương trình con phụ vụ ngắt ( ISR-interupt service routine) Rải địa chỉ của vio điều khiển là liên tiếp, không bị ngắt quãng trong bảng vecto ngắt Lệnh LDR (Load Register) được sử dụng để tải hằng tương ứng với vecto ngắt trong bảng vecto ngắt
- Bảng vecto ngắt và bảng các hằng nằm ở 64 bytes đầu tiên của bộ nhớ
- Lệnh NOP được sử dụng để nhảy đến vị trí vecto ngắt tại địa chỉ 0x00000014, vị trí lỗi
- Phần tiếp trong file startup.s cấu hình con trỏ ở đỉnh ngăn xếp cho từng chế độ hoạt động:
- Kích thước Stack tính theo byte, thí dụ trong file startup của LPCxxxx như sau:
Trang 25Hình 2.22 Cấu hình stack cho từng chế độ hoạt động
- Vùng nhớ dành cho stack được định nghĩa ở phần địa chỉ cao nhất của bộ nhớ và lớn dần về phần địa chỉ thấp
2.10.2 Công cụ phần cứng
- Họ LPC2000 của hãng Philips có nhiều cổng cho phép kết nối vi điều khiển với máy tính, thường được sử dụng nhất là cổng JTAG Khi kết nối trực tiếp với máy tính cho phép người lập trình debug trực tiếp trên mạch phần cứng:
Hình 2.23 Kết nối LPC2000 với máy tính qua cổng JTAG
- Đồng thời kèm theo module ETM cho phép debug chương trình: như theo dõi thời gian thực, theo dõi sự kiện và phân tích quá trình thực thi
2.10.3 Cách viết chương trình C với tập lệnh ARM và tập lệnh THUMB
- Để sử dụng các định nghĩa địa chỉ các ARM7, trong chương trình cần khai báo thư viện hợp lệ, thí dụ với họ LPC có các khai báo: #include LPC2xxx.h hoặc LPC21xx.h hoặc LPC210x.h
- Người lập trình có thể đưa ra các hàm được biên dịch theo lệnh tập ARM hoặc tập THUMB Để chỉ định một hàm sẽ được biên dịch theo tập lệnh nào dùng directive
#pragma, thí dụ:
Trang 26#pragma ARM // khai báo các lệnh ARM
unsigned long i,delay;
for (i = 0x00010000;i < 0x01000000 ;i = i<<1){
for (delay = 0;delay<0x000100000;delay++){} //tạo vòng lặp
IOSET1 = i; //chuyển đến led tiếp theo
}}
- Có thể chỉ ra trực tiếp trên lệnh:
int ARM_FUNCTION ( int my_var) ARM
{…}
int THUMB_FUNCTION ( int my_var) THUMB {…}
2.11 Cấu trúc bên trong
2.11.1 Bản đồ bộ nhớ
Hình 2.24
Trang 272.11.2 Lập trình thanh ghi
- Một thanh ghi chức năng được điều khiển bởi 3 thanh ghi người dùng, một thanh ghi để đọc trạng thái, một thanh ghi để xóa và một thanh ghi để ghi dữ liệu lên
Hình 2.25.Cấu trúc tổng quát khi truy cập thanh ghi chức năng trong ARM7
2.11.3 Memory Acelerator Module (MAM)
- Là bộ nhớ nằm giữa bộ nhớ Flash và CPU ARM, có tốc độ thực thi cao
Hình 2.26: Mô hình bộ nhớ MAM
- CPU ARM có thể chạy ở tốc độ 80MHz, mỗi lần chíp Flash truy cập hết 50ns
- Flash chạy ở tốc độ 20MHz
Trang 28- MAM được tạo ra như là một cache đầy đủ cho phép CPU dễ dàng truy cập trực tiếp vào FLASH
Hình 2.27 Truy cập bộ nhớ FLASH qua MAM
- Khi đọc các lệnh từ bank thứ nhất thì bank thứ hai được chốt
- MAM là trong suốt với người dùng và được cấu hình bởi 2 thanh ghi: điều khiển (MAMCR) và định thời (MAMTIM) Thanh ghi định thời được sử dụng để điều khiển mối quan hệ giữa CPU và FLASH bằng cách thiết lập 3 bít đầu tiên của nó để chỉ định chu kỳ xung nhịp của CPU được yêu cầu bởi MAM để truy cập vào FLASH
- Khi FLASH có tốc độ 20MHz và CPU có có thể có tốc độ cực đại là 60MHz, số chu kỳ yêu cầu truy cập FLASH là 3
Thí dụ: Cấu hình MAM
#include "LPC21xx.h"
void ChangeGPIOPinState(unsigned int state);
int main(void){
unsigned int delay,val;
unsigned int FLASHer = 0x00010000; // Khai báo cục bộ
IODIR0 = 0x00FF0000; // Thiết lập các chân ra
Trang 29}while ((val & 0x80000000) == 0);
val = ((val >> 6) & 0x03FF);
ChangeGPIOPinState(FLASHer); //Đổi trạng thái các chân ra ở cổng
FLASHer = FLASHer <<1; //Dịch đến đèn led tiếp
IOSET0 = state; //set output pins
IOCLR0 = ~state; //clear output pins
}
2.11.4 PLL- Phase Locked Loop
- Tạo ra một tần số dao động ngoài từ 10-25MHz từ mạch dao động cơ bản và có thể tăng lên 60 MHz để cung cấp cho CPU ARM và thiết bị ngoại vi
- Tần số đầu ra của PLL có thể thay đổi tự động, cho phép thiết bị điều chỉnh theo tốc độ thực thi để duy trì nguồn năng lƣợng khi ở trạng thái rảnh rỗi
Trang 30Hình 2.28
- Hai hằng M và P phải đƣợc lập trình để quyết định xung clock (Cclk) cho CPU và AHB
- Hăng thứ nhất đƣợc nhân một cách tuyến tính với tần số dao động bên ngoài đƣa
vào Tần số ra của PLL là: Cclk=M x Osc
- Ngƣợc lại PLL lại đƣợc điều khiển bởi một dao động hoạt động hiện hành (CCO)
ở dải tần 156MHz-320MHz Hằng số thứ 2 phải đƣợc lập trình để đảm bảo sao cho
CCO đƣợc giữ một giá trị cụ thể: Fcco = Cclk x 2 x P
- Trên board phát triển thì dao động thạch anh là 12MHz, bởi vậy để CPU đạt đƣợc tốc độ tối đa 60MHz thì: M = Cclk/Osc = 60/12 =5
và 156< Fcco <320 = 60 x 2 x P Thực nghiệm thì P=2
- Giao diện lập trình PLL:
Hình 2.29
- Giá trị trong các thanh ghi PLLCON, PLLCFG và PLLSTAT sẽ đƣợc ghi sau khi giá trị trong PLL FEED đƣợc ghi
Trang 31- Khi cập nhật giá trị thanh ghi PLLCON và PLLCFG thì phải ghi liên tiếp hai giá trị 0x000000AA và 0x00000055 cho thanh ghi PLLFEED, các giá trị này phải ghi trong các chu kỳ liên tiếp
- Nếu lập trình cho phép các ngắt thì ngắt sẽ sinh ran gay sau khi từ đầu tiên được ghi và các thiết lập mới cho PLL sẽ không có ảnh hường
- Để cài đặt PLL phải ghi các giá trị cho P và M tới thanh ghi PLLCFG, sau đó set D0 của thanh ghi PLLCON để cho phép PLL khởi động
- Giá trị của M chiếm 5 bít thấp (D4-D0), P chiếm 2 bít D6D5:
Hình 2.30 Giá trị của P và M trong thanh ghi PLLCFG
- PLL mất một khoảng thời gian xác định đủ để sử dụng nguồn xung clock Sự khởi động PLL có thể được kiểm tra bằng cách đọc bít LOCK (D10) trong thanh ghi trạng thái PLLSTAT
- Khi LOCK bít =1, PLL có thể được sử dụng như nguồn xung clock chính Một ngắt có thể được sinh ra khi PLL khóa, bởi vậy người lập trình có thể thực hiện các nhiệm vụ khác khi PLL khởi động Khi PLL bị khóa thì có thể thay thế nguồn xung cho Cclk bằng cách điều khiển bít PLLC trong thanh ghi PLLCON
Trang 32Hình 2.31 Trình tự khởi động PLL
2.11.5 Bộ chia bus (VLSI Peripheral Bus Divider)
Mạch dao động ngoài hoặc đầu ra của PLL được sử dụng để tạo ra nguồn xung Cclk cho CPU ARM hoặc hệ thống bus có tần số cao Các thiết bị ngoại vi có thể sử dụng bus VPB riêng biệt
Hình 2.32 Tạo xung Pclk từ Cclk
- Bộ chia có thể chia tốc độ Cclk xuống 2 đến 24 lần Thanh ghi trong bộ chia
VPBDIV có thể lập trình được và chứa số lần giảm tốc độ Tại thời điểm khởi động,
giá trị cực đại được nạp và bằng ¼ giá trị Cclk lúc khởi động
- Hiện nay tất cả các thiết bị ngoại vi của họ vi điều khiển LPC có thể chạy ở tần số 60MHz Vì vậy, bộ chia tần VPB thường được sử dụng để tiết kiệm nguồn bằng cách tạo xung clock chấp nhận được cho các ứng dụng
Thí du cấu hình PLL và VPB:
Trang 33Cấu hình PLL để tạo ra tần số Cclk là 60MHz và Pclk là 30MHz với xung đầu vào là 12MHz:
while (!(PLLSTAT & 0x00000400)); // kiểm tra bít Lock PLLCON = 0x00000003; // Kết nối tới PLL
PLLFEED = 0x000000AA; //Cập nhật các thanh ghi PLL PLLFEED = 0x00000055;
VPBDIV = 0x00000002; //Thiết lập bus VLSI với tần số 30.000MHz }
2.12 Các cổng vào ra
- Các cổng vào ra của ARM là 32 bít, vi điều khiển có thể chỉ có 1 cổng hoặc có nhiều hơn, nhưng các chân dùng cho cổng vào/ra cũng là các chân dùng chung cho các mục đích khác như biến đổi AD, ngắt, giao diện SPI, I2C,…
- Các chân được sử dụng vào mục đích nào tùy vào việc cấu hình chúng cho mục đích đó Trong chương 3 sẽ trình bày cụ thể về cách lập trình cho các chân cổng vào
ra
Trang 34CHƯƠNG 3: LẬP TRÌNH VI ĐIỀU KHIỂN ARM
3.1 Hướng dẫn sử dụng phần mềm Keil C
B1: Tạo một project mới:
B2: Tạo thư mục mới để chứa project mới tạo:
B3: Đặt tên cho thư mục là TD1 và click đúp lên thư mục này để mở ra và đặt tên cho project là TD1:
Trang 35B4: Chọn vi điều khiển với core ARM7, thí dụ LPC2101:
B5: Chọn Yes để tự động thêm code start up vào project:
Trang 36B6: Chọn New để thêm file mới để soạn thảo mã nguồn của vi điều khiển:
B7: Soạn thảo mã nguồn và ghi với tên MAM.C
Trang 37B8: Ghi lại với tên MAM.C
B9: Add file MAM.c vào project:
Trang 38B10: Chọn file MAM.c:
B11: Cấu hình cho project:
Trang 39B12: Trong tab Target chọn tần số là 12:
B13: Trong tab Output chọn create hex File:
Trang 40B14: Biên dịch project:
B15: Trên proteus vẽ mạch mô phỏng: