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

这篇具有很好参考价值的文章主要介绍了驱动控制STM32LED灯的两秒,亮灭。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

控制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");

效果展示

驱动控制STM32LED灯的两秒,亮灭,stm32,算法,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-531706.html

到了这里,关于驱动控制STM32LED灯的两秒,亮灭的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • arm学习之stm32设备树学习-中断控制led灯亮灭+字符设备指令控制led灯亮灭

    中断控制led灯亮灭 驱动文件源码 led-key.c 字符设备指令控制led灯亮灭 驱动文件 led-cmd.c 应用文件 led.c

    2024年02月14日
    浏览(46)
  • 【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    无锁存时:当按下独立按钮时LED亮,松开LED灭。 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。 硬件部分 软件部分 1、引入头文件 2、主函数 首先时钟、led、按键初始化 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常

    2024年02月08日
    浏览(95)
  • STM32通过串口发送指令控制LED灯亮灭OLED并显示命令

    先来看看程序运行的结果吧: 接下来就不说废话了,自己看源代码吧!每一行我都做了注释: 首先是主函数main.c文件: 接下来是LED.h文件: 接下来是LED.c文件: 记下来是串口相关的Serial.h文件: 接下来就是最后一个serial.c文件了: 所有文件在工程中的目录为: 工程编译后下

    2024年04月16日
    浏览(44)
  • 十、stm32-ESP8266(串口透传、MCU透传、控制LED亮灭)

    见博客:stm32f103c8t6新建固件库模板(可自取) 固件库模板 MDK5开发环境 stm32参考手册 UART串口协议 stm32中断概念 ESP8266模块资料 利用固件库模板点灯工程(下面第三行,手动狗头) CH340 USB→TTL模块 ESP8266模块 手机软件 实验程序已经发布到百度网盘,本文末有链接可以自取

    2023年04月19日
    浏览(45)
  • 江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)

            使用USART串口通信,通过上位机串口助手发送符串给STM32执行LED灯点亮熄灭操作的流程。         基本的配置如下所示,GPIO口配置的为PA9推挽输出,用于LED灯的操作。其余注意USART_ITConfig和USART_Cmd开启USART接收中断和使能USART运行。         接下来要进行发送字

    2024年03月21日
    浏览(58)
  • STM32G030C8T6:使用按键控制LED亮灭(外部中断)

    本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过KEY1 按键的PA0 引脚配置成中断输入引脚,PB9引脚配置成输出,每次按键,PA0 引脚就会进入一次外部中断,每进

    2024年02月05日
    浏览(40)
  • STM32第二课:灯的亮灭、流水灯、有源蜂鸣器

             STM32的第二课,我们来学习如何使用STM32控制等的亮灭,使用多重控制制作我们自己的流水灯,然后再了解一下有源蜂鸣器的用法,创造出不一样的声音。         首先开头包含STM32的头文件#include \\\"stm32f10x.h\\\",这个头文件包含STM32众多的重要驱动,一定要把这个头文

    2024年01月24日
    浏览(39)
  • 嵌入式开发控制LED灯的亮灭

    用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。 A4输出控制灯的亮灭,设置为GPIO_Output A1持续输出高电平,设置同上 A7持续输出低电平,设置同上 C13个人习惯开启

    2024年02月09日
    浏览(39)
  • 定时器控制LED灯的亮灭(每隔1s翻转一次灯的状态)

    写一个1s的定时器,来控制LED灯的亮灭。这里LED1的端口是GPIOF,引脚是PIN10。定时器是通用定时器TIM3。 初始化LED; 初始化定时器; 编写时钟中断函数; 编写LED.h函数; 编写main.c函数; 2.1 初始化LED 2.2 初始化定时器 这里定时器的计算公式是: Tout= ((arr+1)*(psc+1))/Tclk; arr:自

    2024年02月02日
    浏览(54)
  • STM32入门笔记10_USART串口通信+案例:上位机控制LED亮灭(USART串口通信、TIM定时器、EXTI综合案例)

    通信的目的: 将一个设备的数据传送到另一个设备, 扩展硬件系统 通信协议: 制定通信的规则, 通信双方按照协议规则进行数据收发 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 异步 单端 点对点 I2C SCL、SDA 半双工 同步 单端 多设备 SPI SCLK、MOSI、MISO、CS 全双工 同步 单端

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包