|
1.第一步按照官网要求在开发主机安装下面的库 # K9 {# {- S+ _ V( p; y PC $> sudo apt-get update% z7 w7 P( n" Z# X" R! W PC $> sudo apt-get install sed wget curl cvs subversion git-core coreutils unzip texi2html texinfo docbook-utils gawk python-pysqlite2 diffstat help2man make gcc build-essential g++ desktop-file-utils chrpath libxml2-utils xmlto docbook bsdmainutils iputils-ping cpio python-wand python-pycryptopp python-crypto2 ]3 Q+ M7 N. h6 H/ b PC $> sudo apt-get install libsdl1.2-dev xterm corkscrew nfs-common nfs-kernel-server device-tree-compiler mercurial u-boot-tools libarchive-zip-perl* z0 | ~5 t0 L1 u) b( o! V PC $> sudo apt-get install ncurses-dev bc linux-headers-generic gcc-multilib libncurses5-dev libncursesw5-dev lrzsz dos2unix lib32ncurses5 repo libssl-dev PC $> sudo apt-get install default-jre 1 w% Z3 R+ S% J8 q4 S7 U7 L4 A 2.添加 conf文件5 x( c3 ]% |6 E8 ]! t5 C" n PC $> echo 'options mmc_block perdev_minors=16' > /tmp/mmc_block.conf PC $> sudo mv /tmp/mmc_block.conf /etc/modprobe.d/mmc_block.conf! N' N3 I' N# U# _ 3解压gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf文件。,添加bashrc即可. g( \# c3 ?+ n1 x$ ^ bin文件下 安装sh文件,输入安装的路径! ~3 } M. t- U. J8 V' Q& z 3 F9 K, Y- n3 B
& n; _ K% _( E9 i7 L1 Y 上图表示安装成功 4.按官网指示,在sdk同级目录下创建source 编写 代码 7 k! n0 u7 X: f* a% {6 X. T #include <gtk/gtk.h> #include <errno.h>/ e* V+ {% ~( |0 r* ]4 p #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h>6 `; I" _( c7 T9 M #include <sys/ioctl.h> #include <unistd.h> #include<linux/gpio.h>7 z" y: [" m2 P; l. G7 p , r/ G' \) X8 r" t/ @ struct gpiohandle_request req; struct gpiohandle_data data;4 b" ~' i" J6 R9 B char chrdev_name[20];+ Y i8 M9 `, ?; X. X+ g' H int fd, ret; / w e9 \9 e6 q$ F l' u , R) [9 n+ u& X: C; S6 u1 ]) C# u8 M static void led_control(GtkWidget *widget,% D4 `* a- j7 e: j# J! o gpointer data1) {# ^# p* K, U0 g. \ data.values[0] = !(data.values[0]);* G$ e: z; U! E( ]( T8 G1 N ret = ioctl(req.fd, GPIOHANDLE_SET_LINE_VALUES_IOCTL, &data); if (ret == -1) { ret = -errno; fprintf(stderr, "Failed to issue %s (%d)\n",% v) Y6 h- ]; C2 [# q* S; U "GPIOHANDLE_SET_LINE_VALUES_IOCTL", ret); } + m! Y* M' f, [" o if(data.values[0]) { ; N1 \" M+ M/ o5 Y% a g_print("close led \n"); } else { g_print("open led \n"); } , `7 a' u" P) n F8 Z( ]3 O' o/ B$ \ ) K2 h5 p1 m" B$ }9 W } d: u2 `4 C9 G+ C 4 t2 M9 n+ s. [ static void5 d. I: _8 a" V( L) u activate (GtkApplication *app,! Z2 X4 s' C4 r% u gpointer user_data)% l/ [' m" n) z+ m" L) z { GtkWidget *window; GtkWidget *button_led;# \! }) n S# G+ g GtkWidget *led_label;1 k( t7 c& ?) Z) _; o: c ; a$ w' M% E! p6 C* t x) W window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "led test"); gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);) B, q% [8 F: ?, i% D' Q4 k ; L- R& |, ^+ n5 T button_led = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);0 f" ^' ~3 k3 S2 a1 \ gtk_container_add(GTK_CONTAINER (window), button_led);7 ~+ Y) l9 k5 \$ o7 B# z* R# C* ] % S/ g+ V5 W$ r% y; S led_label = gtk_button_new_with_label ("LED"); g_signal_connect (led_label, "clicked", G_CALLBACK (led_control), NULL); gtk_container_add(GTK_CONTAINER (button_led), led_label); - u5 o7 d w) B6 b- N7 X 1 o) I+ ]# o0 f0 z2 S gtk_widget_show_all (window);# Q% ~7 {, J2 V; O } $ U, w! M9 ]: }7 k! A int main (int argc,char **argv), v b- M8 i9 U1 G9 C- l {- c0 i( Z- c- Q. X GtkApplication *app; int status;1 a" ~+ N- i( e+ d6 A' c9 x - i# E t) o7 \' r: R. ^0 Q& { app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);: b: _) R$ L5 s g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);4 q1 K/ t% A$ S+ C . @1 R6 T5 p2 B strcpy(chrdev_name, "/dev/gpiochip0");& x" R5 y: T7 H$ W /* 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;. M. L& L: i) { } % C$ V3 r; _+ R) X: R6 Z6 h 0 L5 z& i' M1 D- s% {# H# { /* 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");# Y5 l: N1 `8 a5 z. q req.lines = 1; ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req); if (ret == -1) {# s) B$ Y9 |2 D( h7 Z ret = -errno; fprintf(stderr, "Failed to issue GET LINEHANDLE IOCTL (%d)\n",$ r& I# h( {2 o; z6 R" p ret);3 H; h D/ \! n: O }) g1 J# A9 |0 M1 k0 A if (close(fd) == -1){ ( ]4 Z- f6 D7 z( }. ] perror("Failed to close GPIO character device file"); } status = g_application_run (G_APPLICATION (app), argc, argv);4 q8 t u+ z: N; _5 | g_object_unref (app); 8 Z! K0 @& x: x: c1 @' O [5 r) n: x return status; } . A4 }( o4 T0 m0 q' s! ]) D " G0 m5 S' I1 Q! E& @ # n( D# O) ^7 f; x6 P0 `$ A 4编写Makefile ( P2 n% ]* p3 X6 U. ~0 b) D2 } PROG = gek_led SRCS = 3.c# U/ C, a* Q( {# ~# r' c , G& q5 o" W0 ~$ [7 V CLEANFILES = $(PROG) # Add / change option in CFLAGS and LDFLAGS6 Y; T9 m/ g# s, D) O; A& s CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0) LDFLAGS += $(shell pkg-config --libs gtk+-3.0)) ]' K+ P5 X1 ^ all: $(PROG) $(PROG): $(SRCS)( v. [9 G) W1 z# W0 A) w $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)# [0 N; W# q b% v5 [6 t clean:1 k5 M c. E+ @+ l6 I/ @ rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))7 X @* u e7 v! A0 A8 x 9 V! n, k w7 L8 [4 ] 5 source 下 sdk目录下的env开头文件,检查$CC --version 是否有输出 6. 在 source 目录下 make 产生gek_led ,通过scp 或者 filezilla 传到目标板上运行 7. 界面点击led button 同时log 和灯会跟着控制 0 _- l) f! F7 w8 s! X$ ]$ g+ y: h, t
/ l0 B* k0 Z2 r. `& ] ' Z" j0 P4 _+ l' D) {. z& a+ Q. s |
扩展STM32微处理器,实现高性价比、低功耗和灵活性能
STM32MP1 自举程序编程:USB DFU/USART 协议全解析
兔哥心中的ST中文论坛
我心中的ST中文论坛
STM32 开发者指南:ST.com 全新 MCU 产品阵容视觉布局深度解析
深度拆解 STM32MP1 Boot 链路
STM32串口自动识别波特率的原理
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
STM32--STM32 微控制器详解
为什么学了几天STM32一脸茫然?
微信公众号
手机版
界面就是一个按钮