AM4379芯片的GPIO接口点灯LED

AM4379-GPIO点LED灯设计(驱动层)

利用am4379的gpio5_10、gpio5_11、 gpio5_12点亮led灯,gpio5_13启动WiFi(与点灯操作一样)。

1、在头文件.h中增加控制寄存器定义

#define GPIO5_12_OUTPUT REG32(CtrlModCfgBase_Mapped+0xA48) // 信号别名 CTRL_CONF_GPIO5_12
#define GPIO5_13_OUTPUT REG32(CtrlModCfgBase_Mapped+0xA4C) // 信号别名 CTRL_CONF_GPIO5_13
#define GPIO5_OE REG32(Gpio5Base_Mapped + 0x134) // 端口输入输出属性设置地址

#define GPIO5_10_OUTPUT REG32(CtrlModCfgBase_Mapped+0xA40) // 信号别名 CTRL_CONF_GPIO5_10
#define GPIO5_11_OUTPUT REG32(CtrlModCfgBase_Mapped+0xA44) // 信号别名 CTRL_CONF_GPIO5_11

static void __iomem *Gpio5Base_Mapped;
#define REG32(addr) *((volatile unsigned long *)(addr))
#define GPIO5_SETDATAOUT REG32(Gpio5Base_Mapped+0x194)
#define GPIO5_REG_SIZE 0x198
#define GPIO5_REG_BASE 0x48322000

2、在gpio初始化函数中增加寄存器赋值

Gpio5Base_Mapped = ioremap(GPIO5_REG_BASE, GPIO5_REG_SIZE);

// 切换为GPIO引脚模式
GPIO5_12_OUTPUT = 0x00000007;
GPIO5_13_OUTPUT = 0x00000007;

GPIO5_10_OUTPUT = 0x00000007;
GPIO5_11_OUTPUT = 0x00000007;

// 设置GPIO5管脚输入输出方向
GPIO5_OE = 0xffffc3ff; // 设置GPIO5管脚输入输出:GPIO5-5为输入, GPIO5-12、GPIO5-13、GPIO5-10、GPIO5-11为输出

// GPIO5_10、GPIO5_11、GPIO5_12(WIFI工作状态指示灯)、GPIO5_13(WIFI电源开关)
GPIO5_SETDATAOUT |= ((0X1<<10)|(0X1<<11)|(0X1<<12)|(0X1<<13)) ;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的Linux GPIO心跳点灯程序的示例: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #define GPIO_BASE 0x3F200000 // 树莓派GPIO控制器的基地址 #define GPIO_LEN 0xB4 // 控制器的长度 // GPIO控制器的物理地址指针 volatile unsigned *gpio; // GPIO输出引脚号 #define GPIO_PIN 17 // 定义GPIO寄存器的偏移量 #define GPFSEL1 0x04 // GPIO功能寄存器1 #define GPSET0 0x1C // GPIO输出寄存器(置1) #define GPCLR0 0x28 // GPIO输出寄存器(清0) #define GPPUD 0x94 // GPIO上下拉寄存器 #define GPPUDCLK0 0x98 // GPIO上下拉时钟寄存器 // GPIO功能寄存器的模式(输出) #define GPIO_MODE_OUT 0b001 // 定义延时函数 void delay(int millis) { usleep(millis * 1000); } // 初始化GPIO控制器 void setupGPIO() { int fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd < 0) { printf("无法打开/dev/mem,需要root权限运行\n"); exit(-1); } gpio = (unsigned *)mmap(NULL, GPIO_LEN, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_BASE); close(fd); if (gpio == MAP_FAILED) { printf("mmap失败\n"); exit(-1); } } // 设置GPIO引脚功能模式 void setGPIOFunction(int pin, int mode) { int regnum = pin / 10; int offset = (pin % 10) * 3; unsigned mask = 0b111 << offset; gpio[GPFSEL1 + regnum] = (gpio[GPFSEL1 + regnum] & ~mask) | (mode << offset); } // 将GPIO引脚置为高电平 void setGPIOHigh(int pin) { gpio[GPSET0] = 1 << pin; } // 将GPIO引脚置为低电平 void setGPIOLow(int pin) { gpio[GPCLR0] = 1 << pin; } // 配置GPIO引脚的上下拉电阻 void setGPIOPullUpDown(int pin, int pud) { gpio[GPPUD] = pud; delay(1); gpio[GPPUDCLK0] = 1 << pin; delay(1); gpio[GPPUD] = 0; gpio[GPPUDCLK0] = 0; } int main() { setupGPIO(); setGPIOFunction(GPIO_PIN, GPIO_MODE_OUT); setGPIOPullUpDown(GPIO_PIN, 0); while (1) { setGPIOHigh(GPIO_PIN); delay(500); setGPIOLow(GPIO_PIN); delay(500); } return 0; } ``` 编译方法: ```bash gcc -o gpio-led gpio-led.c ``` 需要在root用户下运行,可以使用sudo命令执行。执行后,GPIO17引脚将会不停地闪烁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值