BÀI 10: DMA VỚI STM32F1.



  1. Giới thiệu sơ lược về DMA.
  2. DMA – Direct memory access(DMA) được sử dụng với mục đích truyền data với tốc độ cao từ thiết bị ngoại vi đến bộ nhớ cũng như từ bộ nhớ đến bộ nhớ. Data được truyền với tốc độ cao hơn khi sử dụng DMA do không cần nhiều lệnh xử lý từ CPU. Điều đó làm cho tài nguyên CPU được rảnh rỗi cho các hoạt động khác.
    Ở STM32F103C8 chỉ có 1 bộ DMA với 7 kênh hỗ trợ cho các chức năng như: ADC1, SPI, USART, I2C, TIM1 -> TIM4.
    Chức năng chính:
    • 7 channel của kênh DMA1 có thể được cấu hình riêng biệt.
    • Mỗi channel được kết nối để dành riêng cho tín hiệu DMA từ các thiết bị ngoài hay tín hiệu nội bên trong MCU.
    • Có 4 mức ưu tiên có thể lập trình cho mỗi channel.
    • Kích thước data được sử dụng là 1 byte, 2 byte(half word) hoặc 4 byte(word).
    • Hỗ trợ việc lặp lại liên tục data.
    • Có 3 ngắt sự kiện(truyền xong DMA half word, word và truyền DMA bị lỗi).
    • Có 2 loại truyền dữ liệu là ngoại vi với bộ nhớ và bộ nhớ với bộ nhớ.
    • Quyền truy cập tới Flash, SRAM, APB1, APB2, APB.
    • Số lượng data có thể lên đến 65535.
  3. Cấu hình sử dụng thư viện chuẩn ST.
  4. Vd: cấu hình bộ ADC sử dụng DMA.
    Chương trình con cấu hình DMA cho bộ ADC1:
    • DMA1_channel1 : channel 1 tương ứng với DMA của bộ ADC.
    • ADC1_DR_Address: địa chỉ của thanh ghi chứa Data trong bộ ADC.
    • (uint32_t)&ADC_value : địa chỉ của biến chứa giá trị ADC đọc về.
    • DMA_DIR_PeripheralSRC: chiều dữ liệu được truyền là từ ngoại vi.
    • 1 : số lượng data truyền là 1.
    • DMA_PeripheralInc_Disable : không cho phép tăng địa chỉ của ngoại vi vì data chỉ có 1.
    • DMA_MemoryInc_Disable : không cho phép tăng địa chỉ của bộ nhớ vì data chỉ có 1.
    • DMA_PeripheralDataSize_HalfWord: số bit của data ngoại vi là 16 bit.
    • DMA_MemoryDataSize_HalfWord : số bit của data bộ nhớ là 16 bit.
    • DMA_Mode_Circular: cho phép data liên tục chuyển đổi.
    • DMA_Priority_High: mức độ ưu tiên của channel là mức cao.
    • DMA_M2M_Disable: không cho phép sử dụng DMA giữa bộ nhớ và bộ nhớ.
    Channel của bộ DMA1 phụ thuộc vào chức năng được sử dụng và được tra trong bảng sau:
  5. Một vài thanh ghi quan trọng.
    1. DMA_CCRx – DMA channel x configuration register.
      • MEM2MEM: cho phép truyền DMA từ bộ nhớ đến bộ nhớ.
      • PL[1:0] : mức ưu tiên của channel tương ứng 00: thấp nhất, 11 cao nhất.
      • MSIZE[1:0] : kích thước của bộ nhớ 00,01,10 tương ứng 8 bit, 16 bit, 32 bit.
      • PSIZE[1:0] : kích thước ngoại vi 00,01,10 tương ứng 8 bit, 16 bit, 32 bit.
      • MINC: có cho phép mode tăng địa chỉ bộ nhớ hay không.
      • PINC: có cho phép mode tăng địa chỉ ngoại vi hay không.
      • CIRC: có cho phép việc chuyển đổi được diễn ra liên tục hay không.
      • TEIE: cho phép ngắt khi có lỗi trong quá trình truyền hay không.
      • HTIE: cho phép ngắt khi truyền xong data ở chế độ half word.
      • TCIE: cho phép ngắt khi truyền xong data ở chế độ word.
      • EN : cho phép bộ DMA hoạt động hay không.
    2. DMA_CNDTRx – DMA channel x number of data register.
    3. Thanh ghi này có giá trị là 16 bit tương ứng với 65535, chứa số lượng data truyền.
    4. DMA_CPARx – DMA channel x pheripheral address register.
    5. Thanh ghi này là thanh ghi 32 bit chứa địa chỉ của ngoại vi.
    6. DMA_CMARx – DMA channel x memory address register.
    7. Thanh ghi này là thanh ghi 32 bit chứa địa chỉ của bộ nhớ.

  6. Bài tập.
    1. Viết chương trình đọc giá trị ADC trên channel 0 ở kênh ADC1 sử dụng chế độ DMA. Debug chương trình để quan sát giá trị ADC đọc về.
    2. Viết chương trình đọc ADC trên channel 0 kênh ADC1 để thay đổi PWM của TIM1 channel1. TIM1 được cấu hình ở chế độ DMA.


Link tải chương trình sử dụng DMA với ADC
Link tải chương trình sử dụng DMA với TIMER