创作本文目的:记录自己的学习历程
一、A7实现LED灯亮灭的步骤
1.分析硬件
根据扩展板上的丝印,找到LED灯的位置,查看其对应的管脚
根据硬件原理图,可知LED灯的亮灭,其实就是高低电平的转换
2.分析芯片手册
主要就分析RCC和GPIO章节
RCC就是给指定的寄存器进行时钟使能,使其正常工作
GPIO就是根据需求,调整需要设置的寄存器,常用有:
GPIOx_MODER: GPIO模式寄存器 设置为输出模式
GPIOx_OTYPER: GPIO输出类型寄存器 设置为推挽/开漏输出
GPIOx_OSPEEDR: GPIO输出速度寄存器 设置为输出速率
GPIOx_PUPDR: GPIO上下拉电阻寄存器 是否需要上下拉电阻
GPIOx_ODR: GPIO输出数据寄存器 输出高低电平,实现LED灯点亮核熄灭
3.程序编写
主要就是给需要寄存器中指定位置清0或置1,封装好寄存器的地址,再根据芯片手册中所指示的位置,写入特定的值即可
.h
#ifndef __CMD_H__
#define __CMD_H__
#include <asm-generic/ioctl.h>
#define type 'a'
//#define CMD_ON _IO(type,0)
//#define CMD_OFF _IO(type,1)
#define CMD_LED1_ON _IOR(type,0,int)
#define CMD_LED1_OFF _IOR(type,1,int)
#define CMD_LED2_ON _IOR(type,2,int)
#define CMD_LED2_OFF _IOR(type,3,int)
#define CMD_LED3_ON _IOR(type,4,int)
#define CMD_LED3_OFF _IOR(type,5,int)
#endif
.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include "fsmp157a_led.h"
int main(int argc, const char *argv[])
{
int fd;
fd = open("/dev/mycdev",O_RDWR);
if(fd == -1){
perror("open device node error");
return -1;
}
while(1){
ioctl(fd,CMD_LED1_ON);
sleep(1);
ioctl(fd,CMD_LED1_OFF);
sleep(1);
ioctl(fd,CMD_LED2_ON);
sleep(1);
ioctl(fd,CMD_LED2_OFF);
sleep(1);
ioctl(fd,CMD_LED3_ON);
sleep(1);
ioctl(fd,CMD_LED3_OFF);
sleep(1);
}
close(fd);
return 0;
}
4.通过模块化方式,在开发板的linux内核上跑程序
注意要使用交叉编译工具进行编译,生成arm架构的可执行二进制文件才行