查看: 505|回复: 0

关于STM32中断知识

[复制链接]
  • TA的每日心情
    无聊
    2018-11-16 10:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2020-1-17 09:31:46 | 显示全部楼层 |阅读模式
    分享到:
    1.1 中断的理解1.1.1 中断概念
    程序正在执行,突然有外部信号或者内部信号打断正在执行的程序,需要执行该事件,
    执行完后再回到当前打断的位置继续往下执行程序的过程称为中断

    例如:
    正在写代码      --   程序正在执行
    微信信息        --   事件发生    --> 中断请求
    看微信信息      --   执行事件    --> 中断执行
    继续写代码      --   继续执行代码 --> 中断返回

    1.1.2 中断源的理解
    打断正在执行程序的事件称为中断源。
    1.1.3 中断的意义
    While(!(USART1->SR & (1 << 5)));   rec = USART1->DR;
    可以节省CPU的内存。
    中断满足条件:快进快出
    1.2 NVIC的介绍1.2.1 NVIC的概述
    NVIC:全称:嵌套向量中断控制器。 它就是一个控制器,控制什么?控制中断。
             已经内嵌在Cortex-M内核中。
    NVIC的中断架构  -- M3-M4权威指南 第7章》
    一共可以支持256个中断,其中16个内部中断,240外部中断。 《权威指南英文第7章》



    1.2.2 NVIC中断优先级
    1.2.3 NVIC中断优先级的分类
    分类:人为优先级 自然优先级
    人为优先级 抢占优先级 响应优先级
    抢占优先级: 不同等级间可以嵌套,高优先级可以抢占低优先级,优先级等级编号越小优先级高越高。
    响应优先级: 不同等级间不可以嵌套,响应高优先级的事件,优先级等级编号越小优先级高越高。
    自然优先级:NVIC内部给所有中断分配的中断序列号。
              当抢占优先级和响应优先级相同的中断源,同时发生了中断,
    CPU优先执行自然优先级高的中断。中断等级数字越小,优先级越高
    1.2.4 NVIC优先级分组
    RAM公司利用8个位来管理人为优先级,用3个位管理优先级等级编码。
    0组   用8个位管理响应优先级,等级范围:0~255, 等级编码:0x07
    1组   用7个位管理响应优先级,等级范围:0~127
                       1个位管理抢占优先级,等级范围:0~1, 等级编码:0x06
    2组   用6个位管理响应优先级,等级范围:0~63
                       2个位管理抢占优先级,等级范围:0~3, 等级编码:0x05
    3组   用5个位管理响应优先级,等级范围:0~31
                       3个位管理抢占优先级,等级范围:0~7, 等级编码:0x04
    4组   用4个位管理响应优先级,等级范围:0~15
                      4个位管理抢占优先级,等级范围:0~15, 等级编码:0x03
    5组   用3个位管理响应优先级,等级范围:0~7
                      5个位管理抢占优先级,等级范围:0~31, 等级编码:0x02
    6组   用2个位管理响应优先级,等级范围:0~3
                      6个位管理抢占优先级,等级范围:0~63, 等级编码:0x01
    7组   用1个位管理响应优先级,等级范围:0~1
                         7个位管理抢占优先级,等级范围:0~127, 等级编码:0x00
    注意:Conter-M4最大支持256个中断入口,但是最大只支持128级中断嵌套。
            并且一个工程程序中只能有一种优先级分组,确定了分组,实际上就是确定了各个优先级的等级数量。
    分组编号
    SCB->AIRCR[10:8]
    抢占优先级        等级范围
    响应优先级        等级范围
    0
    0x07
    0
    0
    Bit[0:7]
    0~255
    1
    0x06
    Bit[7]
    0~1
    Bit[0:6]
    0~127
    2
    0x05
    Bit[7:6]
    0~3
    Bit[0:5]
    0~63
    3
    0x04
    Bit[7:5]
    0~7
    Bit[0:4]
    0~31
    4
    0x03
    Bit[7:4]
    0~15
    Bit[0:3]
    0~15
    5
    0x02
    Bit[7:3]
    0~31
    Bit[0:2]
    0~7
    6
    0x01
    Bit[7:2]
    0~63
    Bit[0:1]
    0~3
    7
    0x00
    Bit[7:1]
    0~127
    Bit[0]
    0~1
    1.1 STM32F4xx中断介绍
    ST公司利用4个位来管理人为优先级,用3个位管理优先级等级编码
    NXP公司利用5个位来管理人为优先级,用3个位管理优先级等级编码
    0组 用4个位管理响应优先级,等级范围:0~15, 等级编码:0x07
    1组 用3个位管理响应优先级,等级范围:0~7
           1个位管理抢占优先级,等级范围:0~1, 等级编码:0x06
    2组 用2个位管理响应优先级,等级范围:0~3
           2个位管理抢占优先级,等级范围:0~3, 等级编码:0x05
    3组 用1个位管理响应优先级,等级范围:0~1
           3个位管理抢占优先级,等级范围:0~7, 等级编码:0x04
    4组  用4个位管理抢占优先级,等级范围:0~15,等级编码:0x03
    1.1.1 STM32F40xx中断优先级的库函数
    core_cm4.h的文件中找对应的库函数
    1. void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)  -- 1435
    1)函数功能:设置优先级分组
    2)形参:优先级编码
    例如:设置优先级分组为第2
    NVIC_SetPriorityGrouping(0x05);  //NVIC_SetPriorityGrouping(7-2);

    2.uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)   --- 1592
    1)函数功能:设置具体的等级范围编码
    2)形参:PriorityGroup:优先级编码
            PreemptPriority:抢占优先级等级编码
             SubPriority:响应优先级编码
    3)返回值:具体的等级编码

    3.void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -- 1550
    1)函数功能:设置中断源优先级
    2)形参:IRQn:中断源的优先级  -- stm32f4xx.h 中查找
                 priority 具体的优先级等级编码

    4.void NVIC_EnableIRQ(IRQn_Type IRQn) --- 1467
    1)函数功能:使能具体的中断源
    2)形参:具体的中断源

    5.void NVIC_DisableIRQ(IRQn_Type IRQn) -- 1480
    1)函数功能:禁止具体中断源
    2)形参:具体的中断源

    1.2 中断服务函数
    中断需要执行的事件。
    注意:遵循原则:快进快出   flag=1   IF(flag == 1)

    Void 中断服务函数名(void)
    {
    1.  清标志位  
    2. 中断需要执行的事件
    }
    注:中断服务函数名在 startup_stm32f40_41xxx.s文件中找     
    1.3 中断编写流程
    1. 中断源初始化 -- 在没有用中断时怎么初始化就怎么初始化
    2. 使能对应的中断 -- 接收中断
    3. 配置NVIC  -- 例如第2
       uint32_t  Priority;
    1) NVIC_SetPriorityGrouping(7 - 2);
    2) Priority =  NVIC_EncodePriority (7-2,  1 , 2) ;
    3) NVIC_SetPriority(USART1_IRQn, Priority );
    4) NVIC_EnableIRQ(USART1_IRQn)
    4. 使能串口
    5. 编写中断服务函数
    1.3.1 实验
    1. 串口助手发送数据,MCU接收数据,MCU接收到的数据再返回给串口助手
    2. 在串口助手中发送字符串,MUC接收字符串
    如果发送"LED_ON#"MCU接收后点亮所有LED灯,
    如果发送"LED_OFF#", 关闭所有LED灯,
    如果发送错误,则返回指令错误,请重新发送
    如果错误次数超过3次,则返回“错误超过3次,请报警!”,响蜂鸣器







    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 05:35 , Processed in 0.104118 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.