实现开发板三盏灯点亮熄灭

实现开发板三盏灯点亮熄灭

typedef struct {
    volatile unsigned int MODER;   // 0x00
    volatile unsigned int OTYPER;  // 0x04
    volatile unsigned int OSPEEDR; // 0x08
    volatile unsigned int PUPDR;   // 0x0C
    volatile unsigned int IDR;     // 0x10
    volatile unsigned int ODR;     // 0x14
    volatile unsigned int BSRR;    // 0x18
    volatile unsigned int LCKR;    // 0x1C 
    volatile unsigned int AFRL;    // 0x20 
    volatile unsigned int AFRH;    // 0x24
    volatile unsigned int BRR;     // 0x28
    volatile unsigned int res;
    volatile unsigned int SECCFGR; // 0x30

}gpio_t;

#define  GPIOE  (0x50006000)
#define  GPIOF   (0x50007000)
  • 三盏灯逻辑 kbuf[0]:表示操作哪一盏灯 kbuf[1]:表示操作灯的状态
  • kbuf[0] = 1==> 操作LED1 ==> kbuf[1] = 1 点亮 kbuf[1] = 0 熄灭
  • kbuf[0] = 2 ==> 操作LED2 ==> kbuf[1] = 1 点亮 kbuf[1] = 0 熄灭
  • kbuf[0] = 3 ==> 操作LED3 ==> kbuf[1] = 1 点亮 kbuf[1] = 0 熄灭

 

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uacce.h>
#include <linux/io.h>
#include "myled.h"

#define CNAME "myled"
unsigned int major = 0;
char kbuf[100] = "";

unsigned int *rcc_virt = NULL;
gpio_t *gpioe_virt = NULL;
gpio_t *gpiof_virt = NULL;

#define LED1_ON (gpioe_virt->ODR |= (0x1 << 10))
#define LED1_OFF (gpioe_virt->ODR &= (~(0x1 << 10)))
#define LED2_ON (gpiof_virt->ODR |= (0x1 << 10))
#define LED2_OFF (gpiof_virt->ODR &= (~(0x1 << 10)))
#define LED3_ON (gpioe_virt->ODR |= (0x1 << 8))
#define LED3_OFF (gpioe_virt->ODR &= (~(0x1 << 8)))

gpio_t gpio;

int myled_open(struct inode *inode, struct file *file)
{
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    return 0;
}
ssize_t myled_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loffs)
{
    int ret;
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);

    if (size > sizeof(kbuf))
        size = sizeof(kbuf);

    ret = copy_from_user(kbuf, ubuf, size);
    if (ret)
    {
        printk("copy from user is error\n");
        return -EIO;
    }
    switch (kbuf[0])
    {
    case 1:
        if (kbuf[1] == 1)
        {
            LED1_ON;
        }
        else
        {
            LED1_OFF;
        }
        break;
    case 2:
        if (kbuf[1] == 1)
        {
            LED2_ON;
        }
        else
        {
            LED2_OFF;
        }
        break;
    case 3:
        if (kbuf[1] == 1)
        {
            LED3_ON;
        }
        else
        {
            LED3_OFF;
        }
        break;
    default:
        break;
    }
    return size;
}
int myled_close(struct inode *inode, struct file *file)
{
    printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    return 0;
}

const struct file_operations fops = {
    .open = myled_open,
    .write = myled_write,
    .release = myled_close,
};

