Site icon TAPIT

STM32F103 – Vấn đề ghi giá trị cho 1 chân GPIO_INPUT và GPIO_EXTI

Theo tài liệu Reference manual  cho dòng STM32F103xx của hãng STM thì khi 1 chân được cấu hình INPUT thì Output Buffer sẽ bị disable, điều này đồng nghĩa với việc hoạt động ghi giá trị Logic ra 1 chân thông qua thanh ghi ODR sẽ không được thực hiện.

Hình ảnh sơ đồ cấu trúc 1 chân khi được cấu hình là Input

Vấn đề: Tối nay, mình đã vô tình ghi giá trị vào 1 chân được cấu hình GPIO_EXTI (Input External Interrupt) và phát hiện  ra việc ghi giá trị đến 1 chân INPUT hoặc 1 chân EXTI đều làm thay đổi giá trị logic của chân đó. Mình rút gọn bài toán của mình 1 cách đơn giản như sau để mọi người dễ hình dung: 

Suy nghĩ của mình dựa vào reference manual:  

Thực tế khi chạy chương trình: 

Tiến hành Debug: 

Thử nghiệm: Đo giá trị logic trên chân PA10 trong 4 trường hợp, quan sát debugger và đo đạc bằng đồng hồ như sau:

Kết luận: Vì lý do việc thực hiện ghi giá trị cho 1 chân đã được cấu hình  INPUT hoặc EXTI là có tác dụng (không giống như mình hiểu theo reference manual), điều này dẫn đến trong lần đầu tiên nhấn nút, hàm phục vụ ngắt được thực hiện vì chân PA10 được khai báo trở kéo lên, có sườn xuống. Tuy nhiên, sau khi thực hiện xong chương trình phục vụ ngắt, tác động ghi mức 0 đến chân PA10 thì các lần tiếp theo không vào ngắt được nữa vì phần cứng không phát hiện thêm sự thay đổi mức logic từ mức cao xuống mức thấp (falling edge) nào nữa cả. 

Mình chia sẻ cùng mọi người trường hợp trên để tránh sau này có thể gặp phải khi vô tình thực hiện việc ghi dữ liệu đến 1 chân được cấu hình Input hoặc External Interrupt.
Các bạn cũng có thể 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.

[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

Nhóm TAPIT – ARM R&D