当前位置:   article > 正文

(二)STM32中断系统分析_stm32 中断应用开发结果分析

stm32 中断应用开发结果分析

1》中断的过程:

        在程序运行过程中:

        中断源引发中断

        CPU发生现场保护事件

        CPU进入中断处理函数

        执行完处理函数

        CPU发生现场恢复事件

        程序继续执行

     (现场保护事件和现场恢复事件是CPU自动完成)

2》中断源----引发中断的事件    

   

3》中断嵌套:在中断服务函数运行过程中,有其他的中断源引发中,先去执行其他中断服务函数,再继续执行

   

 4》NVIC:异常控制器

            为每个中断源配置两种优先级:(数组越小,优先级越高)

            抢占优先级(主优先级):具备抢占功能,高优先级可以抢占低优先级

            响应优先级(次优先级):不具备抢占功能,只有当两个同主优先级同时发生时,高优先    级先执行

           

        NVIC为用户提供五种管理中断的方式:

          *   This parameter can be one of the following values:

          *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority 主优先级

          *                                4 bits for subpriority 次优先级 0---F

          *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority 主优先级 0---1

          *                                3 bits for subpriority 次优先级 0---7

          *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority 0---3

          *                                2 bits for subpriority          0---3

          *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority 0---7

          *                                1 bits for subpriority          0---1

          *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority 0---F

          *                                0 bits for subpriority

    5》配置中断的步骤:

        1》配置中断源

            void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)

        2》为中断源配置中断优先级

            typedef struct

            {

              uint8_t NVIC_IRQChannel;//中断通道号----在stm32f10x.h这个头文件中的 typedef enum IRQn 找

              uint8_t NVIC_IRQChannelPreemptionPriority; //主优先级

              uint8_t NVIC_IRQChannelSubPriority; //次优先级

              FunctionalState NVIC_IRQChannelCmd;  //使能此通道

            } NVIC_InitTypeDef;

            NVIC_Init(NVIC_InitTypeDef * NVIC_InitStruct)

        3》编写中断服务函数-----放在stm32f10x_it.c中【

            void     函数名(在启动文件中已经定义)(void)

            {

                //具体中断发生后干的事情

            }

            void USART1_IRQHandler(void)

            {

                   if(SET==USART_GetITStatus(USART1, USART_IT_RXNE)){

                    USART_ClearITPendingBit(USART1, USART_IT_RXNE);

                    USART_SendData(USART1,USART_ReceiveData(USART1));

                }

            }

        4》选择一种管理中断的方式-----只需要配置一次,第一个中断需要配置,放在while(1)之前

            NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)

           

    6》[WEAK] 弱属性标志:被系统赋予这种标志的函数,你可以在外边编写一个同名函数,如果你写了,调用你写的,如果你没写调用系统的

    7》B       . 相当于c语言中的while(1)

    8》如果配置了中断源,必须编写一个正确的中断服务函数,并且判断标志位和清除标志位

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/973067
推荐阅读
相关标签
  

闽ICP备14008679号