Bài viết này sẽ cung cấp hướng dẫn về chức năng Lowpower mode trong MCU STM32F103C8T6, MCU này có 2 miền điện áp:
- Miền 1.8V cấp cho: Core, Memory, Digital Peripheral
- Miền Vdd cấp cho: Những ngoại vi và chức năng còn lại
Power Suplies:
Thông thường các MCU sẽ cần mức điện áp từ 2.0->3.6V để hoạt động (VDD), kết hợp với một ổn áp được nhúng bên trong để cung cấp nguồn nội với mức điện áp 1.8V. Bộ hiệu chỉnh này mục đích sẽ lấy nguồn hoạt động từ 2.0-3.6V sau đó cấp 1.8V cho Core và Memories digital peripherals, điều này sẽ tránh làm nhiễu nguồn của MCU, và giữ mức điện áp ổn định 1.8V để MCU hoạt động.
Thông thường khối thời gian thực và các thanh ghi backup có thể được cấp nguồn VDD nhưng nếu khi bộ nguồn VDD bị mất đi thì lúc này MCU sẽ tự động chuyển mạch sang VBAT để cấp cho khối này.
[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]
Voltage Regulator (Bộ hiệu chỉnh điện áp)
Bộ hiệu chỉnh điện áp luôn được bật sau khi Reset. Mục đích nó dùng để cung cấp nguồn ở các chế độ hoạt động của MCU, cụ thể nó bộ hiệu chỉnh này có 3 chế độ hoạt động khác nhau tùy thuộc vào ứng dụng của MCU:
Run mode: Bộ hiệu chỉnh này sẽ cung cấp full power 1.8V (core, memories and digital peripherals)
Stop mode: Bộ hiệu chỉnh sẽ cung cấp low power 1.8V để bảo quản nội dung của các thanh ghi và SRAM
Standby mode: Bộ hiệu chỉnh này sẽ hoàn toàn bị tắt, nội dung trong các thanh ghi và SRAM sẽ bị mất đi. Nếu trước lúc vào chế độ Standby mode bạn có ghi các dữ liệu vào Backup domain thì khi vào chế độ Standby mode, hệ thống sẽ tự chuyển mạch sáng VBAT để lưu trữ dữ liệu của bạn.
Bảng đồ Clock:
- Sleep mode:
Entering sleep mode
Để có thể đưa MCU vào chế độ sleep mode thì chúng ta cần thi hành câu lệnh WFI(wait for interrupt) hoặc WFE(wait for event). Có sẵn hai sự lựa chọn để chúng ta chọn cơ chế vào chế độ Sleep mode, việc chọn option này hay option kia phụ thuộc vào bit SLEEPONEXIT trong thanh ghi System Register Control.
Sleep-now: Nếu bit SLEEPONEXIT bị clear, thì MCU sẽ vào mode Sleep mode ngay khi câu lệnh WFI hoặc WFE được thi hành.
Sleep-on-exit: Nếu bit SLEEPONEXIT được set, MCU sẽ chuyển sang mode Sleep mode ngay khi nó thoát khỏi ISR(Interrupt service routine) ưu tiên thấp nhất.
Trong Sleep mode, tất cả các chân I/O đều giữ trạng thái như trong Run mode.
Nếu câu lệnh WFI được sử dụng để vào chế độ Sleep mode, bất cứ xác nhận ngắt ngoại vi bởi các bộ điều khiển vector ngắt (NVIC) đều có thể đánh thức MCU dậy từ Sleep mode. Giả sử rằng nếu hệ thống của bạn đang chạy đợi nhận dữ liệu từ ngắt nhận UART, trong quá trình chưa nhận dữ liệu thì chúng ta sẽ cho vào chế độ Sleep mode để tiết kiêm năng lượng cho hệ thống. Khi dữ liệu đến tại chân RX của UART thì sẽ sinh ra ngắt UART từ đó đánh thức MCU dậy hoạt động trở lại bình thường.
Nếu câu lệnh WFE được sử dụng để vào chế độ Sleep mode, thì MCU thoát khỏi Sleep mode ngay khi có 1 sự kiện xảy ra. Sự kiện đánh thức có thể được tạo bởi:
- Bật một bit ngắt trong thanh ghi điều khiển ngoại vi, bật bit SEVONPEND trong thanh ghi System Control register. Khi mà MCU trở lại từ WFE, bit cờ ngắt ngắt ngoại vi hoặc bit NVIC IRQ channel phải bị xóa.
- Cấu hình một chân một sự kiện dòng ngắt ngoài hoặc ngắt nội như là timer. Khi mà khi mà MCU trở lại từ WFE, thì không cần phải xóa cờ ngắt hoặc bit chờ xử lý NVIC IRQ channel như là các bit tương ứng khi bit đang chờ xử lý tương ứng với dòng event chưa được set
Chế độ này cung cấp thời gian đánh thức thấp nhất vì không bị lãng phí thời gian trong việc entry/exit
Như đã thấy trên hình:
Để vào mode Sleep mode thì ban đầu clear bit SLEEPONEXIT, chọn vào mode sleep mode thông qua WFI hay WFE
Để thoát khỏi Sleep mode thì nếu WFI được sử dụng thì sẽ đợi cho Interrupt xảy ra, còn nếu WFE được sử dụng thì sẽ đợi cho 1 sự kiện đánh thức xảy ra
Trong ví dụ Sleepmode này chúng ta sẽ sử dụng chân PC13 để thực hiện viện nhấp nháy trong vòng lặp while(1) trong hàm main, chân PA0 dùng chức năng ngắt ngoài để đánh thức MCU dậy từ Sleepmode.
Bước 1:
Tạo project sau đó cấu hình chân nạp dữ liệu SWD
Bước 2:
Click vào PA0 chọn chức năng GPIO_EXTI0
Bước 3:
Chọn chân PC13 là chân GPIO_Output
Bước 4:
Click vào PA0-WKUP sau đó tại:
GPIO Pull-up/Pull-down: Pull-up, ở đây tại chân PA0 sẽ được kéo lên nguồn Vcc = 3.3v
GPIO Mode chúng ta chọn External Interrupt Mode with Falling edge trigger detection, ở đây chân PA0 xảy ra sự kiện ngắt ngoài theo cạnh xuống khi nó được kéo xuống mức 0 thức là từ 3.3v->0v.
Bước 5:
- Click vào Project sau đó Setting
- Đặt tên cho project
- Chọn công cụ lập trình MDK-ARM V5
Bước 6:
- Click vào Code Generator
- Chọn Copy only the necessary libraries files
Bước 7:
Sau đó sinh code và mở project trên KeilC
Bước 8:
Ở trong vòng while ta cho nhấp nháy led PC13 5 lần sau đó mới vào chế độ Sleepmode
Bước 9:
Tiếp theo click vào Function và mở rộng smt32f1xx_hal.c
Bước 10:
Ở đây chúng sẽ sử dụng hàm HAL_SuspendTick();, mục đích sử dụng hàm này là gì?
Như lý thuyết ở trên đã nói, khi vào chế độ Sleepmode, thì MCU sẽ bị đánh thức dậy với bất cứ sự kiện ngắt nào được sinh ra trong quá trình MCU sleep. Khi sinh code từ CubeMX thì có một bộ Timebase source được tự động sinh ra gọi là SysTick, SysTick này ứng dụng có các hàm HAL_Delay(); và sẽ sinh ra ngắt 1ms 1 lần, nếu chúng ta vẫn cứ cho SysTick chạy thì sẽ làm MCU không vào chế độ Sleepmode sau đó thoát ra rất nhanh vì vậy chúng ta phải sử dụng hàm treo SysTick.
Bước 11:
- Tiếp theo click vào function, mở stm32fxx_hal_pwr.c ở đây chúng ta sẽ sử dụng hàm HAL_PWR_EnterSLEEPMode để vào chế độ Sleepmode.
- Thông số đầu tiên là PWR_MAINREGULATOR_ON: Ở đây chúng ta vẫn bật bộ Voltage Regulator để sinh ra điện áp 1.8 cung cấp cho Core, Memory, Digital pheripherals
- Thông số tiếp theo là PWR_SLEEPENTRY_WFI: Đợi cho sự kiện ngắt để Enter Sleepmode
Bước 12:
Khi chạy qua hàm HAL_PWR_EnterSLEEPMode, chính thức MCU vào chế độ Sleepmode này, nếu muốn đánh thức MCU dậy thì bạn kéo chân PA0 xuống mức “0”. Lúc này chúng ta sử dụng hàm HAL_ResumeTick(); để tắt việc treo System.
Bước 13:
Khi đã được đánh thức dậy, chương trình sẽ tiếp tục thực thi xuống vòng lặp while(1) và nhấp nháy led PC13
Chúc các bạn thành công!
Xem thêm: Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây.
Nhóm TAPIT ARM R&D