• NVIC


    1中断:每一个中断都会对应一个服务程序

      2NVIC 他的做用是负责中断优先级管理

      3IP bit[7:4]每一个中断都有一个IP寄存器,用于设置中断相关的属性

        AIRCR[10:8]只一个AIRCR寄存器负责所有的中断的优先级的分组

      4中断分组 1.void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

        NVIC_PriorityGroup_0~4

      5中断初始化 

        void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
        uint8_t NVIC_IRQChannel; 中断号
        stm32f4xx.h typedef enum IRQn 中断号的定义

      6  抢占优先级 uint8_t NVIC_IRQChannelPreemptionPriority; 0~15

      7 响应优先级 NVIC_IRQChannelSubPriority; 0~15

      8中断使能开关 FunctionalState NVIC_IRQChannelCmd; ENABLE DISABLE

      9 中断响应方式 电平触发

              边沿触发

              跳变触发 上升沿 下降沿 双边沿

      10选择中断线: EXTI 0~15 可选择对应的GPIO端口

        void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)

        每一个EXTIn 只能是每组GPIO第

    每一个EXTIn 只能是每组GPIO第n个端口
    EXTI_PortSourceGPIOx EXTI_PortSourceGPIOA~G 选择对应的组

    11 配置触发方式
    void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
    uint32_t EXTI_Line; 外部中断线
    EXTI_Line0~22

    EXTIMode_TypeDef EXTI_Mode;
    EXTI_Mode_Interrupt 中断
    EXTI_Mode_Event 事件

    EXTITrigger_TypeDef EXTI_Trigger 触发方式
    EXTI_Trigger_Rising 上升沿
    EXTI_Trigger_Falling 下降沿
    EXTI_Trigger_Rising_Falling 双边沿

    EXTI_LineCmd 使能开关
    ENABLE DISABLE

    代码示例:

    1 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    2

    NVIC_InitTypeDef NVIC_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(&EXTI_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);

    2 看门狗

    1打开写保护 void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
    2设置分频系数 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
    3设置RLR寄存器值 void IWDG_SetReload(uint16_t Reload);
    4喂狗 void IWDG_ReloadCounter(void);
    5使能看门狗 void IWDG_Enable(void);
    6手动喂狗 IWDG_ReloadCounter();

    void iwdg_init()
    {
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    IWDG_SetPrescaler(IWDG_Prescaler_64);
    //64/32000 * 1000
    IWDG_SetReload(1000);
    IWDG_ReloadCounter(); //
    IWDG_Enable();
    }

    //中断服务程序,名字固定,并且类型void (void)
    void EXTI0_IRQHandler(void)
    {
    //1.判断该中断产生源
    delay_ms(10);//消除抖动
    if(0 == WK_UP) { //判断中断确实由WK_UP按键产生
    //2.中断处理部分
    //BEEP = !BEEP;
    IWDG_ReloadCounter();
    }
    //3.清除中断标志
    EXTI_ClearITPendingBit(EXTI_Line0);
    }


    void EXTI4_IRQHandler(void)
    {
    delay_ms(10);
    if(0 == KEY0) { 
    //2.中断处理部分
    PFout(9) = !PFout(9);
    }
    //3.清除中断标志
    EXTI_ClearITPendingBit(EXTI_Line4);
    }

    void EXTI3_IRQHandler(void)
    {
    delay_ms(10);
    if(0 == KEY1) { 
    //2.中断处理部分
    PFout(10) = 0;
    } else if(1 == KEY1) {
    PFout(10) = 1;
    }
    //3.清除中断标志
    EXTI_ClearITPendingBit(EXTI_Line3);
    }


    void my_exti_init()
    {
    NVIC_InitTypeDef NVIC_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;

    key_init();
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);

    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStruct);

    EXTI_InitStruct.EXTI_Line = EXTI_Line4;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStruct);

    EXTI_InitStruct.EXTI_Line = EXTI_Line3;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_Init(&EXTI_InitStruct);


    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);

    NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStruct);
    }

  • 相关阅读:
    10465
    移动Web开发图片自适应两种常见情况解决方案
    [置顶] Spring的DI依赖实现分析
    Android中两种设置全屏或者无标题的方法
    Esper系列(十二)Variables and Constants
    Esper系列(十一)NamedWindow语法Merge、Queries、Indexing、Dropping
    Esper系列(十)NamedWindow语法delete、Select+Delete、Update
    Esper系列(九)NamedWindow语法create、Insert、select
    Esper系列(八)Method Definition、Schema
    Docker系列(五)OVS+Docker网络打通示例
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6194522.html
Copyright © 2020-2023  润新知