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

嵌套向量中断控制器

  • 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的中断和事件功能和库函数)