2.中断及时钟的理解及知识
1.时钟基础
这里主要介绍系统时钟。先放图

(1)HSE(High Speed External Clock)高速外部时钟信号
来源:有源晶振或者无源晶振。
频率: 4-26MHZ不等 。
(2)HSI(High Speed Internal Clock)高速内部时钟信号
来源:芯片内部RC振荡器。
频率: 16MHZ 。
(3)PLL(Phase Locked Loop )锁相环
作用:对时钟进行倍频,然后把时钟输出到各个功能部件。
频率输入来源: HSE或HSI 。
VCO输入频率限制:(经过M分频)1~2MHz 。
VCO输出频率限制:(经过N倍频)192~432MHz 。
输出之后三个分频因子:P(PLLCLK分频因子),Q(USB OTG FS/RNG/SDIO时钟分频因子),R(分频因子)
最后公式:PLLCLK = HSE(HSI) / M *N / P ;
PLL48CK = HSE(HSI) / M *N /Q
(4)SYSCLK(System Clock)系统时钟
来源:HSE、HSI、PLLCLK。(当HSE有问题,系统会自动使用HSI为16MHz)
SYSCLK经过AHB分频后得到HCLK。
HCLK经过APB2分频后得到PCLK2。
(5)其他
GPIOA~GPIOK 是挂载在 AHB1 下面,TIM2~TIM4 是挂载在 APB1 下面,TIM1 和 TIM8 是挂载在 APB2 下面。所以在使能 GPIO 的时候记住要调 用 的 是 RCC_AHB1PeriphClockCmd () 函 数 使 能 , 在 使 能 TIM2 的 时 候 调 用 的 是RCC_APB1PeriphResetCmd()函数使能。在 stm32f4xx_rcc.h里查看
2.中断
(1)中断简介
STM32F407 有 22 个外部中断,我们目前只看前16个。EXTI 线 0~15:对应外部 IO 口的输入中断。
Q: STM32F4 是怎么把 16 个中断线和 IO 口一一对应起来的呢?
A:GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这样每个中断线对应了最多 9 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0,GPIOH.0,GPIOI.0。
(2)中断步骤
如图:
一些参考如下:
1. IO口设置(以key为例)
要点:模式设为输入(因为从外部读入)利用RCC_AHB1PeriphClockCmd使能时钟
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//WK_UP对应引脚PA0
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
}
2. 开启 SYSCFG 时钟,设置 IO 口与中断线的映射关系
要点:在连接时,IO口号对应中断号,如PE2,对应EXIT2。利用 RCC_APB2PeriphClockCmd 使能SYSCFG时钟,利用SYSCFG_EXTILineConfig 将IO口与中断号进行连接
3. 初始化线上中断,设置触发条件等。
要点:设置数 EXTI_Init() 四个参数:标号,中断模式(事件,中断),触发方式(上,下,随意),使能。4. 配置中断分组(NVIC),并使能中断。
要点:高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应。 两个中断源的抢占式优先级相同时,先来后到。若同时来到,响应优先级高低来决定5. 编写中断服务函数。
格式如下void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生
{ …中断逻辑…
EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位
}
}
版权声明:本文为weixin_46451024原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。