GPIO là viết tắt của General Purpose Input Output là một trong những thuật ngữ phổ cập nhất mà bạn hoàn toàn có thể đã gặp. Khi bạn mở màn việc làm trong một mạng lưới hệ thống nhúng, đây là từ tiên phong bạn phải nghe nói đến. Nhưng bạn có nghĩ rằng bạn đã nắm vững toàn bộ những khái niệm tương quan đến GPIO ? Tín hiệu trên những chân GPIO được cho phép tất cả chúng ta đạt được công dụng cuối của mình và được cho phép tất cả chúng ta chuyện trò với quốc tế bên ngoài. Trong bài viết này, tôi sẽ đi sâu về những khái niệm khác nhau tương quan đến GPIO. Ở cuối bài viết này, bạn sẽ hoàn toàn có thể vấn đáp gpio là gì, những loại GPIO hoàn toàn có thể được sử dụng là gì, cách thông số kỹ thuật gpio để tiết kiệm ngân sách và chi phí điện năng, ảnh hưởng tác động của vận tốc GPIO đến phát xạ EMI của bo mạch, khóa gpio để ngăn việc thông số kỹ thuật lại ngẫu nhiên, … Là một kỹ sư ứng dụng, bạn phải nắm vững những khái niệm này vì hầu hết việc làm của bạn sẽ là viết mã bare metal hoặc mã driver và là một nhà tăng trưởng ứng dụng nhúng, bạn nên biết những khái niệm này theo thứ tự để hiểu những tính năng cốt lõi được phân phối bởi GPIO API và nếu có gì đó bị hỏng, bạn hoàn toàn có thể nhanh gọn sửa chữa thay thế ở cấp driver .

GPIO là gì?

 

GPIO là một chân tín hiệu kỹ thuật số trên mạch tích hợp mà hành vi của nó ( nguồn vào hoặc đầu ra ) được điều khiển và tinh chỉnh bởi ứng dụng ứng dụng. GPIO về cơ bản là một chân hoàn toàn có thể được thông số kỹ thuật làm đầu vào hoặc đầu ra. Nếu tất cả chúng ta thông số kỹ thuật chân như một đầu ra, tất cả chúng ta hoàn toàn có thể ghi 0 ( LOW ) hoặc 3,3 / 5 V ( VDD ) vào chân đó. Khi được thông số kỹ thuật làm đầu vào, tất cả chúng ta hoàn toàn có thể đọc tín hiệu trên chân đó. GPIO là giao diện tiêu chuẩn mà qua đó vi tinh chỉnh và điều khiển hoàn toàn có thể tiếp xúc với quốc tế bên ngoài. Nó hoàn toàn có thể được sử dụng để đọc những giá trị từ cảm ứng analog hoặc kỹ thuật số, điều khiển và tinh chỉnh đèn LED, điều khiển và tinh chỉnh đồng hồ đeo tay cho tiếp xúc I2C, …

Bản đồ bộ nhớ của ngoại vi GPIO

Như tất cả chúng ta đã biết rằng vi điều khiển và tinh chỉnh tân tiến sử dụng kỹ thuật map bộ nhớ để ánh xạ tổng thể những thiết bị ngoại vi trong một khoảng trống bộ nhớ thống nhất. Vì bộ điều khiển và tinh chỉnh STM32F446RE là bộ vi tinh chỉnh và điều khiển dựa trên ARM Cortex M4 nên khoảng trống bộ nhớ cho những thiết bị ngoại vi được ARM dành riêng như biểu lộ trong hình :

