泰山派开发板点亮LED及交叉编译初体验

泰山派开发板资料第三章中Buildroot系统使用文档中有各种功能的测试,其中包括GPIO测试,点亮LED需要GPIO引脚输出低电平
泰山派LED接线
LED的正极连接板上的3V3,负极连接电阻然后接到开发板左列倒数第二个引脚上,即GPIO0_B7引脚
以下是使用文档中使用Shell控制GPIO的输出

# 使用root权限
rk3566_tspi:/$ su

# 将引脚号 15 导出为 GPIO 引脚,使其可以被访问和控制。
rk3566_tspi:/$ echo 15 > /sys/class/gpio/export

# 将引脚号 15 的方向设置为输出模式,即设置为输出引脚。
rk3566_tspi:/$ echo out > /sys/class/gpio/gpio15/direction

# 将引脚号 15 的值设置为 1,即将引脚设置为高电平。
rk3566_tspi:/$ echo 1 > /sys/class/gpio/gpio15/value

# 将引脚号 15 的值设置为 0,即将引脚置设置为低电平。
rk3566_tspi:/$ echo 0 > /sys/class/gpio/gpio15/value 

# 将引脚号 15 解除导出,即取消对引脚号 15 的 GPIO 控制权。
rk3566_tspi:/$ echo 15> /sys/class/gpio/unexport

其中引脚ID是根据控制器(GPIO0),端口(B),索引序号(7)确定的
使用ls /sys/class/gpio可以看见有gpiochip0 gpiochip32 gpiochip64 gpiochip96 gpiochip128分别对应GPIO0-GPIO4
引脚ID的计算公式为:
控制器号32 + 端口号8 + 索引序号*1
所以GPIO0_B7为:32 x 0 + 1 x 8 + 7 x 1 = 15

以下是使用C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

static char gpio_path[100];

static int gpio_config(const char *attr, const char *val);

int main(int argc, char* argv[])
{
	int ret;

	if(argc != 3)
	{
		fprintf(stderr, "usage:%s <gpio> <value>\n", argv[0]); 	//若argc 不为3说明给程序传入的参数不足两个,无法执行程序
		exit(-1);
	}

	sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);		//导出的引脚的路径
	if(access(gpio_path, F_OK))									//access函数:如果文件存在返回0,不存在返回-1
	{
		int fd, len;
		fd = open("/sys/class/gpio/export", O_WRONLY);
		if(fd < 0)
		{
			perror("open error");
			
			return -1;
		}

		len = strlen(argv[1]);
		if(write(fd, argv[1], len) != len)						//write函数第一个参数为要写入的位置,第二个参数为要写入的内容,第三个参数是内容的字节数,如果执行成功返回值为内容的字节数
		{
			perror("write error");
			close(fd);
			exit(-1);
		}
		close(fd);
	}

	ret = gpio_config("direction", "out");
	if(ret != 0)
	{
		fprintf(stderr, "gpio_config error1");
		exit(-1);
	}

	ret = gpio_config("active_low", "0");
	if(ret != 0)
	{
		fprintf(stderr, "gpio_config error2");
		exit(-1);
	}

	ret = gpio_config("value", argv[2]);
	if(ret != 0)
	{
		fprintf(stderr, "gpio_config error3");
		exit(-1);
	}
	exit(0);
}

static int gpio_config(const char *attr, const char *val)
{
	char file_path[100];
	int len, fd;

	sprintf(file_path, "%s/%s", gpio_path, attr);
	fd = open(file_path, O_WRONLY);
	if(fd < 0)
	{
		perror("open error2");
		return -1;
	}

	len = strlen(val);
	if(write(fd, val, len) != len)
	{
		perror("write error2");
		close(fd);
		return -1;
	}

	close(fd);
	return 0;
}

交叉编译工具
我是使用ubuntu虚拟机编译后使用scp上传到泰山派执行
ubuntu中下载交叉编译工具可以使用sudo apt install gcc-arm-linux-gnueabihf
安装完成后使用arm-linux-gnueabihf-gcc ./test.c -o test -static命令交叉编译
注意这里有的要加上-static
我刚开始编译时没有使用-static,结果上传到泰山派上执行的时候报错No such file or directory
上网查说是由于交叉编译器的差异,不同的交叉编译器链接的动态库内容相同但是路径不同,所以会提示找不到文件
所以使用静态链接编译

在ubuntu上使用gcc来编译后上传到泰山派运行会提示无法执行二进制文件,所以需要使用交叉编译器

Shell命令参考泰山派Buildroot使用文档
C语言代码参考:
正点原子阿尔法控制GPIO输出高低电平
交叉编译参考:
Linux交叉编译
编译报错参考:
交叉编译器差异 - 执行可执行文件提示"No such file or directory"

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,以下是通过C语言代码使用 Cortex-M3 内核开发板点亮 LED 的步骤: 1. 确认你的开发板支持 GPIO 控制,并且你已经了解了开发板的硬件资源分配情况,确认可以将 LED 连接到开发板的 GPIO 引脚上。 2. 打开开发板的开发环境,创建一个新的工程。 3. 在工程中添加头文件 `stm32f10x.h`,该头文件包含了 STM32F10x 系列芯片的寄存器定义和相关函数定义。 4. 在代码中初始化 GPIO 引脚,设置为输出模式,并将 LED 引脚初始化为低电平。代码如下: ```c #include "stm32f10x.h" int main(void) { // 使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 初始化GPIOB的Pin.0为输出模式,初始电平为低电平 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // LED连接的GPIO引脚为PB0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO最大输出频率为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB, GPIO_Pin_0); // 初始电平为低电平 while(1) { // 点亮LED,将GPIO电平置为高电平 GPIO_SetBits(GPIOB, GPIO_Pin_0); // 延时一段时间 for(int i = 0; i < 1000000; i++); // 关闭LED,将GPIO电平置为低电平 GPIO_ResetBits(GPIOB, GPIO_Pin_0); // 延时一段时间 for(int i = 0; i < 1000000; i++); } } ``` 5. 编译并下载代码到开发板上,LED 就会开始闪烁。 注意事项: - 不同开发板的具体代码可能会有所不同,需要根据实际情况进行调整。 - 在使用 GPIO 控制 LED 时,需要注意电流大小,以免对开发板LED 造成损坏。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值