static int __init demo_init(void)
{
    // 注册字符设备驱动
    major = register_chrdev(0, CNAME, &fops);
    if (major < 0)
    {
        printk("register chrdev is error\n");
        return -EIO;
    }
    printk("major = %d\n", major);

    rcc_virt = ioremap(RCC_MP_AHB4ENSETR, 4);
    if (rcc_virt == NULL)
    {
        printk("ioremap rcc is error\n");
        return -EIO;
    }
    gpioe_virt = ioremap(GPIOE, sizeof(gpio));
    if (gpioe_virt == NULL)
    {
        printk("ioremap gpioe moder is error\n");
        return -EIO;
    }
    gpiof_virt = ioremap(GPIOF, sizeof(gpio));
    if (gpiof_virt == NULL)
    {
        printk("ioremap gpiof is error\n");
        return -EIO;
    }

    *rcc_virt |= (0x3 << 4);

    gpioe_virt->MODER &= (~(0x3 << 20));
    gpioe_virt->MODER |= (0x1 << 20);
    gpioe_virt->ODR |= (0x1 << 10);

    gpiof_virt->MODER &= (~(0x3 << 20));
    gpiof_virt->MODER |= (0x1 << 20);
    gpiof_virt->ODR |= (0x1 << 10);

    gpioe_virt->MODER &= (~(0x3 << 16));
    gpioe_virt->MODER |= (0x1 << 16);
    gpioe_virt->ODR |= (0x1 << 8);
    return 0;
}
static void __exit demo_exit(void)
{
    iounmap(gpiof_virt);
    iounmap(gpioe_virt);
    iounmap(rcc_virt);
    // 注销字符设备驱动
    unregister_chrdev(major, CNAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
#ifndef __MYLED_H__
#define __MYLED_H__

typedef struct {
    volatile unsigned int MODER;   // 0x00
    volatile unsigned int OTYPER;  // 0x04
    volatile unsigned int OSPEEDR; // 0x08
    volatile unsigned int PUPDR;   // 0x0C
    volatile unsigned int IDR;     // 0x10
    volatile unsigned int ODR;     // 0x14
    volatile unsigned int BSRR;    // 0x18
    volatile unsigned int LCKR;    // 0x1C 
    volatile unsigned int AFRL;    // 0x20 
    volatile unsigned int AFRH;    // 0x24
    volatile unsigned int BRR;     // 0x28
    volatile unsigned int res;
    volatile unsigned int SECCFGR; // 0x30

}gpio_t;

#define RCC_MP_AHB4ENSETR 0x50000A28
// #define GPIOE_MODER 0x50006000
// #define GPIOE_ODR 0x50006014

#define  GPIOE   (0x50006000)
#define  GPIOF   (0x50007000)

#endif
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    char buf[128] = "";
    int fd = -1;
    fd = open("/dev/myled", O_RDWR);
    if (fd == -1)
    {
        perror("open is error");
        exit(1);
    }
    // buf[0]=1 led1 buf[0]=2 led2 buf[0]=3 led3
    //  buf[1]=0灭  buf[1]=1亮
    while (1)
    {
        buf[0] = 1;
        buf[1] = 1;
        write(fd, buf, sizeof(buf));
        sleep(1);
        buf[1] = 0;
        write(fd, buf, sizeof(buf));
        sleep(1);

        buf[0] = 2;
        buf[1] = 1;
        write(fd, buf, sizeof(buf));
        sleep(1);
        buf[1] = 0;
        write(fd, buf, sizeof(buf));
        sleep(1);

        buf[0] = 3;
        buf[1] = 1;
        write(fd, buf, sizeof(buf));
        sleep(1);
        buf[1] = 0;
        write(fd, buf, sizeof(buf));
        sleep(1);
    }
    close(fd);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705788.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验五 网络中的树

文章目录 5.1 网络中的树第一关 认识树相关知识编程要求代码文件 第2关 根节点的二阶邻居求解方法相关知识编程要求代码文件 第3关 根节点的n阶邻居求解方法相关知识 5.2 权值矩阵与环&#xff08;无向网络&#xff09;第1关 无向网络的权值矩阵相关知识编程要求代码文件 第2关…

CTFHUB-SQL注入-Cookie注入

由于本关是cookie注入&#xff0c;就不浪费时间判断注入了&#xff0c;在该页面使用 burp工具 抓包&#xff0c;修改cookie后面&#xff0c;加上SQL语句&#xff0c;关掉burp抓包&#xff0c;就可以在题目页面显示结果了 判断字段数量 发现字段数量是2列 使用id-1 union sele…

Linux3(进程 编辑文件 用户管理 网络)

目录 一、进程管理 一些命令 1. ps 当前的用户进程 VSZ (Virtual Set Size) RSS (Resident Set Size) 2. kill 进程杀死命令 3. top 查看进程的信息 4. 操作系统负载查看 进程划分 进程的挂起 二、编辑文件 1. Vim编辑器 2. Vim的模式 2.1 一般模式下的操作 …

3d数字家居展馆线上制作工具更具创意

立足于引领未来展览新潮流的出发点&#xff0c;深圳华锐视点3D云展厅依托前沿的Web3D技术和vr全景制作技术&#xff0c;提供Web3D在线创意展厅搭建编辑器&#xff0c;为您打造一个突破时空限制、风格多样的线上展厅。 Web3D在线创意展厅搭建编辑器将您的产品以三维模型的形式生…

React 渲染函数render、初始化函数、更新函数运行了两次,原因为何,如何解决? React.StrictMode

文章目录 Intro官网解释解决另一篇官网文章——初始化函数或更新函数运行了两次 Intro 我在用 react 写一个 demo &#xff0c;当我在某个自定义组件的 return 语句之前加上一句log之后&#xff0c;发现&#xff1a;每次页面重新渲染&#xff0c;该行日志都打印了两次&#xf…

Android Jetpack Compose入门教程(二)

一、列表和动画 列表和动画在应用内随处可见。在本课中&#xff0c;您将学习如何利用 Compose 轻松创建列表并添加有趣的动画效果。 1、创建消息列表 只包含一条消息的聊天略显孤单&#xff0c;因此我们将更改对话&#xff0c;使其包含多条消息。您需要创建一个可显示多条消…

开个技术外挂 | 数字孪生技术如何成为美洲杯帆船赛成功的关键?

若您对数据分析以及人工智能感兴趣&#xff0c;欢迎与我们一起站在全球视野关注人工智能的发展&#xff0c;与Forrester 、德勤、麦肯锡等全球知名企业共探AI如何加速工业变革&#xff0c;共享众多优秀行业案例&#xff0c;开启AI人工智能全球新视野&#xff01;&#xff01; …

CPN Tools学习——时间和队列【重要】

-Timed Color Sets 时间颜色集 -Token Stamps 令牌时间戳 -Event Clock 全局/事件/模拟时钟 -Time Delays on Transitions过渡的时间延迟 - List Color Set列表颜色集 - Queue排队 1.时间颜色集 在定时CPN模型令牌中有&#xff1a; &#xff08;1&#xff09;象征性的颜…

嵌入式作业7

1、2个或以上同学相互连接&#xff0c;利用CAN通信&#xff0c;向对方发送带有本人姓名的信息。连线方式&#xff1a;按基本原理性电路&#xff08;不带收发器芯片&#xff09;连接&#xff0c;参考教材图10-1。 2、在ADC实验中&#xff0c;结合热敏电阻&#xff0c;分别通过触…

Photoshop 2024 mac/win版:探索图像处理的全新境界

Photoshop 2024是Adobe推出的最新图像处理与设计软件&#xff0c;它在继承了前作所有优秀特性的基础上&#xff0c;实现了多个方面的质的飞跃。这款软件凭借其卓越的图像处理性能、丰富的创意工具以及精确的选区编辑功能&#xff0c;成为了图像处理领域的佼佼者。 Photoshop 2…

UEditor文件上传超出大小限制修改无效问题

网上说的方法&#xff0c;试过了&#xff0c;不生效 百度ueditor富文本编辑框怎么设置上传图片大小限制_umeditor 控制图片上传不得超过1m-CSDN博客 直接修改此处

探索未来边界:前沿技术引领新纪元

目录 引言 一、人工智能与深度学习&#xff1a;智慧生活的引擎 1.医疗应用 2.智能家居 3.自动驾驶 二、量子计算&#xff1a;解锁宇宙的密钥 1.量子比特示意图 2.量子计算机实物图 3.分子模拟应用 三、生物技术&#xff1a;生命科学的革新 1.CRISPR-Cas9基因编辑图 2.合成生…

史上最全盘点:一文告诉你什么是erp?erp系统厂商分别有哪些?

✅ 什么是ERP&#xff1f; ERP是Enterprise Resource Planning&#xff08;企业资源计划&#xff09;的简称&#xff0c;ERP是针对物资资源管理&#xff08;物流&#xff09;、人力资源管理&#xff08;人流&#xff09;、财务资源管理&#xff08;资金流&#xff09;、信息资…

智能家居建材,打造未来家居生活

智能家居建材&#xff0c;正引领着家居行业的新潮流。它融合了先进的科技与人性化的设计&#xff0c;为我们打造了一个充满未来感的家居新体验。 想象一下&#xff0c;当你走进家门&#xff0c;智能门锁自动识别你的身份&#xff0c;轻轻一推即可进入。室内环境自动调节到最舒适…

正大国际期货:小小的钱如何在期货市场翻身?

小小的钱 &#xff0c;莫名喜感→在小小的花园里面哇呀哇呀挖 有可能性&#xff0c;因为有杠杆所以收益大&#xff0c;同时风险亏损起来也快&#xff0c;&#xff0c;所以必须用小亏损换大收益&#xff0c;&#xff0c;比如跌过这个位置就止损退出&#xff08;永远在低点附近买…

SQL聚合函数---汇总数据

此篇文章内容均来自与mysql必知必会教材&#xff0c;后期有衍生会继续更新、补充知识体系结构 文章目录 SQL聚集函数表&#xff1a;AGV()count()根据需求可以进行组合处理 max()min()max&#xff08;&#xff09;、min&#xff08;&#xff09;、avg&#xff08;&#xff09;组…

江协科技51单片机学习- p4 点亮一个LED灯

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

vue2文件下载和合计表格

vue2文件数据不多可以直接下载不需要后端的时候 1.首先&#xff0c;确保你已经安装了 docx 和 file-saver 库 npm install file-saver npm install docx file-saver2.全部代码如下 <template><a-modaltitle"详情"width"80%"v-model"visi…

【x264】变换量化模块的简单分析

【x264】变换量化模块的简单分析 1. 变换量化1.1 变换&#xff08;transform&#xff09;1.2 量化&#xff08;quant&#xff09; 2. 编码入口&#xff08;x264_macroblock_encode&#xff09;2.1 内部编码&#xff08;macroblock_encode_internal&#xff09;2.1.1 SKIP模式2.…

CSS 字体颜色渐变

CSS 字体颜色渐变 css 代码: 注意&#xff1a;background: linear-gradient&#xff08;属性&#xff09;&#xff0c;属性可以调整方向 例如&#xff1a;to bottom 上下结构&#xff0c;to right 左右结构font-family: DIN, DIN;font-weight: normal;font-size: 22px;color:…