使用FS6818简单点亮LED灯

本文介绍了CPU如何通过控制器和寄存器间接控制硬件,特别是使用GPIO来控制LED灯的亮灭。详细步骤包括查找底板和核心板原理图,配置GPIO的输入/输出模式,设置控制寄存器,以及编写延时函数实现红绿蓝灯的循环点亮。同时,文章还提到了通过超级终端和串口通信将二进制文件加载到开发板上运行的过程。
摘要由CSDN通过智能技术生成

1.cpu控制硬件原理

CPU不能直接控制硬件,硬件是由其对应的控制器(寄存器)来控制的

    每个控制器(寄存器)都会映射到CPU寻址范围内的一段空间

    CPU通过对控制器(寄存器)的读和写实现对硬件间接的控制 

硬件板子介绍: 

2.操作步骤

    1.通过底板原理图,找到对应电路分析灯怎么亮。

        2.通过核心板原理,找到对应引脚。

        3.通过手册确定引脚功能--》GPIO,输出一个高电平灯亮

(1)通过底板原理图,找到对应电路分析灯怎么亮。首先发现LED的丝印是RGBLLED1,所以去底板原理图找,分析得知给一个高电平灯亮。

通过查找可知:有 RGB R RGB G RGB B,当然对应的也就是红绿蓝三种颜色,首先先介绍红色:板子对应的名称为 :MCU CAM1 PCLK然后咱们再去核心板原理图上找它所对应的引脚

在核心板原理图上咱们可以看到红色灯所对应的引脚名是U21,所以咱们去芯片手册上搜一下怎么操作U21即可。

由图可知U21对应的是GPIOA28,所以咱们需要配置GPIO的A类。

接下来介绍一下控制寄存器的设置功能方面:

  控制寄存器-->设置

           1)选GPIOA28的功能 --》对应寄存器是GPIOAALTFN1 :控制引脚功能的选择

                地址=基准地址+偏移地址,由图可知:

             地址:0xC001A024      设置值为:0xC001A024

 

 找到这个地址咱们就实现了通过cpu实现对硬件板子红灯的控制。

(2)找到了对应的硬件地址,那接下来就要考虑该引脚是输入还是输出。那就引入了:

GPIOxOUTENB:控制引脚的输入输出模式

GPIOAOUTENB  ---> 0xC001A004

设置GPIOA28引脚为输出模式:

GPIOAOUTENB[28] <--写-- 1    // 因为咱们找的红灯丝印对应的芯片手册是GPIOA28,所以咱们就要控制它的第28位

 这样就实现了配置红灯为输出模式了,那接下来就要给它一个高低电平来实现点亮熄灭

(3)GPIOxOUT:控制引脚输出高低电平

 那么也就是说 地址:C001A000 代表的就是控制咱们红灯的高低电平,有上面分析得知给它一个高电平就会点亮红灯。所以下面是一个红灯的点亮完整代码:

 3.绿灯、蓝灯的控制

除了红灯还有绿灯 蓝灯,操作步骤也都是和上边一样先找底板的名称再去核心板找引脚最后去芯片手册找对应的GPIO控制。

绿灯:

 

 蓝灯:

 

详细步骤也都是和上边一样的解说,那接下来咱们实现一个红绿蓝延时1s循环点亮

 

//#include <s5p6818.h>



#define GPIOEALTFN0 ((unsigned int *)0xc001e020) //绿灯

#define GPIOEOUTENB ((unsigned int *)0xc001e004)

#define GPIOEOUT ((unsigned int *)0xc001e000)



#define GPIOAALTFN1 ((unsigned int *)0xc001a024)//红灯

#define GPIOAOUTENB ((unsigned int *)0xc001a004)

#define GPIOAOUT ((unsigned int *)0xc001a000)



#define GPIOBALTFN0 ((unsigned int *)0xc001b020)//蓝灯

#define GPIOBOUTENB ((unsigned int *)0xc001b004)

#define GPIOBOUT    ((unsigned int *)0xc001b000)

void delay_ms(unsigned int ms)                   //延时函数

{

	unsigned int i, j;

	for (i = 0; i < ms; i++)

		for (j = 0; j < 1800; j++)

			;

}



int main()

{

	*GPIOEALTFN0 = *GPIOEALTFN0 & (~(0X3 << 26)); //配置绿灯的控制引脚

	*GPIOEOUTENB = *GPIOEOUTENB | (1 << 13);      //配置绿灯的输出模式



	*GPIOAALTFN1 = *GPIOAALTFN1 & (~(0X3 << 24));

	*GPIOAOUTENB = *GPIOAOUTENB | (1 << 28);



	*GPIOBALTFN0 = *GPIOBALTFN0 | (1 << 25);

	*GPIOBALTFN0 = *GPIOBALTFN0 & (~(1<< 24));

	*GPIOBOUTENB = *GPIOBOUTENB | (1 << 12);

	while (1)

	{

		*GPIOAOUT = *GPIOAOUT | (1 << 28);    //给红灯一个高电平实现点亮

		delay_ms(1000);

		*GPIOAOUT = *GPIOAOUT & (~(1 << 28));

		delay_ms(1000);



		*GPIOEOUT = *GPIOEOUT | (1 << 13);    //给绿灯一个高电平实现点亮

		delay_ms(1000);

		*GPIOEOUT = *GPIOEOUT & (~(1 << 13));

		delay_ms(1000);



		*GPIOBOUT =*GPIOBOUT |(1<<12);         //给蓝灯一个高电平实现点亮

		delay_ms(1000);

		*GPIOBOUT=*GPIOBOUT & (~(1<<12));

	}

	return 0;

}

