led和蜂鸣器驱动(广州龙芯中科1B开发板)课后.doc

led和蜂鸣器驱动(广州龙芯中科1B开发板)课后.doc

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1. 前言 3 2. 硬件电路 3 2.1. LED引脚 3 2.2. LED原理分析 4 2.3. 蜂鸣器引脚 5 2.4. 蜂鸣器原理分析 5 3. GPIO相关分析 6 3.1. 阅读CPU手册 6 3.2. Linux内核源码分析 6 4. 点亮一个led 9 4.1. 源码 9 4.2. 运行结果 13 5. 手动指定那个led亮 13 5.1. 源码 13 5.2. 运行结果 19 6. 蜂鸣器驱动 20 6.1. 源码 20 7. 参考资料 20 修订历史 版本号 更新日期 更新内容 V1.0 2013.9.13 创建 前言 由于龙芯资料较少,现在又有点时间,写了两句,仅供初学者入门时参考,还望高手多多指教。 硬件电路 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所示。这几个引脚可以在源码中定义为宏,详细请见后面代码,这里只贴出相关部分。 LED原理分析 LED又叫发光二极管,有正负两个极,只要在正负两极之间接上合适的正电压,LED就导通,并发光。这里只需要让CPU的GPIO引脚输出低电平,对应的LED就被点亮。 比如GPIO38输出低电平,即可点亮LED9。 蜂鸣器引脚 LED7接在CAN1_RX上,CAN1_RX经过电阻后接蜂鸣器,如下图所示 所以LED7和蜂鸣器共用一个引脚——GPIO40。 蜂鸣器原理分析 蜂鸣器通过NPN三极管提供所需的大电流,当GPIO40输出低电平时,NPN三极管截止,蜂鸣器不响;当输出高电平时,NPN三极管导通,蜂鸣器响。 由于LED7和蜂鸣器共用同一个引脚,并且为了开机后蜂鸣器不响(想起来烦人,哈哈)。所以引脚GPIO40必须输出低电平,恰好低电平使LED导通,所以LED7在开机后一直亮着。 GPIO相关分析 阅读CPU手册 首先看龙芯1B处理器的手册,其中对GPIO相关的寄存器有:配置寄存器,输入使能寄存器,输入寄存器,配置输出寄存器,MUX寄存器。根据经验,一般都是先配置GPIO为输入还是输出,然后读输入寄存器或者写输出寄存器实现输入输出功能。V1.9版的手册中写得还不是很清楚,我们这里也只能猜了。贴上手册中的截图 作为对比参考,我把其它CPU的截图也贴上 相比较而言,龙芯1B处理器手册写得太简单了,以至于没有说清楚。 Linux内核源码分析 现在我们来看一下linux内核中GPIO相关代码。 源码路径“linux内核根目录/arch/mips/loongson/ls1x/gpio.c”。 我们想实现的功能就是简单的在GPIO口输出高低电平。源文件gpio.c中有个函数ls1b_gpio_direction_output(),从函数名字上看好像能实现这个功能。具体分析一下。 /* 函数功能:直接在某个GPIO输出高电平或者低电平 入参:struct gpio_chip *chip 可以为空指针 unsigned gpio GPIO的序号 int level 电平值。1--高电平;0--低电平 */ int ls1b_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int level) { u32 temp; u32 mask; // 入参检查:判断是否超过最大的GPIO个数,即GPIO的合法性检查 if (gpio = STLS1B_N_GPIO) return -EINVAL; // 把高低电平值写到输出寄存器中 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;

文档评论(0)

taotao0c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档