GPIO là viết tắt của General Purpose Input Output, hiểu nôm na là cổng nhập / xuất.
Nhập có nghĩa là đọc tín hiệu vào, với chân digital thì tùy vào mức vôn gần với 0V hay gần với 3.3V mà sẽ trả về trạng thái là CAO hay THẤP. Ứng dụng để đọc trạng thái đầu vào, ví dụ đọc trạng thái của nút nhấn chẳng hạn.
Xuất có nghĩa là đưa tín hiệu ra, với chân digital thì ví dụ nếu lệnh xuất ra tín hiệu mức CAO lúc đó đo vôn ở chân tín hiệu là ~3.3V, nếu xuất ra tín hiệu mức THẤP thì đo vôn là ~0V. Ứng dụng để điều khiển các thiết bị ngoại vi, chẳng hạn để bật tắt đèn hay bật tắt một thiết bị nào đó khác.
Như vậy Digital GPIO có hai mức là CAO hoặc THẤP, hay 1 hoặc 0 tùy theo cách gọi.
Một số lưu ý khi thiết kế mạch cho digital IO:
- Khi cấp nguồn, vi điều khiển sẽ cần một khoảng thời gian (tuy rất ngắn) để khởi động. Khi đó các chân IO sẽ ở trạng thái điện áp không xác định. Hiện tượng này có thể xảy ra chẳng hạn khi vừa cấp nguồn vào vi điều khiển thì bóng đèn chớp 1 cái. Để giải quyết vấn đề này bạn sẽ cần phải lắp điện trở kéo lên hoặc kéo xuống tùy theo mong muốn để bảo đảm các chân IO hoạt động như mong muốn. Hiện nay các vi điều khiển thường tích hợp điện trở kéo lên hoặc kéo xuống và có thể lập trình chọn được có dùng điện trở hoặc không (open collector).
- Khi đọc tín hiệu vào, chẳng hạn đọc từ nút nhấn sẽ có hiện tượng bouncing tức là bạn sẽ thấy nút nhấn được nhấn nhả với tốc độ rất nhanh. Để giải quyết hiện tượng này bạn có thể lập trình trong code hoặc lắp thêm tụ vào nút nhấn, bạn có thể tìm hiểu thêm tài liệu trên mạng.
- Nếu chân xuất ở mức cao mà bạn nối chân đó trực tiếp vào GND thì chân đó của vi điều khiển sẽ bị chết, thậm chí có thể bị chết nguyên con VĐK. Để hạn chết tình trạng này thì bạn có thể mắc nối tiếp chân xuất với 1 điện trở hạn dòng.
Bài viết này chúng ta sẽ tìm hiểu cách dùng ngắt ngoài để đọc nút nhấn, và dùng hàm xuất tín hiệu để làm đèn led PC13 nhấp nháy
1. Trong STM32CubeMX, chọn Debug là Serial Wire, Enable UART1, chọn chân PC13, PC14 là GPIO_Output, PA1 là GPIO_EXTI1 (external interupt), PA2 là GPIO_Input.
2. Chọn bật EXT1 line1 interrupt và USART1 global interrupt trong NVIC configuration
3. Chân PA1 được chọn là sử dụng ngắt, nên khi có thay đổi từ mức thấp lên mức cao thì hàm HAL_GPIO_EXTI_Callback sẽ được gọi. Bạn có thể tìm hiểu thêm chẳng hạn thay vì bắt sự thay đổi khi chân từ mức thấp lên mức cao thì muốn bắt sự kiện khi đổi từ cao xuống thấp chẳng hạn thì cần phải config trong STM32CubeMX như thế nào.
Đoạn code như hình dưới đây sẽ bắt mỗi khi nhấn nút nhả ra thì sẽ gửi chuỗi "TRIGGERED" ra cổng UART1 bằng cách gọi hàm HAL_UART_Transmit.
4. Đoạn code dưới đây đặt trong vòng lặp chính của chương trình, có tác dụng là khi chân PA2 ở mức thấp thì sẽ nhấp nháy đèn led gắn với chân PC13. Hàm HAL_GPIO_ReadPin là để đọc mức logic của chân input. Còn hàm HAL_GPIO_TogglePin là để đảo mức logic của chân output, trong trường hợp này là làm đèn led đổi trạng thái.
Cuối cùng mã nguồn có thể tải về từ đây https://drive.google.com/open?id=1zftQkFr5mgIn3px9sdzd894di1orETld.
Nếu các bạn cần biết chi tiết làm thế nào để tạo project từ đầu, xin xem lại bài #1.
Nhập có nghĩa là đọc tín hiệu vào, với chân digital thì tùy vào mức vôn gần với 0V hay gần với 3.3V mà sẽ trả về trạng thái là CAO hay THẤP. Ứng dụng để đọc trạng thái đầu vào, ví dụ đọc trạng thái của nút nhấn chẳng hạn.
Xuất có nghĩa là đưa tín hiệu ra, với chân digital thì ví dụ nếu lệnh xuất ra tín hiệu mức CAO lúc đó đo vôn ở chân tín hiệu là ~3.3V, nếu xuất ra tín hiệu mức THẤP thì đo vôn là ~0V. Ứng dụng để điều khiển các thiết bị ngoại vi, chẳng hạn để bật tắt đèn hay bật tắt một thiết bị nào đó khác.
Như vậy Digital GPIO có hai mức là CAO hoặc THẤP, hay 1 hoặc 0 tùy theo cách gọi.
Một số lưu ý khi thiết kế mạch cho digital IO:
- Khi cấp nguồn, vi điều khiển sẽ cần một khoảng thời gian (tuy rất ngắn) để khởi động. Khi đó các chân IO sẽ ở trạng thái điện áp không xác định. Hiện tượng này có thể xảy ra chẳng hạn khi vừa cấp nguồn vào vi điều khiển thì bóng đèn chớp 1 cái. Để giải quyết vấn đề này bạn sẽ cần phải lắp điện trở kéo lên hoặc kéo xuống tùy theo mong muốn để bảo đảm các chân IO hoạt động như mong muốn. Hiện nay các vi điều khiển thường tích hợp điện trở kéo lên hoặc kéo xuống và có thể lập trình chọn được có dùng điện trở hoặc không (open collector).
- Khi đọc tín hiệu vào, chẳng hạn đọc từ nút nhấn sẽ có hiện tượng bouncing tức là bạn sẽ thấy nút nhấn được nhấn nhả với tốc độ rất nhanh. Để giải quyết hiện tượng này bạn có thể lập trình trong code hoặc lắp thêm tụ vào nút nhấn, bạn có thể tìm hiểu thêm tài liệu trên mạng.
- Nếu chân xuất ở mức cao mà bạn nối chân đó trực tiếp vào GND thì chân đó của vi điều khiển sẽ bị chết, thậm chí có thể bị chết nguyên con VĐK. Để hạn chết tình trạng này thì bạn có thể mắc nối tiếp chân xuất với 1 điện trở hạn dòng.
Bài viết này chúng ta sẽ tìm hiểu cách dùng ngắt ngoài để đọc nút nhấn, và dùng hàm xuất tín hiệu để làm đèn led PC13 nhấp nháy
1. Trong STM32CubeMX, chọn Debug là Serial Wire, Enable UART1, chọn chân PC13, PC14 là GPIO_Output, PA1 là GPIO_EXTI1 (external interupt), PA2 là GPIO_Input.
2. Chọn bật EXT1 line1 interrupt và USART1 global interrupt trong NVIC configuration
3. Chân PA1 được chọn là sử dụng ngắt, nên khi có thay đổi từ mức thấp lên mức cao thì hàm HAL_GPIO_EXTI_Callback sẽ được gọi. Bạn có thể tìm hiểu thêm chẳng hạn thay vì bắt sự thay đổi khi chân từ mức thấp lên mức cao thì muốn bắt sự kiện khi đổi từ cao xuống thấp chẳng hạn thì cần phải config trong STM32CubeMX như thế nào.
Đoạn code như hình dưới đây sẽ bắt mỗi khi nhấn nút nhả ra thì sẽ gửi chuỗi "TRIGGERED" ra cổng UART1 bằng cách gọi hàm HAL_UART_Transmit.
4. Đoạn code dưới đây đặt trong vòng lặp chính của chương trình, có tác dụng là khi chân PA2 ở mức thấp thì sẽ nhấp nháy đèn led gắn với chân PC13. Hàm HAL_GPIO_ReadPin là để đọc mức logic của chân input. Còn hàm HAL_GPIO_TogglePin là để đảo mức logic của chân output, trong trường hợp này là làm đèn led đổi trạng thái.
Cuối cùng mã nguồn có thể tải về từ đây https://drive.google.com/open?id=1zftQkFr5mgIn3px9sdzd894di1orETld.
Nếu các bạn cần biết chi tiết làm thế nào để tạo project từ đầu, xin xem lại bài #1.
Comments
Post a Comment