stm --- Chức năng đặc thù cho vi điều khiển STM32

Mô-đun này cung cấp chức năng đặc thù cho vi điều khiển STM32, bao gồm truy cập trực tiếp vào các thanh ghi ngoại vi.

Truy cập bộ nhớ

Mô-đun này cung cấp ba đối tượng có thể đăng ký (subscriptable) dùng để truy cập bộ nhớ thô. Mỗi đối tượng hoạt động như một mảng thưa được lập chỉ mục theo địa chỉ byte: value = memN[addr] để đọc, memN[addr] = value để ghi. Địa chỉ luôn là địa chỉ byte, bất kể độ rộng truy cập.

Các đối tượng bộ nhớ này có thể được dùng kết hợp với các hằng số thanh ghi ngoại vi bên dưới để đọc và ghi các thanh ghi ngoại vi phần cứng MCU, cũng như bất kỳ vị trí nào khác trong không gian địa chỉ của SoC.

stm.mem8

Bộ truy cập bộ nhớ 8-bit có thể đăng ký. mem8[addr] đọc một int trong phạm vi 0-255 từ byte tại addr; mem8[addr] = value ghi 8 bit thấp của value. addr có thể là bất kỳ địa chỉ căn chỉnh theo byte nào.

stm.mem16

Bộ truy cập bộ nhớ 16-bit (nửa từ) có thể đăng ký. mem16[addr] đọc một int trong phạm vi 0-65535; mem16[addr] = value ghi 16 bit thấp. addr phải được căn chỉnh theo 2 byte.

stm.mem32

Bộ truy cập bộ nhớ 32-bit (từ) có thể đăng ký. mem32[addr] đọc một int trong phạm vi 0-0xFFFFFFFF; mem32[addr] = value ghi 32 bit thấp. addr phải được căn chỉnh theo 4 byte.

Hằng số thanh ghi ngoại vi

Mô-đun stm hiển thị toàn bộ địa chỉ thanh ghi CMSIS và offset cho dòng STM32 nào đó mà firmware được biên dịch. Các tên phản ánh chính xác các header CMSIS của ST: STM32F427xx, STM32F765xx, STM32H743xxSTM32N657xx tương ứng cho dòng M4, M7, H7 (H7 / H7 Plus / Pure Thermal) và OpenMV Cams N6. Toàn bộ tập tên có vài trăm ký hiệu mỗi dòng (271 trên M4, 306 trên M7, 494 trên H7, 594 trên N6); việc liệt kê chúng ở đây chỉ đơn giản là trùng lặp tài liệu tham khảo của ST và các header CMSIS.

Hai quy ước đặt tên được sử dụng:

  • Các hằng số được đặt tên theo phiên bản ngoại vi (GPIOA, USART1, TIM2, ...) là địa chỉ cơ sở tuyệt đối.

  • Các hằng số có tiền tố là loại ngoại vi (GPIO_BSRR, USART_CR1, TIM_CCR1, ...) là offset thanh ghi tương đối so với cơ sở tương ứng.

Cộng địa chỉ cơ sở tuyệt đối với offset thanh ghi để có địa chỉ đầy đủ của một thanh ghi đơn lẻ. Ví dụ stm.GPIOA + stm.GPIO_BSRR là địa chỉ tuyệt đối của GPIOA->BSRR.

Ví dụ:

import stm

# set PA2 high
stm.mem32[stm.GPIOA + stm.GPIO_BSRR] = 1 << 2

# read PA3
value = (stm.mem32[stm.GPIOA + stm.GPIO_IDR] >> 3) & 1

Hằng số tiêu biểu

Phần lựa chọn dưới đây bao gồm một mục cho mỗi danh mục ngoại vi chính, được chọn sao cho quy ước đặt tên rõ ràng ngay khi nhìn vào. Mọi ký hiệu CMSIS khác cho mục tiêu build cũng có sẵn trên mô-đun -- xem __getattr__() bên dưới để biết về fallback của trình kiểm tra kiểu.

