有人可以告诉我一些关于如何从Raspberry Pi寄存器中读取值的示例吗?
我需要检查AUX_MU_LSR_REG(0x7E21 5054)中的字节,但我不知道如何在不使用任何其他库的情况下执行此操作.
我试过了:
(这里我修改了oryginal帖子)
**************************开始代码
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
#define BCM2708 0x20000000
#define UART_BASE (BCM2708+0x215000)
#define PAGE_SIZE (4*1024)
#define BLOCK_SIZE (4*1024)
int mem_fd;
void *uart_map;
volatile unsigned *uart;
int main()
{
printf("start\n");
if((mem_fd=open("/dev/mem",O_RDWR|O_SYNC))<0)
{
printf("can't open /dev/mem \n");
exit(-1);
}
else printf("stream_file open OK \n");
if((uart_map=malloc(BLOCK_SIZE))==0)
printf("malloc fail\n");
else printf("GPIO_mallocation OK %d \n", (int)uart_map );
uart_map=mmap (NULL, //any address in our space
BLOCK_SIZE, //map length
PROT_READ|PROT_WRITE, //Enable reading and writing to maped memmory
MAP_SHARED, //Shares with other processes
mem_fd, //File to map
UART_BASE //Offset toUART peripheral
);
if(uart_map==MAP_FAILED)
{
printf("mmap error %d", (int)uart_map);
exit(-1);
}
else printf("GPIO mapping OK \n");
uart=(volatile unsigned* )uart_map;
int i;
for(i=0;i<32;i++)
{
printf("adress:%x ",uart+i);
printf("value:%x\n",*(uart+i));
}
printf("stop\n");
return 0;
}
`
***********************代码结束
现在我真的不记得我是如何显示0但在上面的代码中我得到指针冲突.
什么是uart指向?理论上它应该显示值,但几个星期后我无法运行.
希望你能以某种方式帮助我
最佳答案 我已成功编译了示例
here,并且能够通过对该代码进行一些修改,从GPIO引脚读取和写入数字值.
您实际上正朝着正确的方向前进:mmap()数据表中为您的特定GPIO,SPI或您需要的任何寄存器指定的范围,然后从该地址读取和写入.这是RPi上所有GPIO编程的基础.
你应该注意一些特殊的位域,但正如我所提到的,这些都在elinux.org的Pi数据表中.
注意:要mmap()系统注册,您需要以超级用户身份运行.