然后咱们通过终端来传送一下数据给开发板:

1》拷贝.bin文件到windows中

2》开发板和电脑进行硬件连接

串口线的USB端插到电脑的USB口

串口线的串口端插到开发板的UART0端口上

开发板插上电源

3》配置windows超级终端

如果串口线第一次使用需要安装串口驱动

串口驱动文件在资料中

配置超级终端:

可以查看配置超级终端的使用说明文档

资料中有

在设备管理器中,查看串口线使用的那个端口号

配置端口属性:

波特率:115200

数据位:8

停止位:1

校验位:无

流控:无

4》开发板上电,超级终端会有打印信息

在倒计时减到0之前按任意键,进入到FS6818#界面

执行命令 loadb 0x43c00000   --》下载二进制文件到内存的0x43c00000

传送--》发送文件--》选择要下载.bin文件,选择Kermit协议 --》 确定下载

执行命令:go 0x43c00000   --》到0x43c00000位置运行代码

 

至此为止,咱们就实现了红绿蓝循环点亮的操作。

以下是一个简单的Linux设备驱动程序,用于点亮LED。该程序使用了GPIO子系统和字符设备框架。 ```c #include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/gpio.h> #include <asm/uaccess.h> #define LED_PIN 17 // 在树莓派上,GPIO17对应的针脚可以用来控制LED static int led_value = 0; // LED的状态,0表示关闭,1表示打开 static dev_t dev_num; // 设备号 static struct class *dev_class; // 设备类别 static struct device *dev; // 设备 // 打开设备 static int led_open(struct inode *inode, struct file *file) { return 0; } // 从设备中读取数据 static ssize_t led_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { return 0; } // 向设备中写入数据 static ssize_t led_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { char kbuf; // 从用户空间中读取一个字节的数据 if (copy_from_user(&kbuf, buf, 1)) return -EFAULT; // 根据读取的数据来控制LED if (kbuf == '0') { gpio_set_value(LED_PIN, 0); led_value = 0; } else if (kbuf == '1') { gpio_set_value(LED_PIN, 1); led_value = 1; } return 1; } // 关闭设备 static int led_release(struct inode *inode, struct file *file) { return 0; } // 设备操作函数 static struct file_operations led_fops = { .owner = THIS_MODULE, .open = led_open, .read = led_read, .write = led_write, .release = led_release, }; // 初始化设备驱动程序 static int __init led_init(void) { int ret; // 申请GPIO资源 ret = gpio_request(LED_PIN, "LED"); if (ret < 0) { printk(KERN_ERR "Failed to request GPIO %d: %d\n", LED_PIN, ret); return ret; } // 设置GPIO方向为输出 ret = gpio_direction_output(LED_PIN, 0); if (ret < 0) { printk(KERN_ERR "Failed to set GPIO %d direction: %d\n", LED_PIN, ret); gpio_free(LED_PIN); return ret; } // 注册字符设备驱动程序 ret = alloc_chrdev_region(&dev_num, 0, 1, "led"); if (ret < 0) { printk(KERN_ERR "Failed to allocate device number: %d\n", ret); gpio_free(LED_PIN); return ret; } // 创建设备类别 dev_class = class_create(THIS_MODULE, "led"); if (IS_ERR(dev_class)) { printk(KERN_ERR "Failed to create device class\n"); unregister_chrdev_region(dev_num, 1); gpio_free(LED_PIN); return PTR_ERR(dev_class); } // 创建设备 dev = device_create(dev_class, NULL, dev_num, NULL, "led"); if (IS_ERR(dev)) { printk(KERN_ERR "Failed to create device\n"); class_destroy(dev_class); unregister_chrdev_region(dev_num, 1); gpio_free(LED_PIN); return PTR_ERR(dev); } // 注册设备操作函数 cdev_init(&led_cdev, &led_fops); ret = cdev_add(&led_cdev, dev_num, 1); if (ret < 0) { printk(KERN_ERR "Failed to add device to kernel: %d\n", ret); device_destroy(dev_class, dev_num); class_destroy(dev_class); unregister_chrdev_region(dev_num, 1); gpio_free(LED_PIN); return ret; } printk(KERN_INFO "LED device driver initialized\n"); return 0; } // 卸载设备驱动程序 static void __exit led_exit(void) { // 删除字符设备 cdev_del(&led_cdev); // 销毁设备 device_destroy(dev_class, dev_num); // 销毁设备类别 class_destroy(dev_class); // 释放设备号 unregister_chrdev_region(dev_num, 1); // 释放GPIO资源 gpio_free(LED_PIN); printk(KERN_INFO "LED device driver unloaded\n"); } module_init(led_init); module_exit(led_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("LED device driver"); ``` 在上述代码中,我们使用`gpio_request()`函数来申请GPIO资源,并使用`gpio_direction_output()`函数将GPIO设置为输出模式。在`led_write()`函数中,我们根据用户空间中读取的数据来控制LED的状态。在`led_init()`函数中,我们先申请GPIO资源,然后创建字符设备,并将其注册到内核中。在`led_exit()`函数中,我们释放了GPIO资源,并删除了字符设备。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值