arm-day7--stm32mp175a

1、led.h

复制代码
#ifndef __LED_H__
#define __LED_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
void led1_init();
void led2_init();
void led3_init();
void led1_ctl(int flag);
void led2_ctl(int flag);
void led3_ctl(int flag);

#endif


// #ifndef __LED_H__
// #define __LED_H__

// typedef struct{
//     unsigned int MODER;
//     unsigned int OTYPER;
//     unsigned int OSPEEDR;
//     unsigned int PUPDR;
//     unsigned int IDR;
//     unsigned int ODR;
//     unsigned int BSRR;
// }gpio_t;

// #define  GPIOE ((gpio_t *)0x50006000)
// #define  GPIOF ((gpio_t *)0x50007000)

// void led1_init();
// void led2_init();
// void led3_init();
// void led1_ctl(int flag);
// void led2_ctl(int flag);
// void led3_ctl(int flag);
// #endif

led.c

复制代码
#include "led.h"

void led1_init()
{
    //使能gpio口模式
     RCC->MP_AHB4ENSETR |= (0x3<<4);
    //输出模式的配置
   GPIOE->MODER &=(~(0x3<<20));
   GPIOE->MODER |=(0x1<<20);
    //设置管脚输出类型-推挽
    GPIOE->OTYPER &=(~(0x1<<10));
    //设置输出速度
    GPIOE->OSPEEDR &=(~(0x3<<20));
    //设置上拉电阻
    GPIOE->PUPDR &=(~(0x3<<20));
    
}

void led2_init()
{
    //设置GPIO口位输出模式
    RCC->MP_AHB4ENSETR |= (0x3<<4);
    //输出模式的配置
   GPIOE->MODER &=(~(0x3<<16));
   GPIOE->MODER |=(0x1<<16);
    //设置管脚输出类型-推挽
    GPIOE->OTYPER &=(~(0x1<<8));
    //设置输出速度
    GPIOE->OSPEEDR &=(~(0x3<<16));
    //设置上拉电阻
    GPIOE->PUPDR &=(~(0x3<<16));
   
}

void led3_init()
{
    //设置GPIO口为输出模式
    RCC->MP_AHB4ENSETR |= (0x3<<4);
    //输出模式的配置
   GPIOF->MODER &=(~(0x3<<20));
   GPIOF->MODER |=(0x1<<20);
    //设置管脚输出类型-推挽
    GPIOF->OTYPER &=(~(0x1<<10));
    //设置输出速度
    GPIOF->OSPEEDR &=(~(0x3<<20));
    //设置上拉电阻
    GPIOF->PUPDR &=(~(0x3<<20));
   
}
//PE10的控制
void led1_ctl(int flag)
{
    if(flag==1)
    {
        GPIOE->ODR |=(0X1<<10);
    }
    else if(flag==0)
    {
        GPIOE->ODR &=(~(0X1<<10));
    }
}
//PE8的控制
void led2_ctl(int flag)
{
    if(flag==1)
    {
        GPIOE->ODR |=(0X1<<8);
    }
    else if(flag==0)
    {
        GPIOE->ODR &=(~(0X1<<8));
    }
}
//PF10的控制
void led3_ctl(int flag)
{
    if(flag==1)
    {
        GPIOF->ODR |=(0X1<<10);
    }
    else if (flag==0)
    {
        GPIOF->ODR &=(~(0X1<<10));
    }
}

// #include "led.h"

// void led1_init()
// {
//     // 设置PE10为输出模式
//     GPIOE->MODER &= (~(0x3 << 20));
//     GPIOE->MODER |= (0x1 << 20);
//     // 设置PE10为推挽输出
//     GPIOE->OTYPER &= (~(0x1 << 10));
//     // 设置PE10为低速输出
//     GPIOE->OSPEEDR &= (~(0x3 << 20));
//     // 设置PE10无上拉下拉
//     GPIOE->PUPDR &= (~(0x3 << 20));
// }
// void led2_init()
// {
//     // 设置Pf10为输出模式
//     GPIOF->MODER &= (~(0x3 << 20));
//     GPIOF->MODER |= (0x1 << 20);
//     // 设置PF10为推挽输出
//     GPIOF->OTYPER &= (~(0x1 << 10));
//     // 设置PF10为低速输出
//     GPIOF->OSPEEDR &= (~(0x3 << 20));
//     // 设置PF10无上拉下拉
//    GPIOF->PUPDR &= (~(0x3 << 20));
// }
// void led3_init()
// {
//     // 设置PE8为输出模式
//     GPIOE->MODER &= (~(0x3 << 16));
//     GPIOE->MODER |= (0x1 << 16);

