社区导航

 

搜索
查看: 1129|回复: 7

[原创] STM32MP157A-DK1测评+HelloWorld与GPIO(2)

[复制链接]

1214

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2020-3-26 15:05 | 显示全部楼层 |阅读模式

启程HelloWorld
OpenSTlinux的环境让我感动的是:板子启动后直接显示图形界面,不会象屏幕输出控制台信息!这个很“炫!”。控制台信息让我很头痛。你给用户输出这些没有用的信息也闹心。
参考ST的官网资料"Create a simple hello-world application",创建程序。
1、首先确认开发环境是否正确 
$CC --version
如果不正确,就使用环境脚本文件配置正确!
source /opt/st/stm32mp1/2.6-openstlinux-20-02-19/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

2、开始编程!
使用你喜欢的文本编辑器。我的是
vi gtk_hello_world.c
输入以下代码

#include <gtk/gtk.h>

static void
print_hello (GtkWidget *widget,
             gpointer   data)
{
  g_print ("Hello World\n");
}

static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *button_box;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add (GTK_CONTAINER (window), button_box);

  button = gtk_button_new_with_label ("Hello World");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  gtk_container_add (GTK_CONTAINER (button_box), button);

  gtk_widget_show_all (window);
}

int
main (int    argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

保存文件待用

3、编译程序

编辑Makefile文件
vi Makefile
注意不能直接考本的脚本!必须在“命令前面加tab!!!”
这个是给linux开发新手看的。如果不懂那就快乐的学习一下吧。

PROG = gtk_hello_world
SRCS = gtk_hello_world.c

CLEANFILES = $(PROG)

# Add / change option in CFLAGS and LDFLAGS
CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
LDFLAGS += $(shell pkg-config --libs gtk+-3.0)

all: $(PROG)

$(PROG): $(SRCS)
	$(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)

clean:
	rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))

编译文件
make
如果没有错误,就可以看到生成的gtk_hello_world文件了
4、上传文件,
 scp gtk_hello_world root@192.168.0.103:/usr/local
替换你的IP地址。<board ip address>
转到控制台执行程序。
./gtk_hello_world
在显示器上可以看到图形化的窗口。点击按钮,程序在控制台输出“Hello,World!”

untitled.png

本例程使用的是gtk库,gtk开发十分的麻烦,功能也不怎么丰富。据说可以使用qt5,有时间可以研究一下。
GPIO操作点亮LED

1、GPIO介绍

对于嵌入式开发者来说不能操作硬件是有点说不过去的。所以能够点亮LED才算是正宗的“Hello World!”对于unix系统“一切皆文件!”,linux系统下的设备文件在/dev目录下。通过查看找到gpiochip0~gpiochip9共10个设备文件。每一个设备文件对应着GPIOs端口。也就是gpiochip0对应着GPIOA口。详细的信息可以使用
cat /sys/kernel/debug/gpio
查看得到。通过资料知道LED5是与GPIOA的14脚相连。使用gpioset工具操作gpiochip0的14脚应该可以操作led5的开断。
gpioset gpiochip0 14=0
可一看到rest按键旁边的led5发光。资料上说好的是Green怎么变成Yellow啦。Yellow也挺好!只要亮就行。

2、使用文件操作GPIO

使用C代码写一个led5程序。开始我想使用libgpiod库来操作gpio。调试了很长时间,也没有成功。没办法找到了一个直接操作设备文件的代码

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>

#include <linux/gpio.h>

int main(int argc, char **argv)
{
	struct gpiohandle_request req;
	struct gpiohandle_data data;
	char chrdev_name[20];
	int fd, ret;

	strcpy(chrdev_name, "/dev/gpiochip0");

	/*  Open device: gpiochip0 for GPIO bank A */
	fd = open(chrdev_name, 0);
	if (fd == -1) {
		ret = -errno;
		fprintf(stderr, "Failed to open %s\n", chrdev_name);

		return ret;
	}

	/* request GPIO line: GPIO_A_14 */
	req.lineoffsets[0] = 14;
	req.flags = GPIOHANDLE_REQUEST_OUTPUT;
	memcpy(req.default_values, &data, sizeof(req.default_values));
	strcpy(req.consumer_label, "led_gpio_a_14");
	req.lines  = 1;

	ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);
	if (ret == -1) {
		ret = -errno;
		fprintf(stderr, "Failed to issue GET LINEHANDLE IOCTL (%d)\n",
			ret);
	}
	if (close(fd) == -1)
		perror("Failed to close GPIO character device file");

	/*  Start led blinking */
	while(1) {

		data.values[0] = !data.values[0];
		ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data);
		if (ret == -1) {
			ret = -errno;
			fprintf(stderr, "Failed to issue %s (%d)\n",
					"GPIOHANDLE_SET_LINE_VALUES_IOCTL", ret);
		}
		sleep(1);
	}

	/*  release line */
	ret = close(req.fd);
	if (ret == -1) {
		perror("Failed to close GPIO LINEHANDLE device file");
		ret = -errno;
	}
	return ret;
}

经过编译,可以成功的控制led5

hello.jpg

至此Hello world完成!

对于新手建议参考一下

How to cross-compile with the Developer Package

 

此内容由EEWORLD论坛网友bigbat原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自stm32/stm8论坛

回复

使用道具 举报

628

TA的帖子

18

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-3-26 15:51 | 显示全部楼层

楼主的评测做的真好!!


回复

使用道具 举报

7269

TA的帖子

19

TA的资源

版主

Rank: 6Rank: 6

发表于 2020-3-26 17:07 | 显示全部楼层

不错,速度够快。

虾扯蛋

回复

使用道具 举报

6553

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2020-3-26 23:11 | 显示全部楼层

不错 不错 期待你们的大作

生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰

回复

使用道具 举报

233

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2020-3-27 07:43 | 显示全部楼层

学习了,学习了


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-4-9 20:53 | 显示全部楼层

 编译不通过呀

点评

这个程序是肯定能编译的,需要注意的是你机器的编译环境一定要正确!!! source /opt/st/stm32mp1/2.6-openstlinux-20-02-19/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi 执行后按照操作  详情 回复 发表于 2020-4-10 08:43

回复

使用道具 举报

1214

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

 楼主| 发表于 2020-4-10 08:43 | 显示全部楼层

这个程序是肯定能编译的,需要注意的是你机器的编译环境一定要正确!!!

source /opt/st/stm32mp1/2.6-openstlinux-20-02-19/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

执行后按照操作步骤检查环境。还有就是:你如果不懂makefile文件编写请学习一下。

以上还是不行,那就是人品问题了...


回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2020-5-12 22:38 | 显示全部楼层
bigbat 发表于 2020-4-10 08:43 这个程序是肯定能编译的,需要注意的是你机器的编译环境一定要正确!!! source /opt/st/stm32mp1/2. ...

搞定了,原来是编译器搞错了


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-31 14:15 , Processed in 0.278048 second(s), 30 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表