RT-Thread嵌入式技术论坛
400万+工程师在用
华为|鸿蒙开发者日
直播报名
400万+工程师在用
华为|鸿蒙开发者日
直播报名

汤权

8年用户 213经验值
擅长:模拟技术 RF/无线
私信 关注
[经验]

【orangepi zero试用体验】换armbian镜像、进行GPIO测试

2016-12-13 14:46

本帖最后由 384998430 于 2016-12-14 09:27 编辑

       昨天发的开箱测评帖子的时候使用的是官方给的镜像,没有i2c和spi设备,然后在git上下载源码也下载不了,网太慢了,经常下着下着就断开了。所以直接刷了Armbian系统了,这个镜像自带了i2c等设备,可以直接使用。
QQ截图20161213135557.png

这个镜像是不带桌面环境的,但是可以自己安装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的操作程序贴出来吧,大家互相交流:
  1. #include "gpio.h"   
  2.   
  3. PIO_Map *PIO = NULL;  
  4. unsigned int *gpio_map;  
  5.   
  6. void GPIO_Init(void)  
  7. {  
  8.     unsigned int fd;  
  9.     unsigned int addr_start, addr_offset;  
  10.     unsigned int PageSize, PageMask;  
  11.       
  12.     if((fd = open("/dev/mem",O_RDWR)) == -1)  
  13.     {  
  14.         printf("open error\r\n");  
  15.         return;  
  16.     }  
  17.   
  18.     PageSize = sysconf(_SC_PAGESIZE);   //页大小  
  19.     PageMask = (~(PageSize-1));         //页掩码  
  20.     printf("PageSize:%d,PageMask:%.8X\r\n",PageSize,PageMask);  
  21.   
  22.     addr_start = PIO_BASE_ADDRESS & PageMask;  
  23.     addr_offset = PIO_BASE_ADDRESS & ~PageMask;  
  24.     printf("addr_start:%.8X,addr_offset:%.8X\r\n",addr_start,addr_offset);  
  25.   
  26.     if((gpio_map = mmap(NULL,PageSize*2,PROT_READ|PROT_WRITE, MAP_SHARED,fd,addr_start)) == NULL)  
  27.     {  
  28.         printf("mmap error\r\n");  
  29.         close(fd);  
  30.         return;  
  31.     }  
  32.     printf("gpio_map:%.8X\r\n",gpio_map);  
  33.   
  34.     PIO = (PIO_Map *)((unsigned int)gpio_map + addr_offset);  
  35.     printf("PIO:%.8X\r\n",PIO);  
  36.       
  37.     close(fd);  
  38. }  
  39.   
  40. void GPIO_ConfigPin(PORT port,unsigned int pin,PIN_MODE mode)  
  41. {  
  42.     if (gpio_map == NULL)  
  43.         return;  
  44.     PIO->Pn[port].CFG[pin / 8] &= ~((unsigned int)0x07 << pin % 8 * 4);  
  45.     PIO->Pn[port].CFG[pin / 8] |=  ((unsigned int)mode << pin % 8 * 4);  
  46. }  
  47.   
  48. void GPIO_SetPin(PORT port,unsigned int pin,unsigned int level)  
  49. {  
  50.     if (gpio_map == NULL)  
  51.         return;  
  52.     if(level)  
  53.         PIO->Pn[port].DAT |= (1 << pin);  
  54.     else  
  55.         PIO->Pn[port].DAT &= ~(1 << pin);  
  56. }  
  1. #ifndef __GPIO_H__  
  2. #define __GPIO_H__  
  3.     #include<stdio.h>   
  4.     #include<unistd.h>   
  5.     #include<sys/mman.h>   
  6.     #include<sys/types.h>   
  7.     #include<sys/stat.h>   
  8.     #include<fcntl.h>   
  9.       
  10.     #define PIO_BASE_ADDRESS    0x01C20800  
  11.   
  12.     typedef struct  
  13.     {  
  14.         unsigned int CFG[4];  
  15.         unsigned int DAT ;  
  16.         unsigned int DRV0;  
  17.         unsigned int DRV1;  
  18.         unsigned int PUL0;  
  19.         unsigned int PUL1;  
  20.     }PIO_Struct;  
  21.   
  22.     typedef struct  
  23.     {  
  24.         PIO_Struct Pn[7];  
  25.     }PIO_Map;  
  26.   
  27.     typedef enum  
  28.     {  
  29.         PA = 0,  
  30.         PB = 1,  
  31.         PC = 2,  
  32.         PD = 3,  
  33.         PE = 4,  
  34.         PF = 5,  
  35.         PG = 6,  
  36.     }PORT;  
  37.   
  38.     typedef enum  
  39.     {  
  40.         IN          = 0x00,  
  41.         OUT         = 0x01,  
  42.         AUX         = 0x02,  
  43.         INT         = 0x06,  
  44.         DISABLE     = 0x07,  
  45.     }PIN_MODE;  
  46.   
  47.     extern PIO_Map *PIO;  
  48.       
  49.     void GPIO_Init(void);  
  50.     void GPIO_ConfigPin(PORT port,unsigned int pin,PIN_MODE mode);  
  51.     void GPIO_SetPin(PORT port,unsigned int pin,unsigned int level);  
  52.     unsigned int GPIO_GetPin(PORT port,unsigned int pin);  
  53.     void GPIO_Free(void);  
  54. #endif  
  1. #include<stdio.h>   
  2. #include<unistd.h>   
  3. #include<sys/mman.h>   
  4. #include<sys/types.h>   
  5. #include<sys/stat.h>   
  6. #include<fcntl.h>   
  7. #include "gpio.h"   
  8.   
  9. int main()  
  10. {  
  11.     GPIO_Init();  
  12.       
  13.     int a = 0;  
  14.     GPIO_ConfigPin(PA,15,OUT);  
  15.     while(1)  
  16.     {  
  17.         GPIO_SetPin(PA,15,a = ~a);  
  18.         usleep(100000);  
  19.     }  
  20.       
  21.     GPIO_Free();  
  22. }  


回帖(5)

王小明

2016-12-17 22:29:05
非常不错的资料

techping

2017-1-13 20:38:09
STATUS_LED是接在PA17,我测试过了,成功了

techping

2017-1-13 20:38:57
我想问问你这份源码能不能给个注释,看不懂啊。。

汤权

2017-1-14 10:29:31
引用: techping 发表于 2017-1-13 20:38
我想问问你这份源码能不能给个注释,看不懂啊。。

能用就行了,自己查资料看看什么意思吧

赵翔

2019-4-23 13:55:25
spi怎么用啊?ARMbian没有spi?

更多回帖

打开APP