Địa chỉ bộ nhớ trong khoảng chừng từ 0x40000000 đến 0x600000000 hoàn toàn có thể được nhà cung ứng vi điều khiển và tinh chỉnh sử dụng để ánh xạ những thiết bị ngoại vi khác nhau của họ. Vùng này được chia thành nhiều vùng phụ, mỗi vùng được ánh xạ tới một thiết bị ngoại vi đơn cử, như biểu lộ trong hình bên dưới. Từ góc nhìn lập trình viên, tất cả chúng ta cần tìm ra địa chỉ mà một thiết bị ngoại vi đơn cử được ánh xạ trong dải địa chỉ này. Datasheet của vi tinh chỉnh và điều khiển sẽ cung ứng địa chỉ một thiết bị ngoại vi đơn cử được ánh xạ. Trong trường hợp của tất cả chúng ta, như tất cả chúng ta hoàn toàn có thể thấy trong hình bên dưới, thiết bị ngoại vi GPIO được ánh xạ trong dải địa chỉ 0x40020000 đến 0x40021 FFF. Đây cũng là vùng băng tần bit ( tất cả chúng ta sẽ tìm hiểu và khám phá về điều này sau ) .

Như tất cả chúng ta thấy, GPIO ngoại vi được chia thành GPIO A, GPIO B, GPIO C, GPIO D, GPIO E, GPIO F, GPIO G, GPIO H và mỗi cổng chứa tối đa 16 chân. Ngoại vi GPIOA được ánh xạ từ địa chỉ 0x40020000 đến 0x400203 FF và nó quản trị tổng thể những chân liên kết với PORT-A .

Mẫu vi giải quyết và xử lý ARM Cortex M-4 có bus tài liệu rộng 32 bit, bus địa chỉ và tập thanh ghi rộng 32 bit. Trên thực tiễn, mỗi từ có size 32 – bit. Biết được bus tài liệu, bus địa chỉ và chiều rộng thanh ghi là rất quan trọng vì nó sẽ giúp hiểu mọi thứ ở Lever rất thấp ( cơ bản ) tức là Lever trình điều khiển và tinh chỉnh. Vì tất cả chúng ta biết rằng size từ là 4 byte, do đó tất cả chúng ta hoàn toàn có thể nói rằng mọi thanh ghi của ngoại vi GPIO dài 4 byte .

Cho đến giờ đây, tất cả chúng ta đã tìm ra địa chỉ cơ sở của những thiết bị ngoại vi GPIO. Đó là điều tiên phong bạn sẽ làm với tư cách là một lập trình viên bất kể khi nào bạn định lập trình bất kể thiết bị ngoại vi nào là tìm địa chỉ cơ sở của thiết bị ngoại vi. Bây giờ, tất cả chúng ta cần biết địa chỉ thanh ghi đúng chuẩn để lập trình những thanh ghi. Trước khi mở màn lập trình những thanh ghi, tất cả chúng ta phải hiểu mục tiêu của những thanh ghi này. Hãy đi sâu vào tập hợp thanh ghi GPIO !

Thanh ghi GPIO

Tất cả những GPIO có trong vi tinh chỉnh và điều khiển được nhóm lại thành Cổng X trong đó X là A, B, C, D …

Mỗi cổng trong STM32F446RE gồm có 16 chân. Mỗi chân có nhiều thanh ghi khác nhau được link với nó, bằng cách đổi khác nội dung của những thanh ghi, tất cả chúng ta hoàn toàn có thể trấn áp hành vi của một chân đơn cử .

Trong STM32F446RE, hành vi của mỗi chân hoàn toàn có thể được trấn áp bằng cách sử dụng :

Thanh ghi chính sách GPIO
Thanh ghi loại đầu ra GPIO
Thanh ghi vận tốc GPIO
Thanh ghi kéo lên / kéo xuống GPIO
Thanh ghi tài liệu nguồn vào GPIO
Thanh ghi tài liệu đầu ra GPIO
Thanh ghi set / reset bit GPIO
Thanh ghi khóa thông số kỹ thuật GPIO
Thanh ghi tính năng thay thế sửa chữa GPIO
Chúng ta sẽ xem xét những tính năng được Giao hàng bởi từng thanh ghi này trong bài viết này. Hiểu công dụng của những thanh ghi này là rất quan trọng vì nó sẽ giúp bạn trấn áp chân theo nhu yếu của bạn. Ngoài ra, nếu bạn muốn viết driver GPIO của riêng mình, bạn sẽ đa phần viết những hàm cốt lõi để lập trình những thanh ghi này và cung ứng API trừu tượng cho những ứng dụng người dùng sử dụng driver của bạn .

