4.16 day7 ARM

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

mykey.h

#ifndef __MYKEY_H__
#define __MYKEY_H__

#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"

void key1_init();
void key2_init();
void key3_init();

#endif

mykey.c

#include "mykey.h"

void key1_init()
{
    RCC->MP_AHB4ENSETR |= (0X3 << 4);
    GPIOE->MODER &= (~(0X3<<20));
     GPIOE->MODER  |= (0x1<<20);
     //设置PF10为输出
     GPIOF->MODER&= (~(0X3<<20));
     GPIOF->MODER  |= (0x1<<20);
     //设置PE8为输出
     GPIOE->MODER &= (~(0X3<<16));
     GPIOE->MODER  |= (0x1<<16);
 
     //设置PE10为推挽输出
     GPIOE->OTYPER &= (~(0X1<<10));
     //设置PF10为推挽输出
     GPIOF->OTYPER &= (~(0X1<<10));
     //设置PE8为推挽输出
     GPIOE->OTYPER &= (~(0X1<<8));
 
     //设置PE10为低速输出
     GPIOE->OSPEEDR &= (~(0X3<<20));
     //设置PF10为低速输出
     GPIOF->OSPEEDR &= (~(0X3<<20));
     //设置PE8为低速输出
     GPIOE->OSPEEDR &= (~(0X3<<16));
 
     //设置PE10输出无上拉下拉电阻
    GPIOE->PUPDR &= (~(0X3<<20));
     //设置PF10输出无上拉下拉电阻
    GPIOF->PUPDR &= (~(0X3<<20));
     //设置PE8输出无上拉下拉电阻
    GPIOE->PUPDR &= (~(0X3<<16));
 
     //三盏灯默认是关闭
    GPIOE->ODR &= (~(0X1<<10));
    GPIOF->ODR &= (~(0X1<<10));
    GPIOE->ODR &= (~(0X1<<8));

    RCC->MP_AHB4ENSETR |= (0X5 << 5);
    GPIOF->MODER &= (~(0X3 << 14));
    EXTI->EXTICR2 &= (~(0XFF << 24));
    EXTI->EXTICR2 |= (0X5 << 24);
    EXTI->FTSR1 |= (0X1 << 7);
    EXTI->C1IMR1 |= (0X1 << 7);
    GICD->CTRL |= 0X1;
    GICD->ISENABLER[3] |= (0X1 << 1);
    GICD->IPRIORITYR[24] &= (~(0X1F << 11));
    GICD->ITARGETSR[24] &= (~(0X03 << 8));
    GICD->ITARGETSR[24] |= (0X1 << 8);
    GICC->CTRL |= 0X1;
    GICC->PMR |= 0X1F;
}

void key2_init()
{
    RCC->MP_AHB4ENSETR |= (0X3 << 4);
    GPIOF->MODER &= (~(0X3 << 12));
    GPIOF->MODER |= (0X1 << 12);
    GPIOF->OTYPER &= (~(0X1<<6));
    GPIOF->OSPEEDR &= (~(0X3<<12));
    GPIOF->PUPDR &= (~(0X3<<12));
    GPIOF->ODR &= (~(0X1<<6));

    RCC->MP_AHB4ENSETR |= (0X5 << 5);
    GPIOF->MODER &= (~(0X3 << 16));
    EXTI->EXTICR3 &= (~(0XFF));
    EXTI->EXTICR3 |= 0X5;
    EXTI->FTSR1 |= (0X1 << 8);
    EXTI->C1IMR1 |= (0X1 << 8);
    GICD->CTRL |= 0X1;
    GICD->ISENABLER[3] |= (0X1 << 2);
    GICD->IPRIORITYR[24] &= (~(0X1F << 19));
    GICD->ITARGETSR[24] &= (~(0X03 << 16));
    GICD->ITARGETSR[24] |= (0X1 << 16);
    GICC->CTRL |= 0X1;
    GICC->PMR |= 0X1F;
}

void key3_init()
{
    RCC->MP_AHB4ENSETR |= (0X3 << 4);
    GPIOE->MODER &= (~(0X3 << 18));
    GPIOE->MODER |= (0X1 << 18);
    GPIOE->OTYPER &= (~(0X1<<9));
    GPIOE->OSPEEDR &= (~(0X3<<18));
    GPIOE->PUPDR &= (~(0X3<<18));
    GPIOE->ODR &= (~(0X1<<9));

    RCC->MP_AHB4ENSETR |= (0X5 << 5);
    GPIOF->MODER &= (~(0X3 << 18));
    EXTI->EXTICR3 &= (~(0XFF << 8));
    EXTI->EXTICR3 |= (0X5 << 8);
    EXTI->FTSR1 |= (0X1 << 9);
    EXTI->C1IMR1 |= (0X1 << 9);
    GICD->CTRL |= 0X1;
    GICD->ISENABLER[3] |= (0X1 << 3);
    GICD->IPRIORITYR[24] &= (~(0X1F << 27));
    GICD->ITARGETSR[24] &= (~(0X03 << 24));
    GICD->ITARGETSR[24] |= (0X1 << 24);
    GICC->CTRL |= 0X1;
    GICC->PMR |= 0X1F;
}

do_irq.c

