精华内容
下载资源
问答
  • 嵌入式点亮灯代码

    2015-06-28 22:48:19
    嵌入式,点击按钮,就能控制的 亮灭,以及电机的转动
  • GPIO嵌入式实验 点亮LED

    千次阅读 2020-12-03 20:28:00
    GPIO嵌入式实验 点亮LED 1、简述 LED 被点亮、蜂鸣器能鸣叫的基本原理? 通过 I/O 引脚输出的高低电平来控制的亮灭和蜂鸣器的鸣叫 基本可以概括为: 1、查看原理图,确定控制引脚,如图 1.1 2、看芯片的芯片手册...

    GPIO嵌入式实验 点亮LED灯

    1、简述 LED 被点亮、蜂鸣器能鸣叫的基本原理? 通过 I/O 引脚输出的高低电平来控制灯的亮灭和蜂鸣器的鸣叫
    基本可以概括为:
    1、查看原理图,确定控制引脚,如图 1.1
    2、看芯片的芯片手册,确定如何设置控制引脚
    3、写程序

    对于 LED 灯来说,GPJCON 寄存器(一共 32 位,每四位控制一个引脚方向)
    控制哪盏灯亮,要让哪盏灯亮就让相应的引脚输出高电平,而 GPJDAT 控制灯亮
    与否,灯亮则 GPJDAT 输出高电平,反之则输出低电平。
    下面以点亮 LED1 为例说明:
    根据图可以得知 LED1 的引脚为 XMSMDATA0,根据 led 引脚核心板连接
    可知,对应的引脚为 GPJ2_0,因为要亮一号灯,所以只需先将 GPJ2CON 的最低
    位清零,然后再再给灯对应的相应位上赋值为 1。灯的亮灭由 GPJDAT 控制,同
    理让该寄存器对应位置为 1 即可(0x01)
    在这里插入图片描述

    蜂鸣器:
    蜂鸣器在实验箱中的电路图如图1.2.1所示,根据电路图可得蜂鸣器与XPWMTOUT0引脚相连,再在图1.2.2中查找。蜂鸣器即与GPD_0引脚相连。所以当XPWMTOUT0为高电平的时候蜂鸣器响,为低电平的时候蜂鸣器不响。即蜂鸣器对应引脚应为输出模式。使用GPD0DAT寄存器(如图1.2.4)来使GPD_0管脚输出高电平或低电平。首先要将GPD0_0配置为输出模式,将GPD0_0CON寄存器的低四位清空(图1.2.3),将其配置为0001,然后配置GPD0DAT,如要让蜂鸣器发出滴滴的声音,只需让GPD0_0间隔的输出高低电平。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2、简述如何判断某一个按键被按下?

    判断按键是否被按下:
    1、在按键原理图查找按键的两个引脚,再查看对应的cpu引脚
    2、判断两个引脚是否一个为输入模式(输入下拉模式),一个为输出模式(初始化为高电平,且一直为高电平)

    3、根据自己抽签,编写程序。
    (1)抽到的题目是__17___key ,led 23_____。
    (2)编程。请贴出自己的程序,并加以注释描述。
    在这里插入图片描述
    按键初始化:
    在这里插入图片描述
    灯的初始化:
    在这里插入图片描述
    在这里插入图片描述
    以上就是该实验的全部内容,如有错误,一起讨论呀!

    展开全文
  • 嵌入式实验-汇编点亮LED 一、实验目的 通过本次实验,使学生能够操作 S5PV210实验平台,搭建并使用交叉编译环境,具备初步的嵌入式裸机平台应用开发能力。 二、实验原理 由原理图可知,点亮 210 的 4 个 LED 需...

    嵌入式实验-汇编点亮LED 灯
    一、实验目的
    通过本次实验,使学生能够操作 S5PV210实验平台,搭建并使用交叉编译环境,具备初步的嵌入式裸机平台应用开发能力。
    二、实验原理
    由原理图可知,点亮 210 的 4 个 LED 需如下 2 个步骤:
    第一步: 设置寄存器GPJ2CON,使GPJ2_0/1/2/3四个引脚为输出功能;
    第二步: 往寄存器GPJ2DAT写0,使GPJ2_0/1/2/3四个引脚输出低电平,4个LED会亮;相反,
    往寄存器GPJ2DAT写1,使GPJ2_0/1/2/3四个引脚输出高电平,4个LED会灭:
    三、实验步骤、数据记录及处理
    将 sd 卡插入 PC,在 Fedora 终端执行如下命令:

    # cd 1.led_s
    # make
    # chmod 777 write2sd
    # ./write2sd
    
    

    执行 make 后会生成 210.bin 文件,执行./write2sd 后 210.bin 文件会被烧写到 sd 卡
    的扇区 1中,sd 卡的起始扇区为 0,一个扇区的大小为 512byte,sd 启动时,IROM 里的固化代码是从扇区1 开始拷贝代码的。
    四.实验现象
    将 sd 卡插入 SD卡座中,选择 sd 卡启动,然后上电,可以看到以下现象:
    LED 正常闪烁。

    【1】在这里插入图片描述

    【在这里插入图片描述

    oss

    五.实验总结
    通过这次实验,初步操作 S5PV210实验平台,搭建并使用了交叉编译环境,了解了LED灯是如何点亮的,掌握了LED灯原理图的查找。

    展开全文
  • 问:怎么写LED驱动程序? ...可发现,当执行下面语句时,开发板上的4个LED同时被点亮: [WJ2440]# ./first_test on   转载于:https://www.cnblogs.com/LiuDaohui0805/p/5270862.html

    问:怎么写LED驱动程序?

    1.搭建一个字符驱动的框架(上一节已经完成)

    2.完善硬件的操作

     

    问:驱动里操作硬件寄存器与单片机操作硬件寄存器有什么不一样的地方?

    答:单片机操作的寄存器地址是物理地址,驱动里面操作的必须是虚拟地址,因为驱动是内核的一部分,内核里的地址都是虚拟地址。

     

    问:怎么让物理地址转换为虚拟地址?

    答:使用ioremap函数,它的功能就是将物理地址映射为虚拟地址,具体怎么映射需要去看linux内存管理等内容。

     

    问:应用程序如果要传数据给内核怎么办?

    答:使用copy_from_user函数,同理如果内核要传数据给应用空间的应用程序则使用copy_to_user函数。

     

    详细请参考驱动源码:

     

    [cpp]  view plain  copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. #include <linux/kernel.h>  
    2. #include <linux/fs.h>  
    3. #include <linux/init.h>  
    4. #include <linux/delay.h>  
    5. #include <asm/uaccess.h>  
    6. #include <asm/irq.h>  
    7. #include <asm/io.h>  
    8. #include <linux/module.h>  
    9. #include <linux/device.h>     //class_create  
    10.   
    11. static struct class *firstdrv_class;  
    12. static struct device *firstdrv_device;  
    13.   
    14. volatile unsigned long *gpbcon = NULL;  
    15. volatile unsigned long *gpbdat = NULL;  
    16.   
    17. int major;  
    18. static int first_drv_open(struct inode * inode, struct file * filp)  
    19. {  
    20.     printk("first_drv_open\n");  
    21.   
    22.     /*  LED1,LED2,LED3,LED4对应GPB5、GPB6、GPB7、GPB8 
    23.      *  配置GPB5,6,7,8为输出 
    24.      */  
    25.     *gpbcon &= ~((0x3<<(5*2)) | (0x3<<(6*2)) | (0x3<<(7*2)) | (0x3<<(8*2)));  
    26.     *gpbcon |= ((0x1<<(5*2)) | (0x1<<(6*2)) | (0x1<<(7*2)) | (0x1<<(8*2)));  
    27.     return 0;  
    28. }  
    29. static int first_drv_write(struct file * file, const char __user * buffer, size_t count, loff_t * ppos)  
    30. {  
    31.     int val;  
    32.     printk("first_drv_write\n");  
    33.   
    34.     copy_from_user(&val, buffer, count);  
    35.   
    36.     if (val == 1)  
    37.     {  
    38.         // 点灯  
    39.         *gpbdat &= ~((1<<5) | (1<<6) | (1<<7) | (1<<8));  
    40.     }  
    41.     else  
    42.     {  
    43.         // 灭灯  
    44.         *gpbdat |= (1<<5) | (1<<6) | (1<<7) | (1<<8);  
    45.     }  
    46.     return 0;  
    47. }  
    48.   
    49. /* File operations struct for character device */  
    50. static const struct file_operations first_drv_fops = {  
    51.     .owner      = THIS_MODULE,  
    52.     .open       = first_drv_open,  
    53.     .write      = first_drv_write,  
    54. };  
    55.   
    56. /* 驱动入口函数 */  
    57. static int first_drv_init(void)  
    58. {  
    59.     /* 主设备号设置为0表示由系统自动分配主设备号 */  
    60.     major = register_chrdev(0, "first_drv", &first_drv_fops);  
    61.   
    62.     /* 创建firstdrv类 */  
    63.     firstdrv_class = class_create(THIS_MODULE, "firstdrv");  
    64.   
    65.     /* 在firstdrv类下创建xxx设备,供应用程序打开设备*/  
    66.     firstdrv_device = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xxx");  
    67.   
    68.     /* 将物理地址映射为虚拟地址 */  
    69.     gpbcon = (volatile unsigned long *)ioremap(0x56000010, 16);  
    70.     gpbdat = gpbcon + 1;  
    71.       
    72.     return 0;  
    73. }  
    74.   
    75. /* 驱动出口函数 */  
    76. static void first_drv_exit(void)  
    77. {  
    78.     unregister_chrdev(major, "first_drv");  
    79.     device_unregister(firstdrv_device);  //卸载类下的设备  
    80.     class_destroy(firstdrv_class);      //卸载类  
    81.     iounmap(gpbcon);                    //解除映射  
    82. }  
    83.   
    84. module_init(first_drv_init);  //用于修饰入口函数  
    85. module_exit(first_drv_exit);  //用于修饰出口函数      
    86.   
    87. MODULE_AUTHOR("LWJ");  
    88. MODULE_DESCRIPTION("Just for Demon");  
    89. MODULE_LICENSE("GPL");  //遵循GPL协议  


    应用测试程序源码:

     

     

    [cpp]  view plain  copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. #include <stdio.h>  
    2. #include <sys/types.h>  
    3. #include <sys/stat.h>  
    4. #include <fcntl.h>  
    5. #include <unistd.h>  
    6. #include <string.h>  
    7.   
    8. /* first_test on 
    9.  * first_test off 
    10.  */   
    11. int main(int argc ,char *argv[])  
    12.   
    13. {  
    14.     int fd;  
    15.     int val = 0;  
    16.     fd = open("/dev/xxx",O_RDWR);  
    17.     if (fd < 0)  
    18.     {  
    19.         printf("open error\n");  
    20.     }  
    21.       
    22.     if (argc != 2)  
    23.     {  
    24.         printf("Usage:\n");  
    25.         printf("%s <on|off>\n",argv[0]);  
    26.         return 0;  
    27.     }  
    28.     if(strncmp(argv[1],"on",2) == 0)  
    29.     {  
    30.         val = 1;  
    31.     }  
    32.     else if (strncmp(argv[1],"off",3) == 0)  
    33.     {  
    34.         val = 0;  
    35.     }   
    36.     write(fd,&val,4);  
    37.     return 0;  
    38. }  

     

     

    测试步骤:

     

    [cpp]  view plain  copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. [WJ2440]# ls  
    2. Qt            driver_test   lib           root          udisk  
    3. TQLedtest     etc           linuxrc       sbin          usr  
    4. app_test      first_drv.ko  mnt           sddisk        var  
    5. bin           first_test    opt           sys           web  
    6. dev           home          proc          tmp  
    7. [WJ2440]# ls -l /dev/xxx  
    8. ls: /dev/xxx: No such file or directory  
    9. [WJ2440]# insmod first_drv.ko   
    10. [WJ2440]# lsmod   
    11. first_drv 2300 0 - Live 0xbf003000  
    12. [WJ2440]# ls -l /dev/xxx  
    13. crw-rw----    1 root     root      252,   0 Jan  2 00:23 /dev/xxx  
    14. [WJ2440]# ./first_test   
    15. first_drv_open  
    16. Usage:  
    17. ./first_test <on|off>  
    18. [WJ2440]# ./first_test off  
    19. first_drv_open  
    20. first_drv_write  
    21. [WJ2440]# ./first_test on   
    22. first_drv_open  
    23. first_drv_write  
    24. [WJ2440]#   


    可发现,当执行下面语句时,开发板上的4个LED同时被熄灭:

     

    [WJ2440]# ./first_test off

     

    可发现,当执行下面语句时,开发板上的4个LED同时被点亮:

    [WJ2440]# ./first_test on

     

    转载于:https://www.cnblogs.com/LiuDaohui0805/p/5270862.html

    展开全文
  • 【Linux 嵌入式系列】点亮LED实战记录--基于Study210开发板 【Linux 嵌入式系列】点亮LED实战记录--基于Study210开发板

    【Linux 嵌入式系列】点亮LED灯实战记录--基于Study210开发板

    【1】板载LED硬件原理图

    【2】查阅数据手册并确定相关寄存器

    GPIO的概念,GPIO:general purpose input output,通用输入输出;GPIO即芯片的引脚,其功能和特点是可以被编程控制工作模式,电压高低等;LED接在了一个GPIO上,从而可以通过编程控制GPIO的模式和输入输出值来操控LED亮灭;

    GPIO相关的寄存器介绍
    软件操作硬件的接口是寄存器,当前要操作的硬件是LED,同时LED实际是通过GPIO来间接控制的,因此当前实际要操作的设备是SoC的GPIO,要操作这些GPIO,必须通过设置其寄存器;

     查阅数据手册可知,GPJ0相关的寄存器如下:
    GPJ0CON(GPJ0 control)GPJ0控制寄存器,用来配置各引脚的工作模式    
    GPJ0DAT(GPJ0 data)当引脚配置为input/output模式时,寄存器的相应位和引脚的电平高低相对应
    GPJ0PUD(pull up down)控制引脚内部弱上拉、下拉
    GPJ0DRV(driver)配置GPIO引脚的驱动能力
    GPJ0CONPDN(低功耗模式下的控制寄存器)
    GPJ0PUDPDN(低功耗模式下的上下拉寄存器)
    注:在驱动LED点亮时,应该将GPIO配置为output模式;

    实际上真正操控LED的硬件,主要的有:GPJ0CON,GPJ0DAT
    如何点亮LED,编程的步骤是:1、操控GPJ0CON寄存器中,选中output模式;2、操控GPJ0DAT寄存器,相应的位设置为0;

    【3】LED汇编示例代码

    LED.S示例代码

    /*
     * 文件名:	led.s	
     * 作者:	朱老师
     * 描述:	流水灯
     */
     
    #define GPJ0CON	0xE0200240
    #define GPJ0DAT	0xE0200244
    
    .global _start					// 把_start链接属性改为外部,这样其他文件就可以看见_start了
    _start:
    	// 第一步:把所有引脚都设置为输出模式,代码不变
    	ldr r0, =0x11111111			// 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数
    	ldr r1, =GPJ0CON			// 是合法立即数还是非法立即数。一般写代码都用ldr伪指令
    	str r0, [r1]				// 寄存器间接寻址。功能是把r0中的数写入到r1中的数为地址的内存中去
    
    	// 要实现流水灯,只要在主循环中实现1圈的流水显示效果即可
    flash:
    	// 第1步:点亮LED1,其他熄灭
    	//ldr r0, =((0<<3) | (1<<4) | (1<<5))	// 清清楚楚的看到哪个灭,哪个是亮
    	ldr r0, =~(1<<3)
    	ldr r1, =GPJ0DAT
    	str r0, [r1]				// 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
    	// 然后延时
    	bl delay					// 使用bl进行函数调用
    	
    	// 第2步:点亮LED2,其他熄灭	
    	ldr r0, =~(1<<4)
    	ldr r1, =GPJ0DAT
    	str r0, [r1]				// 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
    	// 然后延时
    	bl delay					// 使用bl进行函数调用
    	
    	// 第3步:点亮LED3,其他熄灭	
    	ldr r0, =~(1<<5)
    	ldr r1, =GPJ0DAT
    	str r0, [r1]				// 把0写入到GPJ0DAT寄存器中,引脚即输出低电平,LED点亮
    	// 然后延时
    	bl delay					// 使用bl进行函数调用
    	
    	b flash
    
    
    // 延时函数:函数名:delay
    delay:
    	ldr r2, =9000000
    	ldr r3, =0x0
    delay_loop:	
    	sub r2, r2, #1				//r2 = r2 -1
    	cmp r2, r3					// cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立
    	bne delay_loop
    	mov pc, lr					// 函数调用返回

    Makefile示例代码

    led.bin: led.o 
    	arm-linux-ld -Ttext 0x0 -o led.elf $^
    	arm-linux-objcopy -O binary led.elf led.bin
    	arm-linux-objdump -D led.elf > led_elf.dis
    	gcc mkv210_image.c -o mkx210
    	./mkx210 led.bin 210.bin
    	
    %.o : %.S
    	arm-linux-gcc -o $@ $< -c
    
    %.o : %.c
    	arm-linux-gcc -o $@ $< -c 
    
    clean:
    	rm *.o *.elf *.bin *.dis mkx210 -f

    【4】LED汇编代码编译、下载、运行

    编译,直接make编译得到led.bin和210.bin;下载、运行,使用usb启动方式通过dnw下载;

    命令
    dnw -a 0xd0020010 led.bin
    即可将led.bin下载到开发板并查看运行效果

    问题与解决方案

    问题1,Makefile:14: *** missing separator. Stop.

    问题原因是makefile文件命令行之前需要有Tab键,红色表示命令行前已经有Tab键;

    注意在PHONY clean这一行前加入Tab键从而解决问题;

    解决方案,详见 Makefile:14: *** missing separator. Stop. 生成文件:14:***缺少分隔符。该问题的原因分析并附解决办法

    参考致谢

    本博客为博主的学习实践总结,并参考了众多博主的博文,在此表示感谢,博主若有不足之处,请批评指正。

    【1】朱有鹏嵌入式linux核心课程

    【2】Makefile:14: *** missing separator. Stop. 生成文件:14:***缺少分隔符。该问题的原因分析并附解决办法

    展开全文
  • 该系统采用了以8051为内核的单片机芯片AT89s51作为核心控制器,以嵌入式操作系统RTX51为软件开发平台,通过控制城市十字路口的交通信号来指挥交通。该系统具有制作简单、成本低、功能实用等特点。 关键词:单片机...
  • 无论是学开发什么板子,接触的第一个程序一般都是点亮LED。 下面分别从51单片机、STM32单片机(寄存器、库函数、RTOS)、嵌入式Linux五个方面解释,这里我们假设都是低电平点亮。 51单片机点亮 #include "reg...
  • 开发嵌入式程序一般需要三个步骤:1.看原理图,确定引脚,在此程序中就是找到控制LED的引脚。2. 查阅主芯片手册,确定如何设置控制引脚。3. 写程序。 查看手册过程: 在芯片手册中搜索led找到对应gpio引脚n_LED1,...
  • 本文未经允许,禁止转载! 文章目录 前言 一、pandas是什么? 二、使用步骤 1.... 2....本文作为本人学习Linux嵌入式记录文档,仅供参考...编写裸机代码(汇编)点亮LED, 掌握如何配置Linux开发板的GPIO, 熟悉..
  • 本文作为本人学习Linux嵌入式记录文档,仅供参考。 开发板:正点原子阿尔法开发板(I.MX6ULL) 环境:Ubuntu 20.04 (LTS) (内核版本:Linux 5.4.0) 交叉编译器:arm-linux-gnueabihf 4.9.4 一、目的 搭建...
  • Linux嵌入式菜鸟之旅--点亮led

    千次阅读 2010-05-31 22:39:00
    折腾了一晚上,在Linux下终于把S3C2440开发板的LED点亮了,兴奋不已,于是著文以记之。 程序是韦东山老师编著的《嵌入式Linux应用开发完全手册》,编译源文件照书上做就可以了,主要是在烧到开发板上出了问题 ...
  • 一、本文将会以最简单的LED驱动程序带大家走进嵌入式Linux-arm驱动开发,首先,来了解一下最简单的驱动框架。 1.首先struct file_operations led_fops()函数,它是驱动的核心,所有的应用层操作都将通过它调用驱动。...
  • 博客内容基于STM32F103 RET6芯片,点亮PC3引脚LED,程序主要参考B站:STM32F103开发课程视频。       主程序(Main.c): //================================================ // ...
  • 点灯LED一、GPIO库函数介绍1、初始化函数(1个)2、读取输入电平函数(2个)3、读取输出电平函数(2个)4、设置输出电平函数(4个)二、硬件连接三、点亮LED1、三个步骤:2、点亮 一、GPIO库函数介绍 操作IO口...
  • 本文章基于国信长天 CT117E-M4 嵌入式开发板,讲述了开发板上LED的使用,LED点亮步骤,祝各位同学蓝桥杯电子比赛取得好成绩! LED部分原理图 从上图可以看出,8颗LED通过锁存器74HC573驱动,LED的阴极...
  • LED比较简单,在linux系统中,LED被看做一个字符设备来使用。因此它有字符设备的操作方法。 字符设备重要的结构体 硬件电路 编写驱动程序 编写方法可以参考“裸机代码”。具体如下 < driver / led.c >新建...
  • 博客大部分都是来自朱... LED这个硬件的功能就是点亮或者不亮,物理上想要点亮一颗LED只需要给他的正负极上加正电压即可, 要熄灭一颗LED只需要去掉电压即可。 2。查阅原理图了解板载LED硬件接法 查阅原理图,...
  • 场景:拿到了一块开发板(S5PV210),板上面有四颗LED,怎样写程序用软件(汇编语言)去控制LED,让它亮起来? 准备:开发板(S5PV210)、DNW烧写工具、安装好DNW的usb驱动、在linux中(我用的是centos6.5 64位...
  • LED灯点亮的案例 LED的原理图 有上图可以看出到,开发板上有三盏LED,分别通过LED1、'LED2'和'LED4'四条线连接,从图上可以看出如果对于三盏LED来说,右侧如果为低电平,那么LED将可以被点亮 2440连接LED的...
  • 这是用汇编语言编写的跑马程序,通过p1.5和p1.7的值判断k1,k2的开合状态,从而对二极管的亮暗进行控制。...每支发光二极管点亮时间为500ms。 K1,k2都闭合时,全部亮 K1,k2都断开时,全部
  • 嵌入式】流水程序1. 题目详情2. 代码详解 1. 题目详情 编写一个流水程序。已知,有8个LED(LED07)分别连接到S5PV210引脚的GPA0_07。当这些引脚高电平的时候,LED亮,反之则灭;两个按键(KEY0,KEY1)...
  • 使用c语言替代汇编的原理也是往寄存器地址写数值,访问寄存器地址和访问内存是一样的。给出C语言程序: int main() { unsigned int *pGPFDAT = (unsigned int*)0x56000050; unsigned int *pGPFCON = (unsigned ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,881
精华内容 1,552
关键字:

嵌入式点亮灯