Chi tiết về thanh ghi GPIO

Thanh ghi chính sách GPIO – Thanh ghi này được sử dụng để chọn chính sách của chân cắm. Có bốn chính sách hoàn toàn có thể được lập trình vào thanh ghi này : Chế độ nguồn vào, Chế độ đầu ra mục tiêu chung, Chế độ công dụng sửa chữa thay thế và Chế độ analog. Khi ứng dụng muốn đọc bất kỳ dữ liệu nào từ bên ngoài như cảm ứng, nó đã định thông số kỹ thuật chân cắm làm đầu vào. Mỗi chân có một bộ đệm nguồn vào tương ứng mà ứng dụng hoàn toàn có thể đọc được khi chân đó đang hoạt động giải trí ở Chế độ INPUT. Chế độ Đầu ra Mục đích Chung được sử dụng khi tất cả chúng ta muốn ghi giá trị THẤP hoặc CAO vào chân. Ví dụ : nếu tất cả chúng ta liên kết một đèn LED với một chân và tất cả chúng ta muốn bật đèn LED, ứng dụng sẽ thông số kỹ thuật chân đó là đầu ra và ghi HIGH ( VDD ) vào chân. Mỗi chân có một bộ đệm đầu ra tương ứng hoàn toàn có thể được ghi bởi ứng dụng, trong trường hợp này, tất cả chúng ta đang ghi 1 vào bộ đệm đầu ra. Chế độ tính năng thay thế sửa chữa được sử dụng khi tất cả chúng ta muốn gán một chân đơn cử cho bất kể thiết bị ngoại vi nào khác. Hãy chia nhỏ ra một cách đơn thuần dễ hiểu với một ví dụ đơn thuần. Ví dụ : Nếu bạn muốn sử dụng tiếp xúc I2C, bạn sẽ cần hai chân là SDA và SCL. Bạn cần chọn 1 số ít chân đơn cử do nhà sản xuất vi tinh chỉnh và điều khiển cung ứng, hoàn toàn có thể được sử dụng như dòng I2C SDA và SCL. Bạn hoàn toàn có thể lấy thông tin này từ datasheet thiết bị. Trong bảng dưới đây, bạn hoàn toàn có thể thấy rằng so với SCL ngoại vi I2C1, bạn hoàn toàn có thể sử dụng Cổng B Chân 6 trong Chức năng Thay thế ( AF ) 4 .

Từ sơ đồ trên, bạn hoàn toàn có thể thấy rằng nhà phân phối thiết bị đã ánh xạ 1 số ít chân đơn cử nhất định sẽ được sử dụng bởi những thiết bị ngoại vi khác nhau. Do đó, trong ví dụ của tất cả chúng ta, Cổng B Chân 6 nên được thông số kỹ thuật ở chính sách tính năng Thay thế để nó hoàn toàn có thể được sử dụng bởi thiết bị ngoại vi I2C1. Nếu bạn muốn gán những chân cho thiết bị ngoại vi ADC ( Analog to Digital Converter ) hoặc DAC ( Digital to Analog convertor ), bạn nên định thông số kỹ thuật chính sách là chính sách Analog .

Thanh ghi loại đầu ra GPIO – Thanh ghi này được viết bởi phần mềm để cấu hình loại đầu ra của chân. Có thể có hai loại đầu ra: Đầu ra push-pull và Đầu ra open-drain. Để hiểu sự khác biệt giữa đầu ra push-pull và đầu ra open-drain, chúng ta cần hiểu cách chân gpio được thực hiện về mặt cổng transistor. Là một kỹ sư nhúng, bạn nên hiểu rõ về sự khác biệt giữa hai cấu hình này. 