#include "mykey.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;
void do_irq(void) 
{
    
    unsigned int a = (GICC->IAR & 0X3FF);
    switch (a)
    {
    case 97:
        printf("key2\n");
        flag2 = !flag2;
        if(flag2 == 1)
        {
            GPIOF->ODR |= (0X1<<6);

        }
        if (flag2 == 0)
        {
            GPIOF->ODR &= (~(0X1<<6));
            
        }
        
        EXTI->FPR1 |= (0X1 << 7);
        GICD->ICPENDR[3] |= (0X1 << 1);
        break;
    case 98:
        printf("key3\n");
        flag1 = !flag1;
        if(flag1 == 1)
        {
            GPIOE->ODR |= (0X1<<10);
            GPIOF->ODR |= (0X1<<10);
            GPIOE->ODR |= (0X1<<8);
        }
        if (flag1 == 0)
        {
            GPIOE->ODR &= (~(0X1<<10));
            GPIOF->ODR &= (~(0X1<<10));
            GPIOE->ODR &= (~(0X1<<8));
        }
        EXTI->FPR1 |= (0X1 << 8);
        GICD->ICPENDR[3] |= (0X1 << 2);
        break;
    case 99:
        printf("key1\n");
        flag3 = !flag3;
        if(flag3 == 1)
        {
            GPIOE->ODR |= (0X1<<9);
            
        }
        if (flag3 == 0)
        {
            GPIOE->ODR &= (~(0X1<<9));
            
        }
        EXTI->FPR1 |= (0X1 << 9);
        GICD->ICPENDR[3] |= (0X1 << 3);
        break;
    default:
        break;
    }
    GICC->EOIR = a;
}

main.c文章来源地址https://www.toymoban.com/news/detail-860678.html

#include "mykey.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
    int i,j;
    for(i=0;i<ms;i++)
    {
        for(j=0;j<2000;j++)
        {
 
        }
    }
}
int main()
{
    key1_init();
    key2_init();
    key3_init();
    while (1)
    {
        printf("hello world\n");
        delay_ms(1000);
    }
    
}

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

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

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

相关文章

  • 【ARM Coresight Debug 系列 16 -- Linux 断点 BRK 中断使用详细介绍】

    请阅读 【ARM Coresight SoC-400/SoC-600 专栏导读】 ARMv8 架构的 BRK 指令是用于生成一个软件断点的。当处理器执行到 BRK 指令时,会触发一个断点异常。 BRK 指令的格式如下: 其中 imm 是一个 16 位的立即数,它可以在断点异常发生时将立即数保存到 ESR.ISS 域中,从可以用来区分不同

    2024年02月03日
    浏览(60)
  • 【Linux下6818开发板(ARM)】硬件空间挂载

    (꒪ꇴ꒪ ),hello我是 祐言 博客主页:C语言基础,Linux基础,软件配置领域博主🌍 快上🚘,一起学习! 送给读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏         在嵌入式系统开发中,经常需要使用外部硬件

    2024年02月14日
    浏览(41)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(49)
  • [ARM+Linux] 基于全志h616外设开发笔记

    修改用户密码 配置网络 nmcli dev wifi  命令扫描周围WIFI热点   nmcli dev wifi connect  xxx  password xxx 命令 连接WiFi 查看ip地址的指令: ifconfig ip addr show wlan0 SSH登录         这是企业开发调试必用方式,比串口来说不用接线,前提是接入网络并获得板子IP 地址,且系统做了SSH的

    2023年04月21日
    浏览(44)
  • Rust在linux下交叉编译到arm开发板

    前段时间做了rust交叉编译到arm开发板,如果引入的包有些包含OpenSSL,ring...遇见了很多问题在网上也查阅很多资料,今天抽个时间做个汇总吧。 虚拟机里面安装rust环境,做到交叉编译的时候应该都已经有了,这个地方就不过多说了,网上找一下就有的 首先描述一下我的环境

    2024年02月15日
    浏览(51)
  • ARM-Linux开发与MCU开发的不同之处分析

    目录 一、ARM-Linux应用开发和单片机开发的不同 二、Arm-Linux基本开发环境 针对ARM-Linux程序的开发,主要分为三类:应用程序开发、驱动程序开发、系统内核开发。针对不同种类的软件开发,有其不同的特点。 今天,我们来看看ARM-Linux开发和MCU开发的不同点,以及ARM-Linux的基本

    2024年02月10日
    浏览(49)
  • ARM_Linux的交叉开发以及交叉编译器

    目录 为什么要使用交叉开发 为什么要使用交叉编译 交叉编译器的安装 交叉编译器的使用 交叉开发是指在通用的电脑上吧程序编写,编译,调试好,再下载到嵌入式产品中去运行,对于一些简单的程序的话,直接在电脑上编译调试好即可,但是对于一些需要操作硬件的开发

    2024年01月23日
    浏览(56)
  • Qt5.12.6配置Android Arm开发环境(Linux)

    1.安装jdk 2.安装android studio 3.安装sdk 与ndk  设置代理  安装SDK工具  安装SDK Platform 安装QT   选择JDK 1.8安装路径,SDK与NDK路径  如出现Platform SDK或者Platform Build Tools未安装,点击Update Installed  配置成功后可看到ARMv7与AMD-v8a kits Qt Version也可看到ARMv7与AMD-v8a   如果 有安装了CMake,也

    2024年01月21日
    浏览(51)
  • Live555 C++ arm linux64 RTSP推流开发

    由于不能apt-get install,所以先官网下载源码。http://www.live555.com/liveMedia/ 解压 tar -zxvf live.2023.07.24.tar.gz 安装可以看这篇博文前部 live555server环境搭建 OpenSSL必须安装 安装时如果直接在arm板子上装,生成makefile时就直接写 不能写成armlinux 如果选成了armlinux,这样make的时候用的就是

    2024年02月03日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包