stm.GPIOA: int

Địa chỉ cơ sở của ngoại vi GPIOA. GPIOB ... GPIOK (phạm vi phụ thuộc vào gói MCU) theo cùng mẫu.

stm.USART1: int

Địa chỉ cơ sở của ngoại vi USART1. Các phiên bản USART / UART khác được hiển thị dưới USART2, USART3, UART4 ... tùy theo sẵn có.

stm.SPI1: int

Địa chỉ cơ sở của ngoại vi SPI1. Các phiên bản SPI bổ sung xuất hiện dưới dạng SPI2, SPI3, ... cho đến số lượng của MCU.

stm.I2C1: int

Địa chỉ cơ sở của ngoại vi I2C1. I2C2 ... I2C4 theo sau.

stm.TIM1: int

Địa chỉ cơ sở của bộ định thời điều khiển nâng cao TIM1. Các bộ định thời đa năng và cơ bản (TIM2 ... TIM17 tùy theo sẵn có) theo cùng cách đặt tên.

stm.ADC1: int

Địa chỉ cơ sở của ADC1. ADC2 / ADC3 xuất hiện trên các MCU có nhiều khối ADC.

stm.DAC: int

Địa chỉ cơ sở của ngoại vi DAC, trên các MCU có trang bị.

stm.DMA1: int

Địa chỉ cơ sở của DMA1. DMA2 có mặt trên hầu hết các STM32; các chip dòng H7 cũng hiển thị BDMA, MDMA và (trên N6) HPDMA / GPDMA.

stm.RCC: int

Địa chỉ cơ sở của ngoại vi Reset and Clock Control.

stm.EXTI: int

Địa chỉ cơ sở của External Interrupt / Event Controller.

stm.FLASH: int

Địa chỉ cơ sở của bộ điều khiển flash nhúng (là ngoại vi, không phải mảng flash).

stm.SYSCFG: int

Địa chỉ cơ sở của System Configuration Controller.

stm.PWR: int

Địa chỉ cơ sở của ngoại vi Power Control.

stm.GPIO_BSRR: int

Offset của thanh ghi bit set/reset GPIO trong bất kỳ cơ sở GPIOx nào.

stm.GPIO_IDR: int

Offset của thanh ghi dữ liệu đầu vào GPIO.

stm.GPIO_ODR: int

Offset của thanh ghi dữ liệu đầu ra GPIO.

stm.USART_CR1: int

Offset của thanh ghi điều khiển 1 USART/UART.

stm.TIM_CR1: int

Offset của thanh ghi điều khiển 1 bộ định thời.

stm.TIM_CCR1: int

Offset của thanh ghi capture/compare 1 bộ định thời. TIM_CCR2 ... TIM_CCR4 theo sau trên các bộ định thời có nhiều kênh.

stm.RCC_CR: int

Offset của thanh ghi điều khiển clock RCC.

stm.RCC_CFGR: int

Offset của thanh ghi cấu hình clock RCC.

stm.__getattr__(name: str) int

Fallback thuộc tính động: bất kỳ ký hiệu CMSIS nào được firmware hiển thị mà không được liệt kê riêng ở trên (ví dụ: stm.FDCAN1, stm.OCTOSPI1, stm.GPIO_AFR, các shift và mask bit-field khác nhau, ...) vẫn phân giải thành địa chỉ tuyệt đối hoặc offset của nó dưới dạng int.

Mô-đun runtime điền trực tiếp các ký hiệu này vào dict globals của nó khi import, vì vậy __getattr__ thực sự không bao giờ được gọi. Chữ ký được hiển thị chỉ để các trình kiểm tra kiểu tĩnh (Pyright, Pylance, mypy) chấp nhận stm.<any CMSIS name> mà không có chẩn đoán "module has no attribute".