Hãy tìm hiểu và khám phá phương pháp hoạt động giải trí của chính sách nguồn vào và đầu ra ở Lever mạch. Hình dưới đây cho thấy cách thực thi đơn thuần của chân GPIO trong vi tinh chỉnh và điều khiển .

Mỗi chân gồm có hai bộ đệm – bộ đệm nguồn vào và đầu ra cùng với một dòng enable. Khi dòng enable là 0, bộ đệm đầu ra được kích hoạt và bộ đệm đầu vào sẽ bị vô hiệu. Bộ đệm đầu ra về cơ bản là hai transistor CMOS được liên kết theo kiểu bên dưới .

 

Khi tất cả chúng ta ghi 1 từ ứng dụng, inverter tiên phong sẽ đặt nó là 0 và mạch PMOS ( T1 ) sẽ hoạt động giải trí ( NMOS ( T2 ) sẽ bị vô hiệu ) do đó chân sẽ được kéo lên VCC. Khi tất cả chúng ta ghi 0 từ ứng dụng, biến tần tiên phong sẽ đặt nó là 1 và NMOS sẽ được kích hoạt do đó chân sẽ được kéo xuống 0. Đây là thông số kỹ thuật mặc định của chân GPIO và còn được gọi là đầu ra push-pull .

Nếu tất cả chúng ta đặt dòng enable là 1, thì chân sẽ được thông số kỹ thuật ở chính sách nguồn vào bằng cách kích hoạt bộ đệm nguồn vào. Bộ đệm nguồn vào gồm có hai transistor CMOS được liên kết theo kiểu dưới đây :

Khi chân đọc 1 ( CAO ), inverter sẽ hòn đảo mức logic cao này về 0 và transistor T1 PMOS sẽ BẬT. Vì nó được kéo lên VCC, ứng dụng đọc logic là 1. Khi chân đọc 0 ( LOW ), inverter hòn đảo mức logic thấp này thành 1 và T2 NMOS sẽ được kích hoạt và nó sẽ được kéo xuống 0, do đó ứng dụng đọc 0. Dòng kích hoạt này được thông số kỹ thuật bởi ứng dụng .

Trong chính sách open-drain đầu ra, transistor PMOS trên cùng không xuất hiện. Sơ đồ trông giống như sau :

 

Khi T2 bật, chân sẽ được kéo xuống mức thấp ( gnd ). Khi T2 tắt, drain ( D ) của transistor sẽ nổi hoặc mở, do đó đầu ra sẽ nổi. Do đó, thông số kỹ thuật open-drain chỉ hoàn toàn có thể kéo chân xuống, không hề kéo chân lên. Vì open-drain chỉ có hai mức logic, logic 0 hoặc nổi, bạn cần phân phối năng lực kéo lên cho chân này bằng cách kích hoạt điện trở kéo lên bên trong ( hoàn toàn có thể được thực thi trải qua thanh ghi GPIO ) hoặc đưa điện trở kéo lên bên ngoài. Trong 1 số ít thiết bị ngoại vi, GPIO được định thông số kỹ thuật là open-drain, ví dụ, thiết bị ngoại vi I2C định thông số kỹ thuật những chân SDA và SCL trong thông số kỹ thuật open-drain .

Thanh ghi vận tốc GPIO – Tốc độ này không tương quan gì đến tần số chuyển mạch. Tốc độ nhanh hơn không có nghĩa là vận tốc quy đổi GPIO cao hơn ( số lần một chân chuyển từ BẬT sang TẮT theo đơn vị chức năng thời hạn ). Tham số vận tốc này chỉ đơn thuần xác lập vận tốc quay của GPIO, tức là vận tốc nó hoàn toàn có thể đi từ mức 0V đến mức VDD và ngược lại .

 

