THỰC HÀNH NHẬP TRÌNH NHÚNG NÂNG CAO LẬP TRÌNH STM32 Khi mới bắt đầu tìm hiểu, nghiên cứu bất kỳ dòng vi điều khiển nào, GPIO luôn là phần kiến thức đầu tiên mà lập trình viên sử dụng, nghiên cứu. I. Lý thuyết Generalpurpose InputOutput (GPIO) rất phổ biến, là một chức năng ngoại vi cơ bản của mỗi loại vi điều khiển, bao gồm các chân đầu vào và chân đầu ra, có thể được điều khiển bởi người dùng. Nó tương tự với các dòng vi điều khiển 8bit như AVR, 8051, PIC. Không như các dòng vi điều khiển 8bit, chỉ có 8 chân IO trên 1 port, ở các vi điều khiển 32bit có đến 16 chân IO trên 1 port. Cụ thể đối với kit STM32F407VG, có 5 port chính là GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, trên mỗi port có các chân IO được ký hiệu 0 đến 15. Sơ đồ cấu trúc mỗi chân GPIO của chip: Có 2 khối điều khiển chính của mỗi GPIO (2 khối được vẽ đứt trong hình), đó chính là : • Input driver • Output driver Tài liệu tham khảo: Lập trình nhúng nâng cao P a g e | 2 Mai Cường Thọ tổng hợp và biên tập GPIO bao gồm 8 chức năng chính sau đây : Mặc định khi lập trình viên không cấu hình gì, trạng thái của các chân IO sẽ là Input Floating. Trong bài viết này, chúng ta sẽ sử dụng chức năng Output của GPIO, dưới đây là sơ lược về cấu trúc phần cứng của khối Output. 1. Các thanh ghi quan trọng của GPIO Mỗi chân GPIO đều có 2 thanh ghi cơ bản cấu hình 32 bit là (GPIOx_CRL – Control Register Low, GPIO_CRH – Control Register High) Chúng ta quan tâm đến 2 thanh ghi sau: ➢ GPIO port bit setreset register (GPIOx_BSRR) Thanh ghi này dùng để cấu hình các chân ở mức set (mức cao) hoặc reset (mức thấp) Tài liệu tham khảo: Lập trình nhúng nâng cao P a g e | 3 Mai Cường Thọ tổng hợp và biên tập GPIO port output data register (GPIOx_ODR) Dữ liệu sau khi các bit đã được setreset ở thanh ghi trên sẽ được truyền sang thanh ghi dữ liệu đầu ra 32bit (GPIOx_ODR: Output Data Register) và truyền đến khối điều khiển để xuất mức tín hiệu cho chân IO. Ngoài ra đối với thanh ghi này, chúng ta có thể đọc dữ liệu để xem trạng thái hiện tại của các chân IO đang ở mức “1” hoặc mức “0”. 2. Xuất tín hiệu output thông qua khối CMOS Khi một IO pin được cấu hình hoạt động với chức năng Output thì khối điều khiển Output driver được sử dụng với các chế độ : Open drain mode hoặc PushPull mode: • Open drain mode: Ở chế độ này, mạch sẽ không sử dụng PMOS (luôn khóa) và chỉ sử dụng NMOS. Khi một giá trị bit của thanh ghi ODR bằng 0 sẽ làm NMOS dẫn, lúc này chân vi điều khiển được kéo xuống GND và có mức logic thấp (mức 0). Một giá trị bit của thanh ghi ODR bằng 1 sẽ làm NMOS đóng, chân tương ứng sẽ ở trạng tháng HiZ (trở kháng cao).
2020 THỰC HÀNH LẬP TRÌNH NHÚNG NÂNG CAO Biện tập: Mai Cường Thọ 1/1/2020 Tài liệu tham khảo: Lập trình nhúng nâng cao BÀI 01: LẬP TRÌNH GIAO TIẾP GPIO CƠ BẢN Khi bắt đầu tìm hiểu, nghiên cứu dịng vi điều khiển nào, GPIO ln phần kiến thức mà lập trình viên sử dụng, nghiên cứu I Lý thuyết General-purpose Input/Output (GPIO) phổ biến, chức ngoại vi loại vi điều khiển, bao gồm chân đầu vào chân đầu ra, điều khiển người dùng Nó tương tự với dịng vi điều khiển 8bit AVR, 8051, PIC Không dịng vi điều khiển 8bit, có chân IO port, vi điều khiển 32bit có đến 16 chân IO port Cụ thể kit STM32F407VG, có port GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, port có chân I/O ký hiệu đến 15 Sơ đồ cấu trúc chân GPIO chip: Có khối điều khiển GPIO (2 khối vẽ đứt hình), : • • Input driver Output driver Page |1 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao GPIO bao gồm chức sau : Mặc định lập trình viên khơng cấu hình gì, trạng thái chân I/O Input Floating Trong viết này, sử dụng chức Output GPIO, sơ lược cấu trúc phần cứng khối Output Các ghi quan trọng GPIO Mỗi chân GPIO có ghi cấu hình 32 bit (GPIOx_CRL – Control Register Low, GPIO_CRH – Control Register High) Chúng ta quan tâm đến ghi sau: ➢ GPIO port bit set/reset register (GPIOx_BSRR) Thanh ghi dùng để cấu hình chân mức set (mức cao) reset (mức thấp) Page |2 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao GPIO port output data register (GPIOx_ODR) Dữ liệu sau bit set/reset ghi truyền sang ghi liệu đầu 32bit (GPIOx_ODR: Output Data Register) truyền đến khối điều khiển để xuất mức tín hiệu cho chân I/O Ngoài ghi này, đọc liệu để xem trạng thái chân IO mức “1” mức “0” Xuất tín hiệu output thơng qua khối CMOS Khi I/O pin cấu hình hoạt động với chức Output khối điều khiển Output driver sử dụng với chế độ : Open drain mode Push-Pull mode: • Open drain mode: Ở chế độ này, mạch không sử dụng P-MOS (luôn khóa) sử dụng N-MOS Khi giá trị bit ghi ODR làm N-MOS dẫn, lúc chân vi điều khiển kéo xuống GND có mức logic thấp (mức 0) Một giá trị bit ghi ODR làm N-MOS đóng, chân tương ứng trạng tháng Hi-Z (trở kháng cao) Page |3 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao • Push-pull mode : Ở chế độ mạch sử dụng P-MOS N-MOS Một giá trị bit ghi ODR làm N-MOS dẫn, P-MOS ngưng dẫn, lúc chân vi điều khiển có mức thấp ( nối với GND) Một giá trị bit ghi ODR làm N-MOS ngưng dẫn P-MOS dẫn Lúc chân vi điều khiển có mức cao (mức logic – nối với VDD) Như vậy, để điều khiển giá trị logic I/O pin cấu hình hoạt động với chức Output, cần ghi giá trị logic vào Output Data Register (GPIOx_ODR) Bit tương ứng ghi điều khiển pin vị trí tương ứng Ví dụ: bit thứ ghi GPIOB-ODR điều khiển chân PB0 II Lập trình Như giới thiệu trên, kit STM32F407VG có Port A, B, C, D, E, port có 16 chân ký hiệu từ đến 15 Để quan sát thay đổi tín hiệu chân, cách đơn giản kết nối chân với l đèn led Trên kit này, nhà sản xuất kết nối sẵn cho chân với đèn Led khác Đó chân PD12, PD13, PD14 PD15 1, Cấu hình với CubeMX: ❖ Bước 1: Khởi động CubeMX chọn dòng vi điều khiển muốn sử dụng Page |4 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao ❖ Bước 2: Chọn cổng/chân xuất liệu Tab PINOUT, chọn chân PD12, PD13, PD14, PD15 có chức “GPIO_Output” ❖ Bước Chọn nguồn xung cho Chip - 3.1 Cấu hình chip hoạt động với thạch anh ngoại gắn sẵn board mạch RCC → High Speed Clock (HSE) chọn “Crystal/Ceramic Resonator” ❖ Bước Cấu hình tần số cho chíp ngoại vi – Tab Clock Configuration Tiếp theo, tìm đến mục “Clock Configuration” tích chọn mục HSE (nguồn thạch anh ngồi), tín hiệu clock qua nhân tần PLLCLK giúp chip đạt tần số hoạt động tối đa Đặt Input frequency = (thạch anh hàn sẵn board loại 8Mhz) Sau điền “168” mục “HCLK” (đây tần số hoạt động tối đa chip) ấn Enter, đợi cho CubeMX tự tính tốn thơng số cịn lại Page |5 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao ❖ Bước Cấu hình cho chân GPIO - Tab “Configuration” Chúng ta chọn thông số cho GPIO : • • • • GPIO output level: Low (cấu hình ban đầu cho chân mức thấp) GPIO mode: Output Push Pull GPIO Pull-up/Pull-down: No pull-up and no pull-down (không cần điện trở kéo lên kéo xuống) Maximum output speed: High Page |6 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao ❖ Bước Cuối Setting cho Project sinh code: 6.1 Điền thông tin Project Name: tên muốn đặt cho project Project Location: Vị trí lưu project Toolchain/IDE: Bộ cơng cụ lập trình, ví dụ MDK-ARM V5 Page |7 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao 6.2 Tùy chọn sinh code Tab “Code Generator”, chọn “Copy only the necessary library files” để project có thư viện cần thiết, điều giúp tiết kiệm đáng kể dung lượng 6.3 Sinh code: Generate Code Open Project sau CubeMX sinh code xong Page |8 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao Lập trình với KeilC (MDK- ARM5) Tại mục Functions, file “stm32f4xx_hal_gpio.c” chứa hàm để điều khiển GPIO HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) cho phép đảo trạng thái l chân Ở truyền vào tham số, thứ Port cần sử dụng (GPIOx) tham số thứ chân IO cần sử dụng (GPIO_Pin) cụ thể là: HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); Ngồi xuất mức “1” mức “0” chân IO thông qua hàm: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); Hai hàm đặt trạng thái cho chân bất kỳ, “GPIO_PIN_SET” mức “1”, “GPIO_PIN_RESET” mức “0” Page |9 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao Center-aligned mode (up/down counting): chế độ đếm này, CNT bắt đầu tăng từ 0, đến giá trị ARR-1, sinh kiện tràn trên(counter overflow event) Sau CNT đạt giá trị ARR bắt đầu giảm giá trị 1, sinh kiện tràn dưới(counter underflow event) Cuối cùng, CNT giá trị trình lại tiếp tục Center-aligned mode với ARR=6 P a g e | 53 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao Một vài chức thường xuyên sử dụng Timer: Ngoại trừ Basic Timer có hoạt động đếm, Timers lại vi điều khiển cịn có nhiều chức khác, điển hình như: • • • • PWM Generation: Tính điều chế độ rộng xung (băm xung) One Pulse Mode: Tạo xung với độ rộng cấu hình được, CNT tự động dừng có kiện tràn Input Capture: Chế độ phát lưu lại xuất thay đổi mức logic (sườn lên/ sườn xuống) tín hiệu Từ đó, ta biết khoảng thời gian hai lần có sườn lên/ sườn xuống Output Compare: Đây chế độ giúp tạo kiện(ví dụ ngắt) CNT đạt đến giá trị lưu ghi TIMx_CCMRx (capture/compare mode register) Ứng dụng phổ biến Output Compare tạo nhiều xung PWM với tần số khác Timer II Lập trình với Timer (Basic Timer) Ở này, làm ví dụ đơn giản với Timer, dùng Timer để điều khiển LED sáng 1s, sau tắt 1s, lại sáng, tắt, … Lập trình tính nâng cao PWM, Input Capture, Output Compare, … nói đến sau Cấu hình Chip với Cube Mx: Mở phần mềm Cube Mx, chọn dòng chip bạn sử dụng Ở đây, ta chọn chip STM32F411VE P a g e | 54 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao Cấu hình Timer Clock Source cho Timer ta chọn Internal Clock, sang Tab cấu hình Clock, ta thấy thơng qua chia tần, cấu hình tần số cho Timer 16MHz Áp dụng công thức 𝑇𝑈𝐸𝑉 = 𝑃𝑒𝑟𝑖𝑜𝑑 = (1 + 𝐴𝑅𝑅) ∗ 𝑇𝐶𝐾𝐶𝑁𝑇 = (1 + 𝐴𝑅𝑅) ∗ (1 + 𝑃𝑆𝐶) 𝐹𝐶𝐾_𝑃𝑆𝐶 Như vậy, để thực toán, sáng/tắt LED sau 1s, TUEV=1 P a g e | 55 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao Với FCK_PSC=16MHz = 16.000.000 Hz; ta chọn PSC=1599, ARR = 9999 Bật ngắt cho Timer P a g e | 56 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao Cấu hình Project sinh mã, (Copy only the necessary library file) Một số hàm làm việc HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) Hàm HAL_TIM_Base_Start_IT hàm cho phép bắt đầu chạy TIM2 đồng thời Enable ngắt tràn cho TIM2, CNT TIM2 tăng giá trị đặt ARR (ví dụ 9999) reset đồng thời tạo ngắt tràn, triệu gọi thực chương trình phục vụ ngắt HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) Hàm HAL_TIM_PeriodElapsedCallback khai báo thư viện HAL hàm weak, có nghĩa cần code lại cụ thể chương trình P a g e | 57 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao P a g e | 58 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao Bài PWM VỚI STM32 PWM (Pulse Width Modulation) – Điều chế độ rộng xung/Băm xung: phương pháp điều chỉnh giá trị điện áp trung bình tải thiết bị động cơ, đèn LED,… từ làm thay đổi cơng suất thiết bị (tốc độ động cơ, độ sáng đèn,…) Điều thực cách thay đổi Duty Cycle xung tín hiệu điện áp ra, phương pháp dễ dàng tốn việc điều chỉnh thơng số dịng điện I Giới thiệu General Purpose Timer General Purpose Timer: loại Timer nhiều tính Basic Timer, có đầy đủ tính định thời đếm thời gian, tạo xung PWM, xử lí tín hiệu vào, so sánh đầu ra, … Các kênh Caputer/Campare: Mỗi timer có kênh Capture/Compare độc lập, kênh phối hợp Time-base unit tạo tính khác nhau: – Input caputer: Ở chế độ Input capture, ghi CRR kênh đầu vào tương ứng sử dụng để lưu giá trị CNT phát thay đổi mức logic (sườn lên/ sườn xuống) cấu hình trước Từ biết khoảng thời gian lần có sườn lên sườn xuống – Output compare: Chế độ thường sử dụng để điều khiển đầu I/O PIN timer đạt chu kỳ thời gian, giá trị CNT đếm tới giá trị với giá trị ghi capture/campare (đã nạp sẵn) Người dùng cài đặt I/O Pin tương ứng với giá trị logic: mức 1, mức đảo giá trị logic Đồng thời, cờ ngắt bật lên yêu cầu ngắt tạo người dùng cấu hình cho phép ngắt P a g e | 59 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao - PWM generation: Tính điều chế độ rộng xung cho phép tạo xung với tần số xác định giá trị ghi ARR, chu kỳ nhiệm vụ (Duty cycle) xác định giá trị ghi CCR (Capture Compare Register) II Lý thuyết PWM Phương pháp điều xung PWM (Pulse Width Modulation) phương pháp điều chỉnh điện áp tải, hay nói cách khác, phương pháp điều chế dựa thay đổi độ rộng chuỗi xung vuông, dẫn đến thay đổi điện áp • • Duty Cycle tỷ lệ phần trăm mức cao Period chu kỳ xung P a g e | 60 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao • Pulse Width (TON) thời gian mức cao chu kì Khi làm việc với STM32, tính PWM nằm khối Timer vi điều khiển Một số ghi quan trọng chế độ PWM Generation: TIMx prescaler (TIMx_PSC): Thanh ghi chứa giá trị chia xung clock cấp vào từ bus APB + TIMx counter register(TIMx_CNT): Thanh ghi lưu giá trị Counter (CNT) CNT[15:0] (Bit 15:0): Dãy bit lưu giá trị CNT + TIMx auto-reload register (TIMx_ARR): Trong chế độ PWM, ghi lưu giá trị độ phân giải xung PWM (ví dụ độ phân giải 100 LED có 100 mức độ sáng khác nhau) ARR[15:0] (Bit 15:0): Dãy bit lưu giá trị ARR + TIMx capture/compare register x (TIMx_CCRx): Giá trị ghi dùng để làm mốc so sánh với Counter CCR[15:0] (Bit 15:0): Dãy bit lưu giá trị CCR P a g e | 61 Mai Cường Thọ tổng hợp biên tập Tài liệu tham khảo: Lập trình nhúng nâng cao STM32F411 hỗ trợ chế độ PWM sau + Mode1: Nếu sử dụng chế độ đếm lên ngõ mức logic CNT CRR Nếu sử dụng chế độ đếm xuống, đầu mức CNT > CRR ngược lại, mức CNT < CRR + Mode2: Nếu sử dụng chế độ đếm lên ngõ mức logic CNT CRR Nếu sử dụng chế độ đếm xuống, đầu mức CNT > CRR ngược lại, mức CNT