//     // 设置PE8为推挽输出
//     GPIOE->OTYPER &= (~(0x1 << 8));

//     // 设置PE8为低速输出
//     GPIOE->OSPEEDR &= (~(0x3 << 16));

//     // 设置PE8无上拉下拉
//     GPIOE->PUPDR &= (~(0x3 << 16));
// }
// //LED1控制
// void led1_ctl(int flag)
// {
//     //根据传递的参数不同决定是开灯还是关灯
//     if(flag==1)
//     {
//         GPIOE->ODR |= (0x1<<10);//开灯
//     }
//     else if(flag==0)
//     {
//         GPIOE->ODR &= (~(0x1<<10));//关灯
//     }
// }
// //LED2控制
// void led2_ctl(int flag)
// {
//     if(flag==1)
//     {
//         GPIOF->ODR |= (0x1<<10);
//     }
//     else if(flag==0)
//     {
//         GPIOF->ODR &= (~(0x1<<10));
//     }
// }
// //LED3控制
// void led3_ctl(int flag)
// {
//     if(flag==1)
//     {
//         GPIOE->ODR |= (0x1<<8);
//     }
//     else if(flag==0)
//     {
//         GPIOE->ODR &= (~(0x1<<8));
//     }
// }

2、ket_it.h

复制代码
#ifndef __KEY_IT_H__
#define __KEY_IT_H__

#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_exti.h"
#include"stm32mp1xx_gic.h"
void key1_config();
void key2_config();
void key3_config();
#endif

ket_it.c

复制代码
#include"key_it.h"

//按键1中断的配置
void key1_config()
{
    //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //将PF9设置为输入
    GPIOF->MODER &= (~(0x3<<18));
    //设置PF9生成EXTI9事件
    EXTI->EXTICR3 &= (~(0xff<<8));
    EXTI->EXTICR3 |= (0x05<<8);
    //设置下降沿检测EXTI9事件
    EXTI->FTSR1 |= (0x1<<9);
    //取消EXTI9的事件屏蔽
    EXTI->C1IMR1 |= (0X1<<9);
    //使能99号中断
    GICD->ISENABLER[3] |= (0X1<<3);
    //设置99号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<27));
    //设置99号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<24);
    //全局使能组0中断被转发到GICC层
    GICD->CTRL |= 0X1;
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //全局使能组0中断被转发给处理器
    GICC->CTRL |= (0x1);
}
//按键3中断的配置
void key3_config()
{
    //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //将PF8设置为输入
    GPIOF->MODER &= (~(0x3<<16));
    //设置PF8生成EXTI8事件
    EXTI->EXTICR3 &= (~(0xff));
    EXTI->EXTICR3 |= (0x05);
    //设置下降沿检测EXTI8事件
    EXTI->FTSR1 |= (0x1<<8);
    //取消EXTI8的事件屏蔽
    EXTI->C1IMR1 |= (0X1<<8);
    //使能98号中断
    GICD->ISENABLER[3] |= (0X1<<2);
    //设置98号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<19));
    //设置98号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<16);
    //全局使能组0中断被转发到GICC层
    GICD->CTRL |= 0X1;
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //全局使能组0中断被转发给处理器
    GICC->CTRL |= (0x1);
}
    

