驱动控制STM32LED灯的两秒,亮灭

news2024/11/23 21:42:40

控制LED灯的亮灭

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#define PHY_LED1_MODER 0X50006000
#define PHY_LED1_ODR 0X50006014
#define PHY_LED2_MODER 0X50007000
#define PHY_LED2_ODR 0X50007014
#define PHY_LED3_MODER 0X50006000
#define PHY_LED3_ODR 0X50006014
#define PHY_RCC 0X50000A28

#endif

test.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    char buf[128] = {0};
    int fd = open("/dev/mychrdev",O_RDWR);
    if(fd < 0)
    {
        printf("打开设备文件失败\n");
        exit(-1);
    }
    while(1)
    {
        printf("请输入控制命令--11:LED1开灯  10:LED1关灯\n21:LED2开灯  20:LED2关灯\n31:LED3开灯  30:LED3关灯>>>");
        fgets(buf,sizeof(buf),stdin);           //在终端读取
        buf[strlen(buf)-1] = '\0';
        write(fd,buf,sizeof(buf));
    }
    close(fd);
    return 0;
}

mychrdev.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "head.h"
int major;      //用于保存主设备号
char kbuf[128] = {0};
unsigned int *vir_led1_moder;
unsigned int *vir_led1_odr;
unsigned int *vir_led2_moder;
unsigned int *vir_led2_odr;
unsigned int *vir_led3_moder;
unsigned int *vir_led3_odr;
unsigned int *vir_rcc;
//封装操作方法
int mycdev_open(struct inode *inode,struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
ssize_t mycdev_read(struct file *file,char *ubuf,size_t size,loff_t *lof)
{
    int ret;
    if(sizeof(kbuf) < size)
        size = sizeof(kbuf);
    ret = copy_to_user(ubuf,kbuf,size);
    if(ret)
    {
        printk("copy to user filed\n");
        return -EIO;
    }
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)
{
    int ret;
    if(sizeof(kbuf) < size)
        size = sizeof(kbuf);
    ret = copy_from_user(kbuf,ubuf,size);
    if(ret)
    {
        printk("copy from user filed\n");
        return -EIO;
    }
    //LED1亮
    if(kbuf[0]=='1' && kbuf[1]=='1')
    {
        (*vir_led1_odr) |= (0x1 << 10);
    }
    //LED1灭
    else if(kbuf[0]=='1'  && kbuf[1]=='0') 
    {
        (*vir_led1_odr) &= (~(0x1 << 10));
    }
     //LED2亮
    if(kbuf[0]=='2'  && kbuf[1]=='1')
    {
        (*vir_led2_odr) |= (0x1 << 10);
    }
    //LED2灭
    else if(kbuf[0]=='2'  && kbuf[1]=='0')
    {
        (*vir_led2_odr) &= (~(0x1 << 10));
    }
     //LED3亮
    if(kbuf[0]=='3'  && kbuf[1]=='1')
    {
        (*vir_led3_odr) |= (0x1 << 8);
    }
    //LED3灭
    else if(kbuf[0]=='3'  && kbuf[1]=='0')
    {
        (*vir_led3_odr) &= (~(0x1 << 8));
    }
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
int mycdev_close(struct inode *inode,struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
//定义操作方法结构体变量并完成初始化
struct file_operations fops = 
{
    .open = mycdev_open,
    .read = mycdev_read,
    .write = mycdev_write,
    .release = mycdev_close,
};
static int __init mycdev_init(void)
{
    //字符设备启动注册
    major = register_chrdev(0,"mychrdev",&fops);
    if (major < 0)
    {
        printk("字符驱动设备注册失败\n");
        return major;
    }
    printk("字符驱动注册成功major = %d\n",major);
    //映射物理寄存器
    vir_led1_moder = ioremap(PHY_LED1_MODER,4);
    if(vir_led1_moder==NULL)
    {
        printk("MODER寄存器地址映射失败\n");
        return -EFAULT;
    }
    vir_led1_odr = ioremap(PHY_LED1_ODR,4);
    if(vir_led1_odr==NULL)
    {
        printk("ODR寄存器地址映射失败\n");
        return -EFAULT;
    }
    vir_led2_moder = ioremap(PHY_LED2_MODER,4);
    if(vir_led2_moder==NULL)
    {
        printk("MODER寄存器地址映射失败\n");
        return -EFAULT;
    }
    vir_led2_odr = ioremap(PHY_LED2_ODR,4);
    if(vir_led2_odr==NULL)
    {
        printk("ODR寄存器地址映射失败\n");
        return -EFAULT;
    }
    vir_led3_moder = ioremap(PHY_LED3_MODER,4);
    if(vir_led3_moder==NULL)
    {
        printk("MODER寄存器地址映射失败\n");
        return -EFAULT;
    }
    vir_led3_odr = ioremap(PHY_LED3_ODR,4);
    if(vir_led3_odr==NULL)
    {
        printk("ODR寄存器地址映射失败\n");
        return -EFAULT;
    }
    vir_rcc = ioremap(PHY_RCC,4);
    if(vir_rcc==NULL)
    {
        printk("MODER寄存器地址映射失败\n");
        return -EFAULT;
    }
    printk("寄存器地址映射成功\n");
    //寄存器初始化
    (*vir_rcc) |= (0x1 << 4);
    (*vir_rcc) |= (0x1 << 5);
    (*vir_led1_moder) &= (~(0x3 << 20));
    (*vir_led1_moder) |= (0x1 << 20);
    (*vir_led1_odr) &= (~(0x1 << 10));
    (*vir_led2_moder) &= (~(0x3 << 20));
    (*vir_led2_moder) |= (0x1 << 20);
    (*vir_led2_odr) &= (~(0x1 << 10));
    (*vir_led3_moder) &= (~(0x3 << 16));
    (*vir_led3_moder) |= (0x1 << 16);
    (*vir_led3_odr) &= (~(0x1 << 8));
    return 0;
}
static void __exit mycdev_exit(void)
{
    //取消寄存器地址映射
    iounmap(vir_led1_moder);
    iounmap(vir_led1_odr);
    iounmap(vir_led2_moder);
    iounmap(vir_led2_odr);
    iounmap(vir_led3_moder);
    iounmap(vir_led3_odr);
    iounmap(vir_rcc);
    //字符设备驱动的注销
    unregister_chrdev(major,"mychrdev");

}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

效果展示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习17:训练神经网络-反向传播算法

反向传播算法对于快速训练大型神经网络至关重要。本文将介绍算法的工作原理。 目录 1.简单的神经网络 2.激活函数 3.错误函数 4.正向传播 4.1 更新隐藏层 5.反向传播 5.1 求导数 5.2 其他导数 5.3 反向传播误差倒数 6.参考文献 1.简单的神经网络 如图 1 所示&#…

中电金信发布源启·数字构建平台

6月28日&#xff0c;中电金信发布源启数字构建平台。源启数字构建平台是企业级研发全生命周期支持管理平台、工程平台、工具链平台。 面向金融等重点行业超大规模、超复杂度的数字化应用&#xff0c;源启数字构建平台通过灵活、强大的平台赋能&#xff0c;端到端支持应用研发全…

Acunetix v23.6 (Linux, Windows) - 漏洞扫描 (Web 应用程序安全测试)

Acunetix v23.6 (Linux, Windows) - 漏洞扫描 (Web 应用程序安全测试) Acunetix | Web Application Security Scanner 请访问原文链接&#xff1a;https://sysin.org/blog/acunetix-23/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;s…

笔记:flutter中一些流行的 UI 相关库

笔记&#xff1a;flutter中一些流行的 UI 相关库 CSDN&#xff1a;https://jclee95.blog.csdn.net本文收录了很多在 flutter pub 上显示流行度较高的第三方UI库和UI框架&#xff0c;对它们的效果进行了截图&#xff0c;目的是方便开发时进行查找&#xff1b;这些模块多数来自于…

Redis详细

Redis简介 Redis的数据类型 Redis中的常用指令 通用指令 字符串操作指令 set num 1 get num setex num1 10 1 get num1 incr num incrby num 3 decr num decrby num 3哈希操作命令 列表&#xff08;List&#xff09;操作命令 rpoplpush source dest 将source中的末尾元素移除…

如何编写一条高质量测试用例

测试场景&#xff1a; 为登录功能设计测试用例 测试员为什么要会编测试用例 测试员的目标是要保证系统在各种场景下的功能是符合设计要求的。而测试用例就是测试员想到的测试场景。&#xff08;这也是高级别的测试员即使不会代码也能找到较好工作的原因&#xff09; 编写测试…

视频编码压缩基础

视频编码压缩基础 文章目录 视频编码压缩基础视频图像的质量评价帧率、分辨率和码率三者之间的关系 环路滤波研究背景 视频图像的质量评价 采用有损压缩的技术能显著降低码率&#xff0c;但是也会降低视频图像的质量&#xff0c;因此对于有损压缩算法&#xff0c;需要建立一套…

【FFmpeg实战】Flutter音视频裁剪

作者&#xff1a;JianLee 链接&#xff1a;https://www.jianshu.com/p/868c8536a9b2 flutter_ffmpeg是什么&#xff1f; ffmpeg是一个音视频处理库&#xff0c;通过命令行的形式&#xff0c;对音视频进行处理&#xff0c;而MobileFFmpeg 则是ffmpeg在移动端的实现&#xff0c;…

ipa上架App Store【uniapp-ios】

前置条件&#xff1a;已获取到.mobileprovision描述文件、.p12证书并打包生成ipa包 &#xff08;如果还没获取证书、描述文件等可以去看我前两篇博客&#xff1a;uniapp-ios打包步骤 、uniapp-ios打包安装测试。一篇是已经付费了即已经注册了Apple Developer Program&#xf…

迈瑞BC系列出图汇总

迈瑞的几个仪器出图需要画图&#xff0c;搞的很费劲&#xff0c;没办法&#xff0c;厂商自己不改&#xff0c;明明有图发Base64串的&#xff0c;就非两个图要自己画&#xff0c;画的方法又描述不清。每个LIS厂商都要浪费很多时间&#xff0c;没什么必要浪费在这种没意义的事情上…

Cannot find tomcat-9.0.0.M21/bin/setclasspath.sh

问题描述&#xff1a;将linux上的tomcat直接拷贝到以一个路径下&#xff0c;执行sh startup.sh 报错 解决&#xff1a;修改全局变量配置文件 1、vim /etc/profile &#xff08;主要修改如下图所标记的值 &#xff09; 2、source /etc/profile &#xff08;设置环境变量立即…

JMeter之事务控制器实践

目录 前言 事务控制器 JMeter控制器添加路径&#xff1a; Generate parent sample 1、不勾选任何选项&#xff1a; 2、勾选【Generate parent sample】 3、Include duration of timer and pre-post processors in generated sample 小结 前言 在JMeter中&#xff0c;事…

最牛整理,selenium自动化测试-鼠标/键盘操作(实战详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 selenium鼠标操作…

python爬虫快速入门

Python有其简洁明了&#xff0c;功能强大的优势&#xff0c;特别是在网络爬虫的应用上。接下来&#xff0c;我将分享一个适合Python初学者的爬虫快速入门教程。 一、Python爬虫简介 网页爬虫&#xff0c;是一种自动从互联网上获取信息的程序。在Python语言中&#xff0c;requ…

总结STM32嵌入式面试知识点

一、STM32F1和F4的区别&#xff1f; 内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b;主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b;浮点运算&#xff1a;F1无浮点运算单位&#xff0c;F4有&#xff1b;功能性能&…

Android Studio实现内容丰富的安卓汽车租赁平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号101 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看公告 3.查…

css重点学习

一、选择器 1.标签名选择器 div{border: 5px blue dotted;color: aquamarine;font-size: 20px;} <body><div id"div001">div标签1</div><div id"002">div标签2</div> </body> //只写出了重点部分 2.id选择器 #div0…

IMS:Activity和View处理InputEvent

IMS:Activity和View处理InputEvent 1、IMS服务处理2、Activity的DecorView界面添加3、Activity和View处理InputEvent3.1 InputEventReceiver接收InputEvent3.2 处理KeyEvent3.3 处理MotionEvent android12-release 1、IMS服务处理 关键流程EventHub -> InputReader -> In…

【BUUCTF-REVERSE刮开有奖】详解版

这道题是BUUCTF-REVERSE中的一道题目 拿到题目我们直接拖到Exeinfo_PE中查看&#xff0c;发现没有加壳&#xff0c;32位应用程序&#xff0c;打开应用程序看看&#xff1a; 打开是这样&#xff0c;我是没有找到编辑框&#xff0c;那直接拖到IDA中打开看看吧&#xff1a; 打开I…

使用python-opcua 实现modbus网关(2)

我们继续来研究如何使用python-opcua 实现opcua/modbus 网关。 opcua 开发包包含了大量的函数&#xff0c;通过研究opcua/modbus 网关的实现&#xff0c;可以了解这些函数的使用方法。由于函数过多&#xff0c;文章中函数的使用方式可能不尽合理&#xff0c;或者存在错误。希望…