美文网首页我爱编程
运动控制器32:STM32的中断和事件功能和库函数

运动控制器32:STM32的中断和事件功能和库函数

作者: 吴松乾 | 来源:发表于2018-02-01 09:22 被阅读0次

    嵌套向量中断控制器

    • 68个中断通道
    • 16级优先级
    • 电源管理控制
    • 系统控制寄存器的时间

    系统滴答

    系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。

    中断和异常向量

    68个中断,按照分组,可以分成:(小容量的有不同,比如增加了TIM8的中断,FSMC中断等,但是少了OTG等中断)

    1. 窗口定时器,电源电压PVD,侵入检测,RTC实时时钟和闹钟中断,FLASH全局,RCC(复位和时钟控制),一共8个
    2. 外部中断,EXTI0EXTI4,一共5个,59共用一个,中断10~15共用一个。
    3. DMA和DMA2 7个通道+5个通道,一共12个
    4. ADC1和ADC2全局
    5. CAN1的4个中断和CAN2的4个
    6. TIM1高级定时器1,4个,TIM2,3,4全局共7个,以及定时器567各一个全局,
    7. I2C两个模块的时间和错误,一共4个
    8. SPI1和SPI2全局各1各
    9. USART1到USART5一共5个全局
    10. 以太网全局和唤醒,两个
    11. OTG唤醒和全局
      另外要注意的是,每一个模块有很多的中断源,比如SPI通信,这里只有一个全局的中断,具体模块中的中断源,需要在使用具体模块时进行设置,并打开全局中断。

    外部中断/事件控制器

    对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,每个输入线可以独立地配置输入类型(脉冲
    或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。

    唤醒事件

    可以通过外部或者内部事件来唤醒内核,配置方法如下:

    1. 在外设中设置中断时,不设置NVIC使能,而是设置SEVONPEND位,CPU唤醒以后,需要软件进行清除。
    2. 也可以设置EXTI为事件模式,用来唤醒内核。

    功能说明

    外部中断可以做中断,也可以作为事件,如果作为事件,则要先配置并使能事件线,配置方法如下:

    1. 硬件中断
      • 打开屏蔽位
      • 设置触发选择
      • 设置NVIC通道使能和屏蔽位
    2. 硬件事件
      硬件事件则只需要配置两步,同上
    3. 软件中断/软件事件
      • 配置屏蔽位,设置软件中断寄存器请求位

    端口映射

    • 端口一共有PA0,PB0,PC0PG0,一共7组端口的第0位挂在EXT10上,同样,PA1,PB1,挂在EXTI1上,这样PA0~PA15一共占16个通道。
    • 另外还有4根单独的先,分配给PVD,RTC,USB唤醒和以太网唤醒。

    库函数介绍

    初始化和去初始化,以及结构体初始化函数

    初始化结构体如下:

    - uint32_t  EXTI_Line  //具体的中断线
    - FunctionalState  EXTI_LineCmd  //使能
    - EXTIMode_TypeDef  EXTI_Mode  //中断OR事件
    - EXTITrigger_TypeDef  EXTI_Trigger //触发沿
    

    状态位 GetFlagStatus ClearFlag

    这个简单,入口参数是某条中断线,返回的参数是是否产生了中断,这个在中断服务程序中使用。

    中断和挂起 GetITStatus 和ClearITPendingBit

    同上,挂起和查询某条中断线的标志。

    GenerateSWInterrupt

    产生一个软件中断,由软件来控制,相当于虚拟一个硬件中断。

    GPIO_EXTILineConfig

    在GPIO的头文件中,有一个GPIO_EXTILineConfig函数,函数的功能是使用某个脚作为中断线。

    下面的中断口配置功能中,用到了这些函数。

    void EXTI0_Config(void)
     {
       //使能GPIOA的时钟
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
       
       //设置A0初始化
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
       GPIO_Init(GPIOA, &GPIO_InitStructure);
     
       //使用的是A0的复用功能,打开复用时钟
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
     
       //使用GPIOA的PIN0作为中断线
       GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
     
       //配置中断线的初始化
       EXTI_InitStructure.EXTI_Line = EXTI_Line0;
       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
       EXTI_InitStructure.EXTI_LineCmd = ENABLE;
       EXTI_Init(&EXTI_InitStructure);
     
      //配置中断优先级和使能中断,并配置中断服务程序的位置
       NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
       NVIC_Init(&NVIC_InitStructure);
     }
    
    

    相关文章

      网友评论

        本文标题:运动控制器32:STM32的中断和事件功能和库函数

        本文链接:https://www.haomeiwen.com/subject/oxgrzxtx.html