香橙派外设开发

文章目录

  • wiringPi库
  • 震动传感器
  • 定时器
  • II2C
  • 串口

前言

为什么我们要跑ARM+Linux?

因为在Linux内核下帮我们完成了很多底层的一些东西,我们在应用时常常只需要调用就行了,且Linux 开源,移植性好,可裁剪软硬件,功能强大。


一、wiringPi库

在Linux上进行arm开发,往往会用到GPIO,串口,定时器....,这些特定的功能接口,就是由wiringPi库所提供的。

wiringPi下载wget https://unicorn.drogon.net/wiringpi-2.46-1.deb

二、震动传感器

#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#define PIN 0

void main()
{
        wiringPiSetup();//初始化wiringpi库
        pinMode(PIN,INPUT);//设置成输入模式
        digitalWrite(PIN,HIGH);//写入电平

        while(1)
        {
                usleep(500000);//每隔500毫秒读一次

                if(digitalRead(PIN) == 0)//读取引脚电平,如果是低电平,执行里面的内容
                {
                        printf("产生震动\n");
                }
        }

}

三、定时器 

#include <stdio.h>
#include <signal.h>

/*
 * struct itimerval
 * {

        struct timeval it_interval; 计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置
        struct timeval it_value;    多久启动定时器
};
*/


/*
 * struct timeval {
        __time_t tv_sec;  Seconds.
        __suseconds_t tv_usec; Microseconds.
        };
 */

/*int setitimer (__itimer_which_t __which, const struct itimerval *__restrict __new, struct itimerval *__restrict __old) 设置定时方式

which:三种类型
ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。

很明显,这边需要捕获对应的信号进行逻辑相关处理 signal(SIGALRM,signal_handler);
返回说明:
成功执行时,返回0。失败返回-1
*/


void handler()
{
        printf("hello world\n");
}


void main()
{
        struct itimerval t1;//设置定时器结构体

        t1.it_interval.tv_sec = 1;//设置多少秒
        t1.it_interval.tv_usec = 0;//设置多少微秒



        t1.it_value.tv_sec = 1;//设置多少秒后启动
        t1.it_value.tv_usec = 0;

        if(setitimer(ITIMER_REAL,&t1,NULL) == -1 )
        {
                printf("error\n");
        }

        signal(SIGALRM,handler);//捕捉到超时的信号,去做handlr的事情,一个进程只有一个定时器


        while(1);


}

四、II2C

在wiringPi库里面提供了非常多的例程代码,我们可以用于修改,最主要是Linux下一切皆文件,使用II2的时候一定要打开它的设备文件,编译的时候如果不知道自己该指定什么库,直接看例程里面makefile用的什么库。


#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>

#include "oled.h"
#include "font.h"


int oled_Show(struct display_info *disp)
{
        int i;
        char buf[100];

        oled_putstrto(disp, 0, 9+1, "Welcome       to");//写内容
        disp->font = font1;//设置字体
        oled_send_buffer(disp);//写入到缓冲区


        return 0;
}



int main(int argc, char **argv)
{
        int e;
        char filename[32];
        struct display_info disp;

        if (argc < 2)
        {
                perror("argc");
                return -1;
        }

        memset(&disp, 0, sizeof(disp));
        sprintf(filename, "%s", argv[1]);

        disp.address = OLED_I2C_ADDR; //地址
        disp.font = font2;//字体

        e = oled_open(&disp, filename);//打开驱动设备
        e = oled_init(&disp);//初始化

        return 0;
}

五、串口 

打开串口文件,配置相对应的波特率...

#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

int fd;

void * handler(void * argc)
{
        char buf[128]={'\0'};
        int cnt;

        while(1)
        {
                memset(buf,'\0',sizeof(buf));
                cnt = serialDataAvail(fd);

                if(cnt > 0)
                {
                        read(fd,buf,cnt);
                        printf("read:%s\n",buf);
                }
        }
}


void main()
{
        wiringPiSetup();

        pthread_t t1;
        char buf[128]={'\0'};

        fd = serialOpen("/dev/ttyS5",115200);//打开串口 配置波特率
        pthread_create(&t1,NULL,handler,NULL);


        while(1)
        {
                memset(buf,'\0',sizeof(buf));
                printf("send->");
                gets(buf);

                serialPuts(fd,buf);

        }


}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No Iverson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值