欢迎来到天天文库
浏览记录
ID:29625454
大小:495.00 KB
页数:20页
时间:2018-12-21
《led和蜂鸣器驱动(广州龙芯中科1b开发板》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、1.前言32.硬件电路32.1.LED引脚32.2.LED原理分析42.3.蜂鸣器引脚52.4.蜂鸣器原理分析53.GPIO相关分析63.1.阅读CPU手册63.2.Linux内核源码分析64.点亮一个led94.1.源码94.2.运行结果135.手动指定那个led亮135.1.源码135.2.运行结果196.蜂鸣器驱动206.1.源码207.参考资料20修订历史版本号更新日期更新内容V1.02013.9.13创建1.前言由于龙芯资料较少,现在又有点时间,写了两句,仅供初学者入门时参考,还望高手多多指教。2.硬件电路2.1
2、.LED引脚先把电路图贴出来我们选择LED9作为本次实验的对象。LED9接到龙芯1B的引脚T12再查龙芯1B处理器的用户手册v1.9如下图即CAN0_RX为GPIO38.,同理可得Led6接GPIO39;led7接GPIO40;led8接GPIO41。如原理图所示注意:这里有GPIO0,GPIO1,。。。。GPIO38,GPIO39。。。。到底表示什么意思啊?个人认为第一列的GPIO1,GPIO2,……为原理图中的编号,而第三列的GPIO38,GPIO39为CPU引脚编号,可以再CPU手册中找到。如前面的led9所示。这几
3、个引脚可以在源码中定义为宏,详细请见后面代码,这里只贴出相关部分。1.1.LED原理分析LED又叫发光二极管,有正负两个极,只要在正负两极之间接上合适的正电压,LED就导通,并发光。这里只需要让CPU的GPIO引脚输出低电平,对应的LED就被点亮。比如GPIO38输出低电平,即可点亮LED9。1.1.蜂鸣器引脚LED7接在CAN1_RX上,CAN1_RX经过电阻后接蜂鸣器,如下图所示所以LED7和蜂鸣器共用一个引脚——GPIO40。1.2.蜂鸣器原理分析蜂鸣器通过NPN三极管提供所需的大电流,当GPIO40输出低电平时,N
4、PN三极管截止,蜂鸣器不响;当输出高电平时,NPN三极管导通,蜂鸣器响。由于LED7和蜂鸣器共用同一个引脚,并且为了开机后蜂鸣器不响(想起来烦人,哈哈)。所以引脚GPIO40必须输出低电平,恰好低电平使LED导通,所以LED7在开机后一直亮着。1.GPIO相关分析1.1.阅读CPU手册首先看龙芯1B处理器的手册,其中对GPIO相关的寄存器有:配置寄存器,输入使能寄存器,输入寄存器,配置输出寄存器,MUX寄存器。根据经验,一般都是先配置GPIO为输入还是输出,然后读输入寄存器或者写输出寄存器实现输入输出功能。V1.9版的手册
5、中写得还不是很清楚,我们这里也只能猜了。贴上手册中的截图作为对比参考,我把其它CPU的截图也贴上相比较而言,龙芯1B处理器手册写得太简单了,以至于没有说清楚。1.2.Linux内核源码分析现在我们来看一下linux内核中GPIO相关代码。源码路径“linux内核根目录/arch/mips/loongson/ls1x/gpio.c”。我们想实现的功能就是简单的在GPIO口输出高低电平。源文件gpio.c中有个函数ls1b_gpio_direction_output(),从函数名字上看好像能实现这个功能。具体分析一下。/*函数
6、功能:直接在某个GPIO输出高电平或者低电平入参:structgpio_chip*chip可以为空指针unsignedgpioGPIO的序号intlevel电平值。1--高电平;0--低电平*/intls1b_gpio_direction_output(structgpio_chip*chip,unsignedgpio,intlevel){u32temp;u32mask;//入参检查:判断是否超过最大的GPIO个数,即GPIO的合法性检查if(gpio>=STLS1B_N_GPIO)return-EINVAL;//把高低电
7、平值写到输出寄存器中gpio_set_value(gpio,level);//由于寄存器是32位的,一个寄存器最多可以控制32个GPIO//就比如:配置寄存器,就有配置寄存器0和配置寄存器1//所以这里分开处理if(gpio>=32){//获取锁,执行原子操作spin_lock(&gpio_lock);mask=1<<(gpio-32);//配置GPIO引脚为GPIO功能temp=LOONGSON_GPIOCFG1;temp
8、=mask;LOONGSON_GPIOCFG1=temp;//配置GPIO引脚为输出temp=LO
9、ONGSON_GPIOIE1;temp&=(~mask);LOONGSON_GPIOIE1=temp;//释放锁spin_unlock(&gpio_lock);}else{spin_lock(&gpio_lock);mask=1<10、=ma
10、=ma
此文档下载收益归作者所有