换armbian镜像、进行GPIO测试
时间:10-02
整理:3721RD
点击:
昨天发的开箱测评帖子的时候使用的是官方给的镜像,没有i2c和spi设备,然后在git上下载源码也下载不了,网太慢了,经常下着下着就断开了。所以直接刷了Armbian系统了,这个镜像自带了i2c等设备,可以直接使用。
这个镜像是不带桌面环境的,但是可以自己安装XFce,然后使用VNC在Windows上访问,这里我暂时没有这个需要就没有安装了。
接下来想试验一下GPIO的功能,但是搜遍全网找不到全志H2+芯片的数据手册,但是我偶然在网上看到一句话:The H2+ SoC used on this board seems to be a featureless H3 (no Gbit Ethernet MAC and no 4K HDMI output).好吧,使用H3芯片的数据手册作为参考吧还是。 实验结果证明使用H3的寄存器映射直接控制板子上的引脚是可以的,但是有一点奇怪的是不能控制板载的LED灯,STATUS_LED连接的是PA15,然而并不能控制PA15,我猜测是系统一直再输出低到PA15导致我的输出被覆盖了。
关于控制GPIO的方法可以参考我的博客:http://blog.csdn.net/tq384998430/article/details/53161192 和 http://blog.csdn.net/tq384998430/article/details/53214273。可以学习如何在应用程序中直接控制GPIO,可以控制LED灯、LCD显示器还能读取按键。
这里还是把GPIO的操作程序贴出来吧,大家互相交流:
- #include "gpio.h"
-
- PIO_Map *PIO = NULL;
- unsigned int *gpio_map;
-
- void GPIO_Init(void)
- {
- unsigned int fd;
- unsigned int addr_start, addr_offset;
- unsigned int PageSize, PageMask;
-
- if((fd = open("/dev/mem",O_RDWR)) == -1)
- {
- printf("open error\r\n");
- return;
- }
-
- PageSize = sysconf(_SC_PAGESIZE); //页大小
- PageMask = (~(PageSize-1)); //页掩码
- printf("PageSize:%d,PageMask:%.8X\r\n",PageSize,PageMask);
-
- addr_start = PIO_BASE_ADDRESS & PageMask;
- addr_offset = PIO_BASE_ADDRESS & ~PageMask;
- printf("addr_start:%.8X,addr_offset:%.8X\r\n",addr_start,addr_offset);
-
- if((gpio_map = mmap(NULL,PageSize*2,PROT_READ|PROT_WRITE, MAP_SHARED,fd,addr_start)) == NULL)
- {
- printf("mmap error\r\n");
- close(fd);
- return;
- }
- printf("gpio_map:%.8X\r\n",gpio_map);
-
- PIO = (PIO_Map *)((unsigned int)gpio_map + addr_offset);
- printf("PIO:%.8X\r\n",PIO);
-
- close(fd);
- }
-
- void GPIO_ConfigPin(PORT port,unsigned int pin,PIN_MODE mode)
- {
- if (gpio_map == NULL)
- return;
- PIO->Pn[port].CFG[pin / 8] &= ~((unsigned int)0x07 << pin % 8 * 4);
- PIO->Pn[port].CFG[pin / 8] |= ((unsigned int)mode << pin % 8 * 4);
- }
-
- void GPIO_SetPin(PORT port,unsigned int pin,unsigned int level)
- {
- if (gpio_map == NULL)
- return;
- if(level)
- PIO->Pn[port].DAT |= (1 << pin);
- else
- PIO->Pn[port].DAT &= ~(1 << pin);
- }
- #ifndef __GPIO_H__
- #define __GPIO_H__
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/mman.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
-
- #define PIO_BASE_ADDRESS 0x01C20800
-
- typedef struct
- {
- unsigned int CFG[4];
- unsigned int DAT ;
- unsigned int DRV0;
- unsigned int DRV1;
- unsigned int PUL0;
- unsigned int PUL1;
- }PIO_Struct;
-
- typedef struct
- {
- PIO_Struct Pn[7];
- }PIO_Map;
-
- typedef enum
- {
- PA = 0,
- PB = 1,
- PC = 2,
- PD = 3,
- PE = 4,
- PF = 5,
- PG = 6,
- }PORT;
-
- typedef enum
- {
- IN = 0x00,
- OUT = 0x01,
- AUX = 0x02,
- INT = 0x06,
- DISABLE = 0x07,
- }PIN_MODE;
-
- extern PIO_Map *PIO;
-
- void GPIO_Init(void);
- void GPIO_ConfigPin(PORT port,unsigned int pin,PIN_MODE mode);
- void GPIO_SetPin(PORT port,unsigned int pin,unsigned int level);
- unsigned int GPIO_GetPin(PORT port,unsigned int pin);
- void GPIO_Free(void);
- #endif
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/mman.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include "gpio.h"
-
- int main()
- {
- GPIO_Init();
-
- int a = 0;
- GPIO_ConfigPin(PA,15,OUT);
- while(1)
- {
- GPIO_SetPin(PA,15,a = ~a);
- usleep(100000);
- }
-
- GPIO_Free();
- }
非常不错的资料
STATUS_LED是接在PA17,我测试过了,成功了
我想问问你这份源码能不能给个注释,看不懂啊。
能用就行了,自己查资料看看什么意思吧