开发环境
-
MYD-YA157C开发板
-
Linux开发环境
原理图
PA13 PA14均可以作为此次试验的对象,系统上电后的Blue LED秒闪,即PA14引脚已被使用系统使用,此次使用PA13作为测试对象。
代码
stm32官方wiki已提供该部分代码,官方的代码使用PA14引脚,我们将该引脚修改为PA13。
代码功能为秒闪。
#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: gpiochip11 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_13 */
req.lineoffsets[0] = 13;
req.flags = GPIOHANDLE_REQUEST_OUTPUT;
memcpy(req.default_values, &data, sizeof(req.default_values));
strcpy(req.consumer_label, "led_gpio_a_13");
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;
}
Makefile
Makefile使用cmake生成
cmake_minimum_required (VERSION 2.8)
project (led_ya157c)
add_executable(led_ya157c led.c)
使用cmake .
生成makefile后,执行make
命令生成可执行文件。
设备树修改
为啥要修改设备树呢?因为实际PA13也已经被系统使用,通过命令cat /sys/kernel/debug/gpio
可知。
如果不修改设备树,则在执行应用程序的时候,会出现如下错误。
修改设备树文件stm32mp157c-ya157c-v2.dts
led部分,将okay
修改为disabled
后保存。
重新生成设备树dtb文件
make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O="$PWD/../build"
该命令参考米尔文档。
将新生成的设备树文件stm32mp157c-ya157c-hdmi-v2.dtb
传输到开发板的boot目录下。reboot
开发板。
执行应用程序
重新使用命令cat /sys/kernel/debug/gpio
检查PA13的使用情况。PA13并未被使用。
运行应用程序./led_ya157c
,即可见红色LED闪烁。