//按键2中断的配置
void key2_config()
{
     //使能GPIOF外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //将PF7设置为输入
    GPIOF->MODER &= (~(0x3<<14));
    //设置PF7生成EXTI7事件
    EXTI->EXTICR2 &= (~(0xff<<24));
    EXTI->EXTICR2 |= (0x05<<24);
    //设置下降沿检测EXTI7事件
    EXTI->FTSR1 |= (0x1<<7);
    //取消EXTI7的事件屏蔽
    EXTI->C1IMR1 |= (0X1<<7);
    //使能97号中断
    GICD->ISENABLER[3] |= (0X1<<1);
    //设置97号中断的优先级
    GICD->IPRIORITYR[24] &= (~(0x1f<<11));
    //设置97号中断的目标处理器
    GICD->ITARGETSR[24] |= (0x1<<8);
    //全局使能组0中断被转发到GICC层
    GICD->CTRL |= 0X1;
    //设置中断的优先级掩码
    GICC->PMR |= (0x1f<<3);
    //全局使能组0中断被转发给处理器
    GICC->CTRL |= (0x1);
    
}

3、中断处理函数

do_irp.c

复制代码
// extern void printf(const char *fmt, ...);
// unsigned int i = 0;
// void do_irq(void) 
// {
// }
#include"key_it.h"
#include"led.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
    //先获取中断号
    unsigned int irqno=(GICC->IAR &0x3ff);
    switch(irqno)
    {
        case 99://按键1中断
            //进行中断处理
        {   
            led1_ctl(1);
            led2_ctl(0);
            led3_ctl(0);
            printf("1\n");       
            //清除GICD中的中断排队标志
            GICD->ICPENDR[3] |= (0x1<<3);
            //清除EXTI中的事件挂起标志
            EXTI->FPR1 |= (0x1<<9);
             break;
        }
        case 98://按键2
        {
            led1_ctl(0);
            led2_ctl(1);
            led3_ctl(0);
            printf("2\n");
            //清除GICD中的中断排队标志
            GICD->ICPENDR[3] |= (0x1<<1);
            //清除EXTI中的事件挂起标志
            EXTI->FPR1 |= (0x1<<7);
            break;
        }
        case 97://按键3
        {
             led1_ctl(0);
            led2_ctl(0);
            led3_ctl(1);  
            printf("3\n");
            //清除GICD中的中断排队标志
            GICD->ICPENDR[3] |= (0x1<<2);
            //清除EXTI中的事件挂起标志
            EXTI->FPR1 |= (0x1<<8);
             break;
        }
           
    }
    //清除IAR保存的中断号
    GICC->EOIR = irqno;
}

4、main.c

复制代码
#include"uart4.h"
#include"led.h"
#include"fan.h"
#include"key_it.h"
//手动封装一个延时函数
void delay_ms(int ms)
{
    int i,j;
    for(i=0;i<ms;i++)
    {
        for(j=0;j<2000;j++)
        {

        }
    }
}
int main()
{
    //led的初始化
   
    led1_init();
    led2_init();
    led3_init();
    //风扇初始化
   // fan_init();
    //按键初始化
    key1_config();
    key2_config();
    key3_config();
    while(1)
    {
         printf("d0_main\n");
        delay_ms(1000);
    }
    return 0;
}
相关推荐
社会零时工20 小时前
机械臂末端2D相机自动对焦应用
arm开发·机器学习
陌上花开缓缓归以1 天前
W25N01KVZEIR flash烧写
arm开发
济6173 天前
ARM Linux 驱动开发篇----字符设备驱动开发(4)--- 编写chrdevbase 字符设备驱动开发实验--- Ubuntu20.04
linux·arm开发·驱动开发
代码游侠3 天前
学习笔记——I2C子系统
linux·arm开发·驱动开发·单片机·嵌入式硬件
陌上花开缓缓归以4 天前
mips架构uboot 启动流程分析
arm开发·架构
陌上花开缓缓归以4 天前
ddr专题分析
arm开发
电脑小白技术4 天前
arm架构能装windows吗?arm架构安装Windows两种方法
arm开发·windows·架构·arm架构能装windows吗
ONLYOFFICE4 天前
如何在 openSUSE 16 ARM 上安装 ONLYOFFICE 桌面编辑器
arm开发·编辑器
梁洪飞4 天前
uboot spl学习
linux·arm开发·嵌入式硬件·arm
戏舟的嵌入式开源笔记4 天前
Arm2D使用教程(四):借助片外Flash放置图片资源
arm开发·stm32·arm2d