Làn sóng màu đỏ là đường cong quy đổi lý tưởng từ 0 sang 1 nhưng trong thực tiễn, tất cả chúng ta chỉ nhận được làn sóng màu xanh lá cây. Tăng thông số kỹ thuật vận tốc sẽ chuyển dời đường cong màu xanh lá cây sang trái sang đường màu đỏ. Lưu ý : Việc tinh chỉnh và điều khiển chân ở vận tốc cao hơn cũng tác động ảnh hưởng đến sự phát xạ EMI tổng thể và toàn diện của bo mạch .

Thanh ghi kéo lên / kéo xuống GPIO – Sử dụng thanh ghi này, tất cả chúng ta hoàn toàn có thể bật / tắt điện trở kéo lên và kéo xuống của một chân nhất định .
Thanh ghi tài liệu nguồn vào GPIO – Chúng ta hoàn toàn có thể sử dụng thanh ghi này để đọc trạng thái nguồn vào ( logic ) trên chân. Tuy nhiên, nó chỉ hoàn toàn có thể được đọc dưới dạng 4 byte, do đó tất cả chúng ta cần phải che tổng thể những bit khác để trích xuất bit chăm sóc của tất cả chúng ta .
Thanh ghi tài liệu đầu ra GPIO – Thanh ghi này được sử dụng để thiết lập / thiết lập lại logic trên chân đầu ra. Để đẩy chân lên cao, ứng dụng ghi 1 vào bit đơn cử của thanh ghi này tương ứng với chân đơn cử .
Thanh ghi set / reset bit GPIO – Thanh ghi này được cho phép ứng dụng thiết lập và đặt lại từng bit riêng không liên quan gì đến nhau trong thanh ghi tài liệu đầu ra GPIO. Sử dụng thanh ghi này để đổi khác giá trị của những bit riêng không liên quan gì đến nhau trong thanh ghi tài liệu đầu ra là một hiệu ứng ” một lần ” tức là nó cung ứng một cách triển khai giải quyết và xử lý theo từng bit nguyên tử .
Thanh ghi khóa thông số kỹ thuật GPIO – Thanh ghi này được sử dụng để khóa thông số kỹ thuật của chân port cho đến lần thiết lập lại tiếp theo. Có một trình tự đơn cử trong đó thanh ghi này cần được ghi để kích hoạt khóa .
Thanh ghi tính năng thay thế sửa chữa GPIO – Thanh ghi này được sử dụng để định thông số kỹ thuật những chân gpio làm những tính năng thay thế sửa chữa, tức là những chân này hoàn toàn có thể được sử dụng bởi những thiết bị ngoại vi khác trong bộ vi điều khiển và tinh chỉnh. Tuy nhiên, một chân đơn cử chỉ hoàn toàn có thể được link với một thiết bị ngoại vi tại một thời gian. Hầu hết những chân I / O được liên kết với những thiết bị ngoại vi trên bo mạch trải qua một bộ ghép kênh được cho phép chỉ một tính năng sửa chữa thay thế của một thiết bị ngoại vi được liên kết với một chân I / O tại một thời gian, bảo vệ rằng không hề có xung đột giữa những thiết bị ngoại vi san sẻ cùng một chân I / O. Mỗi chân I / O có một bộ ghép kênh với 16 đầu vào công dụng sửa chữa thay thế ( AF0 đến AF15 ) hoàn toàn có thể được chọn bằng cách sử dụng thanh ghi tính năng thay thế sửa chữa GPIO. Sau khi đặt lại, toàn bộ I / O được liên kết với công dụng thay thế sửa chữa AF0 của mạng lưới hệ thống, đây là hoạt động giải trí mặc định. Các công dụng sửa chữa thay thế của thiết bị ngoại vi được ánh xạ từ AF1 đến AF13 .

 

