怎么通过手机控制嵌入式arm9开发板哪个好

查看: 6810|回复: 0
4412开发板android入门篇_GPIO控制
主题帖子积分
& && &&&基于UT4412BV03开发板的gpio驱动及应用程序设计本文来自
& && &&&想必大家在学生时代都学过单片机,在我们学习51单片机和STM32单片机时,学习的第一个例程就是控制单片机的GPIO口来实现led灯的程序,那么我们在学习嵌入式linux时,我们可以根据自己的职业发展方向去学习,因为嵌入式开发是一个庞大的任务,涉及的知识面广泛,我们写的入门级例程偏重于linux驱动,仅仅从linux驱动程序开始,涉及到android的硬件抽象层和框架层,应用层也会涉及到相对简单的测试程序。所有程序都基于友坚恒天UT4412BV03开发板验证通过。
& && &&&本课程目标:
& && &&&※ 熟悉Exynos 4412的GPIO口的使用方法& && &&&※ 写一个控制板子上4个LED灯的驱动程序& && &&&※ 写一个测试LED的应用程序
& && &&&一.熟悉并掌握linux内核中GPIO控制的一些常用函数
& && && && &我们在使用GPIO时虽然可以不用申请,而直接操作GPIO,但这样操作不是最好的,一般情况下我们使用时先申请GPIO口,用完再释放GPIO口。
& && &&&GPIO控制常用的函数所在的文件位置& && && && &linux/arch/arm/plat-s3c/gpio-config.c& && && && &linux/arch/arm/mach-exynos/include/mach/gpio-exynos4.h& && && && &arch/arm/mach-u300/gpio.c& && &&&GPIO引脚控制常用函数介绍& && && &1.分配GPIO控制引脚的函数:gpio_request()& && &&&intgpio_request(unsigned gpio, const char *label)& && &&&返回值:如果返回0,则申请成功,返回非零值GPIO申请失败。
& && && &2.释放GPIO控制引脚的函数:gpio_free()& && && & voidgpio_free(unsigned gpio);
& && && &3.设置IO口的方向为输入、输出& && &&&int& &gpio_direction_input(unsigned gpio); & && &&&int& &gpio_direction_output(unsigned gpio, int value);& && &&&返回值:返回0,代表success,返回负数,代表错误
& && &&&4.获取I/O口的当前值& && &&&Int&&gpio_get_value(unsigned gpio);
& && &&&5.设置 I/O口输出的值& && && & void gpio_set_value(unsigned gpio, int value);& && &&&6.设置GPIO口的初始状态& && && &&&int s3c_gpio_cfgpin(unsigned int&&pin, unsigned int&&config)& && &&&config可以取值如下& && && & linux/arch/arm/plat-s3c/include/plat/gpio-cfg.h中定义的config取值& && &&&#define S3C_GPIO_INPUT& & (S3C_GPIO_SPECIAL(0))& && &&&#define S3C_GPIO_OUTPUT& &(S3C_GPIO_SPECIAL(1))& && &&&#define S3C_GPIO_SFN(x)& & (S3C_GPIO_SPECIAL(x))
& && &&&7.GPIO引脚有无上拉设置& && && &&&int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
& && &&&linux/arch/arm/plat-s3c/include/plat/gpio-cfg.h中定义的pull取值& && && & #define S3C_GPIO_PULL_NONE ((__force s3c_gpio_pull_t)0x00)& && && & #define S3C_GPIO_PULL_DOWN ((__force s3c_gpio_pull_t)0x01)& && && & #define S3C_GPIO_PULL_UP ((__force s3c_gpio_pull_t)0x02)& && &&&
& && &&&二.LED驱动编写须知的硬件接口
& && && & 在编写前我们需要知道LED的GPIO口的硬件连接。根据硬件连接我们知道要点亮LED需要控制相应引脚为高点平,熄灭LED需要控制相应引脚为低电平。IO口为1时将使三极管导通,LED点亮。IO口为0时将使三极管截止,LED熄灭。& && &&&& && &&&UT4412的LED跟芯片的连接:& && && && && &EINT5--------GPX0_5& && && && && &EINT7--------GPX0_7& && && && && &EINT20-------GPX2_4& && && && && &EINT21-------GPX2_5
& && &&&当知道硬件连接后,需要查阅4412芯片用户手册了解引脚的控制方法。& && &&&
& && &&&根据数据手册可以知道要使用GPIO管脚控制LED需要将对应GPIO设为输出模式& && &&&设置方法:假设设置GPX0_7为输出有下面两种方式& && &&&法一:s3c_gpio_cfgpin(EXYNOS5_GPX0(7), S3C_GPIO_SFN(1));& && && &&&法二:s3c_gpio_cfgpin(EXYNOS5_GPX0(7), S3C_GPIO_OUTPUT);& && &&&三.LED驱动源代码分析
& && &&&LED驱动源码ut4412led.c分析& && &&&/*& && && &* This prog you can redistribute it and/or modify& && && &* it under the terms of the GNU General Public License version 2 as& && && &* published by the Free Software Foundation& && && &*/& && &&&#include &linux/module.h&& && &&&#include &linux/init.h&& && &&&#include &linux/kernel.h&& && &&&#include &linux/sched.h&& && &&&#include &linux/delay.h&& && &&&#include &linux/platform_device.h&& && &&&#include &mach/hardware.h&& && &&&#include &asm/mach-types.h&& && &&&#include &linux/gpio.h&& && &&&#include &asm/gpio.h&& && &&&#include &asm/delay.h&& && &&&#include &linux/clk.h&& && &&&#include &plat/gpio-cfg.h&& && &&&staticint ut4412_led_status[4] = { 0 };&&//led控制的状态标志位& && &&&static void led_probe(void)& && &&&{& && &&&& && &&&ret = gpio_request(EXYNOS4_GPX0(5), &GPX05&);//GPIO引脚申请& && &&&if(ret)& && &&&printk(&GPX05 requese fail!&);& && &&&s3c_gpio_setpull(EXYNOS4_GPX0(5), S3C_GPIO_PULL_UP);//设置上拉输出& && &&&gpio_direction_output(EXYNOS4_GPX0(5),0 );//设置引脚输出低电平& && &&&ret = gpio_request(EXYNOS4_GPX0(7), &GPX07&);& && &&&if(ret)& && &&&printk(&GPX07 requese fail!&);& && &&&s3c_gpio_setpull(EXYNOS4_GPX0(7), S3C_GPIO_PULL_UP);& && &&&gpio_direction_output(EXYNOS4_GPX0(7),0);& && &&&ret = gpio_request(EXYNOS4_GPX2(4), &GPX24&);& && &&&if(ret)& && &&&printk(&GPX24 requese fail!&);& && &&&s3c_gpio_setpull(EXYNOS4_GPX2(4), S3C_GPIO_PULL_UP);& && &&&gpio_direction_output(EXYNOS4_GPX2(4),0 );& && &&&ret = gpio_request(EXYNOS4_GPX2(5), &GPX25&);& && &&&if(ret)& && &&&printk(&GPX25 requese fail!&);& && &&&s3c_gpio_setpull(EXYNOS4_GPX2(5), S3C_GPIO_PULL_UP);& && &&&gpio_direction_output(EXYNOS4_GPX2(5), 0);& && &&&ut4412_led_status[0] = 0;&&//LED状态标志& && &&&ut4412_led_status[1] = 0;& && &&&ut4412_led_status[2] = 0;& && &&&ut4412_led_status[3] = 0;& && &&&}& && &&&static&&void&&led_remove(void)& && &&&{& && &&&gpio_free(EXYNOS4_GPX0(5));//释放GPIO引脚& && &&&gpio_free(EXYNOS4_GPX0(7));& && &&&gpio_free(EXYNOS4_GPX2(4));& && &&&gpio_free(EXYNOS4_GPX2(5));& && &&&}& && &&&staticssize_t&&ut4412_led_read(struct device *dev, structdevice_attribute *attr, char *buf)& && &&&{& && &&&if(!strcmp(attr-&attr.name, &led1&))& && &&&{& && &&&if(ut4412_led_status[0] != 0)& && &&&return& &strlcpy(buf, &1\n&, 3);& && &&&else& && &&&return& &strlcpy(buf, &0\n&, 3);& && &&&}& && &&&else if(!strcmp(attr-&attr.name, &led2&))& && &&&{& && &&&if(ut4412_led_status[1] != 0)& && &&&return& &strlcpy(buf, &1\n&, 3);& && &&&else& && &&&return&&strlcpy(buf, &0\n&, 3);& && &&&}& && &&&else if(!strcmp(attr-&attr.name, &led3&))& && &&&{& && &&&if(ut4412_led_status[2] != 0)& && &&&return&&strlcpy(buf, &1\n&, 3);& && &&&else& && &&&return&&strlcpy(buf, &0\n&, 3);& && &&&}& && &&&else if(!strcmp(attr-&attr.name, &led4&))& && &&&{& && &&&if(ut4412_led_status[3] != 0)& && &&&return&&strlcpy(buf, &1\n&, 3);& && &&&else& && &&&return&&strlcpy(buf, &0\n&, 3);& && &&&}& && && && && & return& &strlcpy(buf, &\n&, 3);& && &&&}
& && &&&staticssize_t ut4412_led_write(struct device *dev, structdevice_attribute *attr, const char *buf, size_t count)& && &&&{& && &&&unsigned long on = simple_strtoul(buf, NULL, 10);
& && &&&if(!strcmp(attr-&attr.name, &led1&))& && &&&{& && &&&if(on)& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX0(5), 1);& && &&&ut4412_led_status[0] = 1;& && &&&}& && &&&else& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX0(5),0);& && &&&ut4412_led_status[0] = 0;& && &&&}& && &&&}& && &&&else if(!strcmp(attr-&attr.name, &led2&))& && &&&{& && &&&if(on)& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX0(7), 1);& && &&&ut4412_led_status[1] = 1;& && &&&}& && &&&else& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX0(7), 0);& && &&&ut4412_led_status[1] = 0;& && &&&}& && &&&}& && &&&else if(!strcmp(attr-&attr.name, &led3&))& && &&&{& && &&&if(on)& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX2(4), 1);& && &&&ut4412_led_status[2] = 1;& && &&&}& && &&&else& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX2(4), 0);& && &&&ut4412_led_status[2] = 0;& && &&&}& && &&&}& && &&&else if(!strcmp(attr-&attr.name, &led4&))& && &&&{& && &&&if(on)& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX2(5), 1);& && &&&ut4412_led_status[3] = 1;& && &&&}& && &&&else& && &&&{& && &&&gpio_direction_output(EXYNOS4_GPX2(5), 0);& && &&&ut4412_led_status[3] = 0;& && &&&}& && &&&}
& && &&&& && &&&}& && &&&static DEVICE_ATTR(led1, 0666, ut4412_led_read, ut4412_led_write);& && &&&static DEVICE_ATTR(led2, 0666, ut4412_led_read, ut4412_led_write);& && &&&static DEVICE_ATTR(led3, 0666, ut4412_led_read, ut4412_led_write);& && &&&static DEVICE_ATTR(led4, 0666, ut4412_led_read, ut4412_led_write);
& && &&&staticstruct attribute *ut4412_led_sysfs_entries[] = {& && &&&&dev_attr_led1.attr,& && &&&&dev_attr_led2.attr,& && &&&&dev_attr_led3.attr,& && &&&&dev_attr_led4.attr,& && &&&NULL,& && &&&};& && &&&staticstructattribute_group ut4412_led_attr_group = {& && &&&.name = NULL,& && &&&.attrs = ut4412_led_sysfs_entries,& && &&&};& && &&&staticint ut4412_led_probe(structplatform_device *pdev)& && &&&{& && &&&led_probe();& && &&&returnsysfs_create_group(&pdev-&dev.kobj, &ut4412_led_attr_group);& && &&&}& && &&&staticint ut4412_led_remove(structplatform_device *pdev)& && &&&{& && &&&led_remove();
& && &&&sysfs_remove_group(&pdev-&dev.kobj, &ut4412_led_attr_group);& && &&&return 0;& && &&&}& && &&&staticstructplatform_driver ut4412_led_driver = {& && &&&.probe&&= ut4412_led_probe,& && &&&.remove&&= ut4412_led_remove,& && &&&.driver&&= {& && &&&.name = &ut4412-led&,& && &&&},& && &&&};& && &&&staticstructplatform_device ut4412_led_device = {& && &&&.name& && &= &ut4412-led&,& && &&&.id& && &&&= -1,& && &&&};& && &&&staticint __devinit ut4412_led_init(void)& && &&&{& && &&&& && &&&printk(&---------ut4412_led_init-----------&);& && &&&ret = platform_device_register(&ut4412_led_device);& && &&&if(ret)& && &&&printk(&ut4412 led device register error\r\n&);& && &&&ret = platform_driver_register(&ut4412_led_driver);& && &&&if(ret)& && &&&printk(&ut4412 led driver register error\r\n&);& && &&&& && &&&}& && &&&static void ut4412_led_exit(void)& && &&&{& && &&&platform_driver_unregister(&ut4412_led_driver);& && &&&printk(&---------ut4412_led_exit-----------&);& && &&&}& && &&&module_init(ut4412_led_init);& && &&&module_exit(ut4412_led_exit);& && &&&MODULE_LICENSE(&GPL&);& && &&&MODULE_AUTHOR(&urbetter_fae&);& && &&&MODULE_DESCRIPTION(&ut4412BV03 platform led driver&);
& && &&&四.将LED驱动加入到kernel中编译
& && &&&UT4412BV03开发板配套的例程放在光盘中:Demo目录下& && &&&将led_demo\driver目录下的led文件夹复制到kernel中kernel\drivers\char目录
& && &&&打开char目录下的Makefile文件键入如下:& && &&&obj-y&&+=&&led/
& && &&&& && &&&打开char目录下的Kconfig文件键入如下:& && &&&Source&&“driver/char/led/Kconfig”& && &&&& && &&&代码添加后就可以执行:make&&–j2 编译出kernel镜像文件
& && &&&注:-jn表示用几个线程来编译程序,如果只用make单线程编译,速度较慢,因此,我们可以根据电脑的配置来决定,我的笔记本电脑是四核的,所以我还可以运行4个线程来编译:make&&--j4
& && &&&利用fastboot命令烧写kernel镜像:fastboot&&flash kernel&&zImage
& && &&&五.编写LED驱动的测试程序
& && &&&1.新建Android应用程序,点击“NEXT”& && &&&& && &&&2.多次点击“NEXT”如下图点击“Finish”完成Android应用工程的创建& && &&&
& && && & 3.创建完工程后,进行Android UI界面的设计& && &&&复制led_demo目录下的图片bg1到android工程的/res/drawable目录下,& && &&&在activity_utled_test.xml目录下引用图片资源作为UI界面的背景& && &&&在其中加入如下语句:android:background=&@drawable/bg1&& && &&&
& && && & 界面布局文件代码如下:& && &&&&LinearLayoutxmlns:android=&/apk/res/android&& && &&&android:layout_width=&wrap_content&& && &&&android:layout_height=&match_parent&& && &&&android:background=&@drawable/bg1&& && &&&android:gravity=&center_horizontal&& && &&&androidrientation=&vertical&&& && &&&&TableLayout& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&&& && &&&&TableRow& && &&&android:id=&@+id/tableRow1&& && &&&android:layout_width=&wrap_content&& && &&&android:layout_height=&wrap_content&&& && &&&&Button& && &&&android:id=&@+id/btn1on&& && &&&android:layout_marginLeft=&230dp&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:width=&300dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_marginTop=&150dp&& && &&&android:text=&@string/led1_on&/&& && &&&&Button& && &&&android:id=&@+id/btn1off&& && &&&android:layout_marginLeft=&20dp&& && &&&android:width=&300dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_marginTop=&150dp&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:text=&@string/led1_off&/&& && &&&&/TableRow&& && &&&&TableRow
& && &&&android:id=&@+id/tableRow2&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&&& && &&&&Button& && &&&android:id=&@+id/btn2on&& && &&&android:layout_marginLeft=&230dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:text=&@string/led2_on&/&& && &&&&Button& && &&&android:id=&@+id/btn2off&& && &&&android:layout_marginLeft=&20dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:text=&@string/led2_off&/&& && &&&&/TableRow&& && &&&&TableRow& && &&&android:id=&@+id/tableRow3&& && &&&android:layout_width=&wrap_content&& && &&&android:layout_height=&wrap_content&&& && &&&&Button& && &&&android:id=&@+id/btn3on&& && &&&android:layout_marginLeft=&230dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:text=&@string/led3_on&/&& && &&&&Button& && &&&android:id=&@+id/btn3off&& && &&&android:layout_marginLeft=&20dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:text=&@string/led3_off&/&& && &&&&/TableRow&& && &&&&TableRow& && &&&android:id=&@+id/tableRow4&& && &&&android:layout_width=&wrap_content&& && &&&android:layout_height=&wrap_content&&& && &&&&Button& && &&&android:id=&@+id/btn4on&
& && &&&android:layout_marginLeft=&230dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:text=&@string/led4_on&/&& && &&&&Button& && &&&android:id=&@+id/btn4off&& && &&&android:layout_marginLeft=&20dp&& && &&&android:textColor=&#00FF00&& && &&&android:layout_width=&match_parent&& && &&&android:layout_height=&wrap_content&& && &&&android:text=&@string/led4_off&/&& && &&&&/TableRow&& && &&&&/TableLayout&& && &&&&/LinearLayout&
& && &&&4.编辑Android的java代码
& && && & //定义LED控制用到的Button& && &&&Button btn1on,btn1& && &&&Button btn2on,btn2& && &&&Button btn3on,btn3& && &&&Button btn4on,btn4off;
& && &&&&&//Button资源的引用
& && &&&btn1on=(Button)findViewById(R.id.btn1on);& && &&&btn1off=(Button)findViewById(R.id.btn1off);& && &&&btn2on=(Button)findViewById(R.id.btn2on);& && &&&btn2off=(Button)findViewById(R.id.btn2off);& && &&&btn3on=(Button)findViewById(R.id.btn3on);& && &&&btn3off=(Button)findViewById(R.id.btn3off);& && &&&btn4on=(Button)findViewById(R.id.btn4on);& && &&&btn4off=(Button)findViewById(R.id.btn4off);
& && &&&&&//定义button的监听事件
& && &&&btn1on.setOnClickListener(btn1onListener);& && &&&btn1off.setOnClickListener(btn1offListener);& && &&&btn2on.setOnClickListener(btn2onListener);& && &&&btn2off.setOnClickListener(btn2offListener);& && &&&btn3on.setOnClickListener(btn3onListener);& && &&&btn3off.setOnClickListener(btn3offListener);& && &&&btn4on.setOnClickListener(btn4onListener);& && &&&btn4off.setOnClickListener(btn4offListener);
& && &&& //实现button事件的函数调用
& && &&&privateButton.OnClickListenerbtn1onListener = newButton.OnClickListener(){& && &&&publicvoidonClick(View v) {& && &&&UTledcontrol(1,&1&);& && &&&}& && &&&};& && &&&注:button实现代码未完全写出,完整代码见光盘资料led_demo\APK& && &&&LED控制函数的编写:
& && &&&privatevoidUTledcontrol(intcmd,Stringstr)& && &&&{& && &&&try& && &&&{& && &&&switch(cmd)& && &&&{& && &&&case 1 :{& && &&&FileOutputStreamutled1=newFileOutputStream(&/sys/devices/platform/ut4412-led/led1&);& && &&&utled1.write(str.getBytes(&iso-8859-1&));& && &&&utled1.close();& && && && && && && && & };& && &&&case 2:{& &&&//打开驱动程序中的了的设备节点,并向该节点写入控制命令& && &&&FileOutputStreamutled2=newFileOutputStream(&/sys/devices/platform/ut4412-led/led2&);& && &&&utled2.write(str.getBytes(&iso-8859-1&));& && &&&utled2.close();& && && && && && && &&&};& && &&&case 3:{& && &&&FileOutputStreamutled3=newFileOutputStream(&/sys/devices/platform/ut4412-led/led3&);& && &&&utled3.write(str.getBytes(&iso-8859-1&));& && &&&utled3.close();& && && && && && && &&&};& && &&&case 4:{& && &&&FileOutputStreamutled4=newFileOutputStream(&/sys/devices/platform/ut4412-led/led4&);& && &&&utled4.write(str.getBytes(&iso-8859-1&));& && &&&utled4.close();& && && && && && && &&&};break;& && &&&default:& && && &&&}& && &&&}& && &&&catch(Exception e){& && &&&Toast.makeText(UTledTest.this, &led open devices error!&, Toast.LENGTH_SHORT).show();& && &&&}& && && &}& && &&&}& && &&&
& && &&&当Android程序编译完毕后,可以执行程序并将APP下载到开发板上,然后通过此应用程序测试
& && &&& LED驱动是否编写成功:
& && &&&Android应用程序UI界面如图所示:
& && &&&& &到这你可以点击按键试试效果啦!
, , , , , ,
友坚论坛,,4412开发板,4412核心板,ARM方案定制。
逛了这许久,何不进去瞧瞧?
&下次自动登录
用其他账号登录:
TEL: 1/8602
Powered by嵌入式学习之ARM开发板上利用按键产生的终端控制led灯的亮和灭
按动K1按键,LED1亮,
按动K1按键,LED1亮,
按动K1按键,LED1亮,
按动K1按键,LED1亮,
按动K1按键,LED1亮,
#include &stdlib.h&
#include &string.h&
#include "def.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "def.h"
#include "Option.h"
void& delay(unsigned long dly)
for(; dly & 0; dly--);
&void __irq IRQ_KEY()
if(rINTPND==BIT_EINT8_23)
&&&&&&&&&&&&&
ClearPending(BIT_EINT8_23);//清除中断标志
&&&&&&&&&&&&&
if(rEINTPEND&(1&&8))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
rGPBDAT = ~(1&&5);//点亮led1,其他灯灭
&&&&&&&&&&&
if(rEINTPEND&(1&&11))
&&&&&&&&&&&&&&&&&&&&
rGPBDAT = ~(1&&6);//点亮led2
&&&&&&&&&&&&&
&&&&&&&&&&&&&
if(rEINTPEND&(1&&13))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
rGPBDAT = ~(1&&7);//点亮led3
&&&&&&&&&&&&&
&&&&&&&&&&&&&
if(rEINTPEND&(1&&14))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
rGPBDAT = ~(1&&8);//点亮led4
&&&&&&&&&&&&&
&&&&&&&&&&&&&
if(rEINTPEND&(1&&15))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
~(0xf&&5);//设置GPB5.GPB6.GPB7.GPB8引脚输出设置成0,则CPU输出电压为3.3V,GPB5.GPB6.GPB7.GPB8引脚对应的LED灯亮
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
if(rEINTPEND&(1&&19))
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
~(0xf&&5)|(0xf&&5);//设置GPB5.GPB6.GPB7.GPB8引脚输出设置成1,则CPU输出电压为3.3V,GPB5.GPB6.GPB7.GPB8引脚对应的LED灯灭&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&
rGPGCON =rGPGCON &
(~((3&&0)|(3&&6)|(3&&10)|(3&&12)|(3&&14)|(3&&22)))
&&&&&&&&&&&&&&&&&&&&&&&&
((2&&0)|(2&&6)|(2&&10)|(2&&12)|(2&&14)|(2&&22));
|=((1&&8)|(1&&11)|(1&&13)|(1&&14)|(1&&15)|(1&&19));//外部中断悬挂寄存器,清0无请求,1时有中断请求
rSRCPND |= (1&&5);//EINT8_23
指示中断源状态,0无中断源请求,1时有中断源请求
rINTPND |=(1&&5);//EINT8_23
指示中断状态,0无中断请求,1时有中断请求
void EINT_Init()
&//设置GPGCON中GPG0为10,为外部中断EINT[8],对应K1按键
rGPGCON =rGPGCON &
(~((3&&0)|(3&&6)|(3&&10)|(3&&12)|(3&&14)|(3&&22)))
&&&&&&&&&&&&&&&&&&&&&&&&
((2&&0)|(2&&6)|(2&&10)|(2&&12)|(2&&14)|(2&&22));
rEXTINT0=0x2;//设置为下降沿触发
pISR_EINT8_23=(unsigned int)IRQ_KEY;
rINTMOD=0;//所用中断都是IRQ
rINTMSK=0//开EINT0中断,响应中断
&=(~((1&&8)|(1&&11)|(1&&13)|(1&&14)|(1&&15)|(1&&19)));//使能各个所需要的具体中断
void Main(void)
MMU_Init();& //mmu.c中函数
rGPBCON =0x;//// 将LED1-4对应的GPB5/6/7/8四个引脚设为输出
rGPBUP|=0x1e0;//将GPB5-8的上拉电阻设为使用,,其对应bit位设为1
EINT_Init();
&&& while(1)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客访问: 95011
博文数量: 96
博客积分: 2500
博客等级: 少校
技术积分: 1035
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
标签: arm9开发板 嵌入式操作系统 arm
今天有人问我是如何与电脑实现连接的,就是说ARM的哪个接口连接电脑的哪个接口?用什么线连接?我在设计一个基于ARM的嵌入式Linux系统,由OV7660对空间图像进行采集,并输出图像数据,CY7C68013的I/O口接收到图像数据后,通道将数据发送到PC中进行保存。 由CY7C68013引出的总线应该连在PC的接口还是连在上?等问题,想信诸如此类的问题有很多初学着都经常会遇到的,以下是我自己的一点想法仅供大家参考:
一台专用的台式电脑(不一定是PC)有很大的主内存来支持操作系统、应用程式和数据,连同一个大容量存储设备(硬盘、DVD/CD-ROM等)的接口。这种台式电脑带有各种各样的I/O设备以便用户输入(键盘、鼠标和话筒)、输出(显示器及耳机)连同互联(网络和外设)。快速的处理器需要一个系统管理器来监控其核心温度、供给电压连同进行系统重启。大规模电脑也可能采用上述的形式。例如,他可能作为一个网络路由器或网关从而需要一个或多个网络接口、大容量内存连同快速操作。他们也可能需要某种形式的用户界面来作为嵌入式应用的一部分。或在许多情况下,他们也可能只是专用于某一特定任务的常规电脑。因此,单就硬件而言,许多高性能和常规台式机没有什么大的差别。较小的使用微控制器作为他们的处理器,这样做的长处在于处理器能够将很多的电脑功能包含在一个芯片上。微控制器至少有一个CPU,一个小容量的内部存储器(ROM和/或)连同作为子系统模块在微控制器内部实现的某种I/O。这些子系统为处理器提供了附加功能,许多处理器通常都有这种子系统。您经常能够在微处理器里发现这些子系统,这些子系统最普通的I/O是数字I/O,他们都是端口,能够以引脚为基础,由软件配置成数字输入或输出。作为数字输入,这些端口能够用来读取开关或按钮的状态连同读取另外一个设备的数字状态;作为数字输出,他们能够用来开启或关闭外部设备,也能够向外部设备传达工作状态。例如,一个数字输出端口能够为一个电机激活控制电路,开/关灯,或可能的话还能够触发诸如花园浇灌系统的水压阀这样的设备,当然也控制洗衣机。将数字输入/输出端口结合在一起能够用来合成对其他芯片的接口和协议。除了数字I/O外,大多数控制器更有其他子系统。而假如无需其他子系统的功能,那么微控制器本身也能将其他子转换到通用数字I/O。作为一个系统设计者,这就为您在所设计的应用里如何使用微控制器提供了多种选择。
阅读(730) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 arm9嵌入式视频教程 的文章

 

随机推荐