这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » [分享]STM32MP157A-DK1测评+HelloWorld与GPIO(2)

共6条 1/1 1 跳转至

[分享]STM32MP157A-DK1测评+HelloWorld与GPIO(2)

助工
2020-03-27 15:50:06     打赏

启程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 voidprint_hello (GtkWidget *widget,gpointer   data){g_print ("Hello World\n");}static voidactivate (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);}intmain (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_worldSRCS = gtk_hello_world.cCLEANFILES = $(PROG)# Add / change option in CFLAGS and LDFLAGSCFLAGS += -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!”

本例程使用的是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 world完成!

对于新手建议参考一下

How to cross-compile with the Developer Package





关键词: STM32MP157A-DK1     测评     +Hello    

院士
2020-03-27 16:29:35     打赏
2楼

ST推出的这个MPU较现有的芯片多一个M4的内核。

这个优势还是挺明显的,在实时场景下,要较其它的单一嵌入式Linux优势明显了。


高工
2020-04-02 21:43:23     打赏
3楼

学到知识了


工程师
2020-04-04 19:26:13     打赏
4楼

感谢楼主分享


工程师
2020-04-05 16:34:20     打赏
5楼

学习一下 


工程师
2020-04-05 16:35:05     打赏
6楼

学习一下 


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]