Vì vậy, nếu bạn muốn sử dụng một chân đơn cử làm thiết bị ngoại vi I2C1 ( miễn là chân đó tương hỗ tính năng I2C1 ), bạn sẽ chọn AF4 bằng cách viết thanh ghi công dụng sửa chữa thay thế gpio này với giá trị tương ứng .

Làm thế nào để truy cập thanh ghi GPIO trong chương trình?

Khi bạn đã xác lập được địa chỉ cơ sở của thiết bị ngoại vi GPIO nhất định và hiểu những công dụng của những thanh ghi khác nhau để định thông số kỹ thuật những chân, giờ đây tất cả chúng ta hoàn toàn có thể liên tục và hiểu cách truy vấn và lập trình những thanh ghi này. Xin chú ý quan tâm rằng mỗi port sẽ có một tập hợp toàn bộ 9 thanh ghi mà tất cả chúng ta đã luận bàn ở trên .

Giả sử bạn muốn lập trình thanh ghi chính sách của GPIOA. Một cách để lập trình những thanh ghi này là tìm ra địa chỉ đúng mực của thanh ghi chính sách GPIOA và lấy một con trỏ đến địa chỉ thực đó, tìm hiểu thêm con trỏ này, chỉnh sửa những giá trị và ghi lại vào vị trí này bằng cách sử dụng cùng một con trỏ. Đây là một cách tiếp cận dài dòng vì bạn cần tìm ra địa chỉ thực của mọi thanh ghi để đọc / ghi từ đó .

Cách tiếp cận khác đơn thuần hơn là trừu tượng hóa ánh xạ ngoại vi đơn cử. Điều này được thực thi bằng cách xác lập 1 số ít bộ giải quyết và xử lý cho mỗi thiết bị ngoại vi. Một trình giải quyết và xử lý là một cấu trúc C, có những tham chiếu được sử dụng để trỏ đến những địa chỉ ngoại vi thực .

 

Đoạn mã trên là cấu trúc C và mỗi trường rộng 32 bit tương ứng với những thanh ghi mà tất cả chúng ta đã thấy ở trên. Nếu tất cả chúng ta trỏ cấu trúc GPIO_TypeDef đến địa chỉ cơ sở của thiết bị ngoại vi GPIOA, và vì mỗi trường này rộng 32 bit, mỗi trường hoàn toàn có thể trỏ đến địa chỉ thanh ghi tương ứng trong bộ nhớ .

Do đó, bằng cách viết như thế này GPIOA ( ( GPIO_TypeDef * ) GPIOA_BASE ) trong đó GPIOA_BASE tương ứng với địa chỉ GPIOA thực là 0x40020000, mỗi trường bên trong cấu trúc này trỏ đến địa chỉ thanh ghi tương ứng trong thực tiễn trong bộ nhớ. Do đó, bằng cách viết GPIOA -> MODER, tất cả chúng ta hoàn toàn có thể truy vấn nội dung của thanh ghi chính sách của thiết bị ngoại vi GPIOA .

 

Trạng thái của GPIO ngay sau khi khởi động lại nguồn là gì?

Trong và ngay sau khi thiết lập lại bật nguồn, hầu hết những chân GPIO I / O ( Đầu vào / Đầu ra ) được thông số kỹ thuật ở chính sách nổi nguồn vào. Tuy nhiên, những chân gpio dành riêng cho mạch debug, tức là những chân debug được định thông số kỹ thuật ở chính sách công dụng sửa chữa thay thế. Sau mỗi lần thiết lập lại thiết bị, những chân JTAG / SWD ( mạch debug ) này được chỉ định làm những chân chuyên sử dụng hoàn toàn có thể sử dụng ngay lập tức bởi sever debug. Điều này có ý nghĩa vì bạn muốn mạch debug hoạt động giải trí trong và ngay sau khi reset .

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *