zoukankan      html  css  js  c++  java
  • 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);
    }

  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6194522.html
Copyright © 2011-2022 走看看