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.