Dòng điện đầu ra GPIO danh nghĩa là gì?


8

RPi GPIO Pin hiện tại là gì?

Tôi giả sử nó lớn hơn 10mA vì nó có thể điều khiển đèn LED mà không gặp vấn đề gì nhưng thông số kỹ thuật là gì?

Câu trả lời:


5

Sau khi thiết lập lại, nó là 8mA. Bạn có thể lập trình nó lên đến 16mA


tôi đã quen với PIC nơi dòng điện định mức được cố định / xếp hạng, không hy vọng nó có thể lập trình được. Bạn có biết làm thế nào để lập trình nó lên 16mA không? hoặc giá trị mặc định là gì?
JeeShen Lee

1
@JeeShenLee, mặc định là 8mA
John La Rooy

4
Bất kỳ cơ hội của một số mã ví dụ?
Alex Chamberlain

Liên kết không còn hoạt động.
Nathan Osman

2

Để lập trình các thanh ghi PADS thay đổi dòng điện đầu ra, phần sau đây hiển thị mã thích hợp:

#define BCM2708_PERI_BASE        0x20000000
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO   */
#define PADS_BASE                (BCM2708_PERI_BASE + 0x100000) /* PADS   */

#define PADS0   *(pads+11)
#define PADS1   *(pads+12)
#define PADS2   *(pads+13)

// I/O access - Reqires maping.
volatile unsigned *pads;

Sau đó, từ mã của bạn, sau khi sử dụng con trỏ đệm (xem tại đây ), bạn sẽ có thể đặt các thanh ghi miếng đệm như vậy,

PADS0 = (0xFFFFFFF8 & PADS0) | 7; // Sets GPIO 0-27 to 16mA
PADS1 = (0xFFFFFFF8 & PADS1) | 4; // Sets GPIO 28-45 to 10mA
PADS2 = (0xFFFFFFF8 & PADS2);     // Sets GPIO 46-53 to 2mA

Bạn đã thử nghiệm điều này? Tôi nghĩ đây là một lỗi seg?
Alex Chamberlain

Tôi nhận ra rằng tôi không thể kiểm tra nó, cho đến chiều nay, nhưng sẽ cập nhật với ví dụ hoạt động hoàn chỉnh.
Tai chó

Tại sao điều này seg lỗi?
Tai chó

Bởi vì 0x20100000 không có trong bộ nhớ ảo của bạn.
Alex Chamberlain

Tôi có thể hiểu những gì bạn có ý nghĩa về bản đồ vv; thật tuyệt khi thấy rằng được cập nhật tại một số điểm để mã hoạt động như đã tải xuống.
Alex Chamberlain

1

Nếu bạn có thể chịu một số mã C cũ của tôi, đây là một ví dụ về việc thực hiện ánh xạ trong C

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <limits.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <termios.h>
#include <ctype.h>

#define FALSE                    (0)
#define TRUE                     (!FALSE)
#define NULL_FD                  ((int)0)
#define MAP_NAME_LEN             (20)
#define NO_MASK                  (UINT_MAX)

#define BCM2708_PERI_BASE        0x20000000
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO   */
#define PADS_BASE                (BCM2708_PERI_BASE + 0x100000) /* PADS   */

#define PADS0                    (11 * 4)
#define PADS1                    (12 * 4)
#define PADS2                    (13 * 4)

#define PADS_CURRENT_MASK        (0x00000007)

typedef struct raw_memory {
    void *accessor;             // Base location for memory access
    unsigned int offset;        // Offset into base for the starting point
    unsigned int length;
    char name[MAP_NAME_LEN + 1];
} raw_memory;

int memFile = NULL_FD;
raw_memory rawMemPads= {MAP_FAILED, 0, 0, "PADS"};


void RegWrite(raw_memory *base, unsigned int address, unsigned int mask, unsigned int value);
unsigned int RegRead(raw_memory *base, unsigned int address);
BOOL MapMemory(raw_memory *base, int device, unsigned int startAddress, size_t size);
void UnmapMemory(raw_memory *base);

void RegWrite(raw_memory *base, unsigned int address, unsigned int mask, unsigned int value) {
    if (base->accessor == MAP_FAILED) {
        printf("RegWrite failed due to an unmapped base (%s)!\n", base->name);
    } else if (address >= base->length) {
        printf("RegWrite failed due to address out of bounds (%s, 0x%08X)!\n", base->name, address);
    } else {
        if (mask != NO_MASK) {
            unsigned int read = RegRead(base, address);
            value &= mask;
            value |= (~mask) & read;
        }
        *((unsigned int *)(base->accessor + base->offset + address)) = value;
    }
}

BOOL MapMemory(raw_memory *base, int device, unsigned int startAddress, size_t size) {
    // Unmap first if already allocated
    if (base->accessor != MAP_FAILED) {
        UnmapMemory(base);
    }
    // Align start address to the page size (we can only map page aligned blocks)
    base->offset = (unsigned int)(startAddress / getpagesize()) * getpagesize();
    // Compute the necessary size to cover the alignment
    base->length = (unsigned int)size;
    size += (size_t)(startAddress - base->offset);
    // Map the memory from the device to a local address
    base->accessor = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, device, base->offset);
    if (base->accessor == MAP_FAILED) {
        return FALSE;
    } else {
        // Calculate the offset needed by read / write functions to get startAddress as 0
        base->offset = startAddress - base->offset;
        return TRUE;
    }
}

void UnmapMemory(raw_memory *base) {
    if (base->accessor != MAP_FAILED) {
        munmap(base->accessor, base->offset + base->length);
        base->accessor = MAP_FAILED;
    } else {
    }
}

int main(void) {
    // Enable raw memory access
    if (memFile == NULL_FD) memFile = open("/dev/mem", O_RDWR | O_SYNC); 
    if (memFile == NULL_FD) {
        printf("Failed to open /dev/mem (are we root?) !\n");
        return 1;
    }

    // Map GPIO memory
    if (!MapMemory(&rawMemPads, memFile, PADS_BASE, 1024)) {
        printf("Failed to map GPIO device memory !\n");
        return 2;
    }

    // Actual work here
    RegWrite(&rawMem, PADS0, PADS_CURRENT_MASK, 7); // Sets GPIO 0-27 to 16mA
    RegWrite(&rawMem, PADS1, PADS_CURRENT_MASK, 4); // Sets GPIO 28-45 to 10mA
    RegWrite(&rawMem, PADS2, PADS_CURRENT_MASK, 0); // Sets GPIO 46-53 to 2mA

    // Any other code here
    //

    // Unmap the GPIO memory
    if (rawMemPads.accessor != MAP_FAILED) {
        UnmapMemory(&rawMemPads);
    }

    // Disable raw memory access
    if (memFile != NULL_FD) {
        close(memFile);
        memFile = NULL_FD;
    }

    return 0;
}

Xin lỗi về độ dài, đó là một chút thiết lập để đoạn mã chính để thực hiện ghi mặt nạ là ngắn, nó cũng cho phép các trang không liên kết, điều này thực sự không phải là vấn đề ở đây (trước đây tôi đã gặp vấn đề này một bản đồ đăng ký nhúng khác nhau). Lưu ý rằng bạn sẽ cần chạy nhị phân với quyền root hoặc ánh xạ sẽ thất bại vì quyền bị từ chối đối với / dev / mem


Không biên dịch, rawMem không được khai báo trong hàm main (). Ngoài ra "BOOL" không phải là kiểu dữ liệu hợp lệ nhưng được sửa với bao gồm <stdbool.h> và thay đổi thành chữ thường "bool".
PTS
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.