如何设置 GPIO引脚的高低电平

时间:2021-11-13 10:18:22
我现在 想把我的核心芯片 的两个管脚 设置成低电平 我的代码如下,REG2ADDR REG3ADDR 是来设置这两个管脚的复用功能的,GPIO3_DIR   是用来设置GPIO口为输入还是输出的, GPIO3_DATA   是用来设置数据。编译通过 但是执行到printf("REG2ADDR SET\n")以后显示:Segmentation fault,这个错误。这是为什么啊????
#define REG_BASE_ADDR 0x200F0000
#define REG2ADDR   (*(volatile unsigned long *)(REG_BASE_ADDR + 0x0008))
#define REG3ADDR   (*(volatile unsigned long *)(REG_BASE_ADDR + 0x000C))

#define GPIO3_BASE_ADDR 0x20180000
#define GPIO3_DATA   (*(volatile unsigned long *)(GPIO3_BASE_ADDR))
#define GPIO3_DIR   (*(volatile unsigned long *)(GPIO3_BASE_ADDR + 0x0400))

printf("REG2ADDR SET\n");
 REG2ADDR |=0x00000001;//作为GPIO口使用  
printf("REG3ADDR SET\n");
 REG3ADDR |=0x00000001;

printf("GPIO3_DIR SET\n");
 //设置 GPIO3_0 GPIO3_1为输出引脚
 GPIO3_DIR|=0x03;
printf("GPIO3_DATA\n");
 //GPIO_DATA 的值;最低两位为低电平
 GPIO3_DATA&=0xfc;

6 个解决方案

#1


linux下一般都是有__raw_writel函数吧

#2


printf 就是你的开发环境的调试方法么?

能否注释掉 printf 语句再试下,有没jtag 仿真器?

#3


你用的是静态映射寄存器的地址,应当用readl()和writel()两个函数来读取和修改寄存器的值

#4


看datasheet.

#5


物理地址要映射到虚拟地址。

#6


因为有MMU在管理,所以物理地址不能直接用,需要用ioremap映射成虚拟地址,在resource里申请资源分配。

#1


linux下一般都是有__raw_writel函数吧

#2


printf 就是你的开发环境的调试方法么?

能否注释掉 printf 语句再试下,有没jtag 仿真器?

#3


你用的是静态映射寄存器的地址,应当用readl()和writel()两个函数来读取和修改寄存器的值

#4


看datasheet.

#5


物理地址要映射到虚拟地址。

#6


因为有MMU在管理,所以物理地址不能直接用,需要用ioremap映射成虚拟地址,在resource里申请资源分配。