STM32 Hiểu cài đặt GPIO


41

Trong thư viện ngoại vi tiêu chuẩn STM32, chúng ta cần cấu hình GPIO.

Nhưng có 3 chức năng mà tôi không chắc cách cấu hình chúng;

  • GPIO_InitStr struct.GPIO_Speed
  • GPIO_InitStr struct.GPIO_OType
  • GPIO_InitStr struct.GPIO_PuPd

Trong GPIO_Speed , có 4 cài đặt để chọn

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

Làm thế nào để tôi biết tôi chọn tốc độ nào? Có bất kỳ lợi thế hoặc bất lợi khi sử dụng tốc độ cao hoặc tốc độ thấp? (ví dụ: tiêu thụ điện năng?)

Trong GPIO_OType , có 2 cài đặt để chọn

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

Làm thế nào để biết nên chọn cái nào? và mở cống và đẩy kéo là gì?

Trong GPIO_PuPd , có 3 cài đặt để chọn

GPIO_PuPd_NOPULL // No pull
GPIO_PuPd_UP     // Pull up
GPIO_PuPd_DOWN   // Pull down

Tôi nghĩ rằng cài đặt này có liên quan đến cài đặt ban đầu của kéo đẩy.


Liên quan: làm thế nào để ép buộc rõ ràng chế độ "mở cống" trên các bộ vi điều khiển vốn không hỗ trợ nó, chẳng hạn như AVR / Arduino, PIC, v.v .: Electronics.stackexchange.com/a/354993/26234
Gabriel Staples

Câu trả lời:


45
  • GPIO_PuPd (Kéo lên / Kéo xuống)

    Trong các mạch kỹ thuật số, điều quan trọng là các đường tín hiệu không bao giờ được phép "nổi". Đó là, họ cần phải luôn ở trạng thái cao hoặc trạng thái thấp. Khi nổi, trạng thái không xác định và gây ra một vài loại vấn đề khác nhau.

    Cách để sửa lỗi này là thêm một điện trở từ đường tín hiệu vào Vcc hoặc Gnd. Theo cách đó, nếu đường dây không được tích cực điều khiển cao hay thấp, điện trở sẽ khiến điện thế bị trôi đến một mức đã biết.

    ARM (và các bộ vi điều khiển khác) có mạch tích hợp để thực hiện việc này. Bằng cách đó, bạn không cần thêm một phần khác vào mạch của mình. Ví dụ: nếu bạn chọn "GPIO_PuPd_UP", thì việc thêm một điện trở giữa đường tín hiệu và Vcc là tương đương.

  • GPIO_OType (Loại đầu ra):

    Đẩy-kéo: Đây là loại đầu ra mà hầu hết mọi người nghĩ là "tiêu chuẩn". Khi đầu ra xuống thấp, nó sẽ chủ động "kéo" xuống đất. Ngược lại, khi đầu ra được đặt ở mức cao, nó sẽ chủ động "đẩy" về phía Vcc. Đơn giản hóa, nó trông như thế này:

    ống đẩy

    Mặt khác, đầu ra Open-Drain chỉ hoạt động theo một hướng. Nó có thể kéo pin về phía mặt đất, nhưng nó không thể đẩy nó lên cao. Tưởng tượng hình ảnh trước đó, nhưng không có MOSFET phía trên. Khi nó không được kéo xuống đất, MOSFET chỉ đơn giản là không dẫn điện, khiến đầu ra nổi:

    chống đối

    Đối với loại đầu ra này, cần phải có một điện trở kéo lên được thêm vào mạch, điều này sẽ làm cho đường dây lên cao khi không được điều khiển thấp. Bạn có thể thực hiện việc này với một phần bên ngoài hoặc bằng cách đặt giá trị GPIO_PuPd thành GPIO_PuPd_UP.

    Cái tên này xuất phát từ thực tế là cống của MOSFET không được kết nối nội bộ với bất cứ thứ gì. Loại đầu ra này còn được gọi là "collector mở" khi sử dụng BJT thay vì MOSFET.

  • GPIO_Speed

    Về cơ bản, điều này kiểm soát tốc độ xoay (thời gian tăng và thời gian rơi) của tín hiệu đầu ra. Tốc độ quay càng nhanh, tiếng ồn phát ra từ mạch càng nhiều. Đó là một thực hành tốt để giữ tốc độ quay chậm, và chỉ tăng nó nếu bạn có một lý do cụ thể.


cảm ơn! cho câu trả lời tuyệt vời;), bạn có phiền giải thích thêm một chút về các vấn đề khác nhau khi nó ở trạng thái nổi không?
Tim

3
Ý tưởng là ở trong bất kỳ khoảng thời gian nào ở điện áp đầu vào trung gian có thể bật một phần cả FET trên và dưới trong khối đầu vào và rút ngắn một phần nguồn cung cấp qua chúng, dẫn đến tiêu thụ năng lượng quá mức hoặc (trong trường hợp đặc biệt nghiêm trọng ) có khả năng thiệt hại.
Chris Stratton

@Tim Vâng, những gì Chris Stratton vừa nói :)
bitsmack

3
@Tim Ngoài ra, khi các đường nổi, rất dễ làm nhiễu các mức điện áp. Chỉ cần vẫy tay quanh mạch có thể thay đổi trạng thái của đầu vào, vì các tương tác điện dung ...
bitsmack

1
@Tim Nó thực sự phụ thuộc vào ứng dụng. Nếu bạn đang đọc một công tắc (hoặc nút), thì nó không thực sự quan trọng. Nếu bạn đang giao tiếp với các thành phần khác, nó phụ thuộc vào giao diện. Ví dụ, đối với truyền thông SPI, dòng CS ở mức thấp. Trong trường hợp đó, bạn muốn có một điện trở kéo lên, vì vậy CS không bao giờ vô tình xuống thấp. Bạn có thể nghĩ rằng điều này là không cần thiết nếu bạn sẽ luôn chủ động lái dòng với vi điều khiển. Nhưng những gì về trước khi vi điều khiển khởi tạo? Hoặc nếu nó đặt lại? Điện trở kéo lên sẽ loại bỏ bất kỳ sự mơ hồ nào ...
bitsmack 3/03/2015

5

Tốc độ GPIO là tần số tối đa mà GPIO có thể tạo ra. Cài đặt thấp hơn có thể tiết kiệm năng lượng.

Loại đầu ra là cho dù chân xác nhận mức cao và thấp (kéo đẩy) hay liệu đầu ra có bật cổng của FET được gắn vào chân tại cống (Mở cống). Điều này có thể thuận tiện nếu bạn cần bất kỳ pin đính kèm nào để có thể kéo xe buýt xuống thấp mà không rút ngắn các chân khác.

Kéo điện trở lên gắn đầu ra pin vào đường ray điện, và kéo xuống gắn nó qua điện trở xuống đất. Điều này, trong số những thứ khác, kiểm soát điện áp của pin ngay cả khi bit ở trạng thái trở kháng cao. Điều này rất quan trọng để làm những việc như sử dụng một công tắc tại chỗ để thay đổi giá trị đầu vào kỹ thuật số. Ngay cả khi mở công tắc, đầu vào có thể dự đoán được.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.