实验内容
可以看出, LED0 接到了 PI0 上, PI0 就是 GPIOI 组的第 0 个引脚,当 PI0 输出低电平(0)的时候发光二极管 LED0 就会导通点亮,当 PI0 输出高电平(1)的时候发光二极管LED0 不会导通,因此 LED0 也就不会点亮。所以 LED0 的亮灭取决于 PI0 的输出电平,输出 0 就亮,输出 1 就灭。
注意:PI0不要看错了,这个是GPIOI0
实验程序编写
目录结构
tree
.
├── ledApp.c
├── led.c
└── Makefile
代码
1 |
|
Makefile
1 | KERNELDIR := /home/alex/study/stm32mp157/01_Source_Code/01、正点原子Linux出厂系统源码/linux-5.4.31 |
编译
make
make clean
运行测试
将上一小节编译出来的 led.ko和 ledApp这两个文件拷贝到 rootfs/lib/modules/5.4.31 目录中,重启开发板,进入到目录 lib/modules/5.4.31 中,输入如下命令加载 led.ko 驱动模块:1
2depmod //第一次加载驱动的时候需要运行此命令
modprobe led //加载驱动
驱动加载成功以后创建”/dev/led”设备节点,命令如下:1
mknod /dev/led c 200 0
驱动节点创建成功以后就可以使用 ledApp 软件来测试驱动是否工作正常,输入如下命令打开 LED 灯:1
echo 1 > /dev/led //打开 LED 灯
输入上述命令以后观察开发板上的红色 LED 灯,也就是 LED0 是否点亮,如果点亮的话说明驱动工作正常。在输入如下命令关闭 LED 灯:1
echo 0 > /dev/led //关闭 LED 灯
输入上述命令以后观察开发板上的红色 LED 灯是否熄灭,如果熄灭的话说明我们编写的LED 驱动工作完全正常!至此,我们成功编写了第一个真正的 Linux 驱动设备程序。
如果要卸载驱动的话输入如下命令即可:1
modprobe -r led
经验总结
难点主要在如何看《STM32MP157参考手册.pdf》,首先要找到外设基地址(0x40000000),然后找到GPIOI(0x5000A000 - 0x5000A3FF),需要了解STM32的GPIO的每个寄存器作用,如何控制高低电平输出。
GPIO控制时序:
- 使能PI时钟
- 设置PI0通用的输出模式
- 设置PI0为推挽模式
- 设置PI0为高速
- 设置PI0为上拉
- 打开关闭LED
这些初始化时序可以百度STM32 GPIO寄存器操作时序,可以看厂商提供的源码中GPIO相关的内容