STM32时钟体系
什么是晶振
晶振全称晶体振荡器 ,是晶体和电子元件组成,晶振有个非常重要的特性 机电效应(压电效应)
一般晶振会提供高度稳定的频率 震荡频率是固定的 一般晶振有8MHZ 12MHZ 25MHZ 晶振的单位是HZ(单位时间震荡的次数)
时钟源一共有5种
HSE(High Speed External):高速外部时钟 一般可以作为系统时钟 特点精度高
HSI(High Speed Internal):高速内部时钟 缺点精度低 容易受温度的影响 适合小家电的使用 他的频率为16MHZ的RC震荡器 优点成本低
LSE(Low Speed External):低速外部时钟 时钟频率为32.768MHZ的晶振可以驱动RTC实时时钟优点功耗低 精度高
LSI(Low Speed Internal):低速内部时钟 频率为32KHZ 的RC振荡器可以驱动独立看门狗 和低功耗的唤醒功能
PLL:倍频锁相环 由HSE和HSI振荡器提供时钟信号 一般可以作为系统时钟使用
时钟树
中断
程序运行的方式
轮询系统
指在程序运行时 首先对硬件进行初始化 然后主程序写一个死循环 需要运行的功能按照顺序进行执行下去 一般适用于只需要按照顺序执行的并且没有外部事件的影响的情况下
前后台系统
相比于轮询系统 前后台增加了中断,如果外部事件发生 则在中断处理 主程序在轮询系统中运行 中断被称为前台 主程序中的while(1)就称为后台 中断会终止后台的运行 然后跳转到中断服务函数中去处理处理完成后 后台将继续执行
多任务系统
相比于前后台系统 多任务系统的外部事件中断进行响应 但是外部事件的处理是任务中进行处理 任务具备优先级 任务级高的先执行 所以程序就会被分割为一个个的任务,任务是一个独立的死循环,并且不能返回,可以由操作系统进行任务的调度,程序段的实时响应能力又得到提升。
中断源分析
Cortex_M4内核一共支持256个中断,其中有16个内核中断 240个外部中断 ,对于STM32F407来说只用到到了一部分包括10个内核中断(不可屏蔽中断 无法通过软件控制) 82个外部中断(可屏蔽中断可以通过软件进行控制) 共92个
中断向量表
抢占优先级(主优先级):抢占优先级高的中断可以打断抢占优先级低的中断的执行。
响应优先级(次优先级):在同时发生多个中断的情况下,响应优先级高的先执行。
抢占优先级和响应优先级之间的区别??????
- 抢占优先级高的中断可以打断抢占优先级低的中断的执行
- 抢占优先级一样高的中断,响应优先级高的中断不可以打断响应优先级低的中断
- 抢占优先级一样高的中断,如果同时发生的情况下响应优先级高的先执行
- 抢占优先级和响应优先级一样高的中断同时发生,则按照向量表中的优先级执行
为了方便用户管理和响应中断 NVIC提供了优先级接口可以进行分组
在misc.c文件中可以对中断进行分组
一般我们都选择在第二个
如果想要让外部中断线和GPIO口进行映射,需要使用一个函数接口SYSCFG_EXTILineConfig()
外部中断的代码编写
想要使用EXTI进行外部事件的检测,可以参考stm32f4xx_exti.c源文件中的开头注释部分
第一步打开GPIO外设时钟 +SYSCFG外设时钟 GPIO挂载在APB1总线上 SYSCFG挂载在APB2总线上
第二步定义GPIO初始化结构体
第三步 调用SYSCFG_EXTILineConfig()函数来对外部中断线和GPIO引脚建立映射关系
第四步定义EXTI初始化结构体,需要配置外部中断线(模式、触发方式.....) + 初始化
EXTI_Line 需要使用的外部中断线 参考EXTI_Lines
EXTI_Mode 外部中断线的模式 (中断 or 事件) 参考EXTIMode_TypeDef
EXTI_Trigger 边沿检测方式(上升沿、下降沿、边沿) 参考EXTITrigger_TypeDef
定义NVIC的初始化结构体,并进行赋值(中断通道....) + 初始化
NVIC_IRQChannel 需要打开的中断通道 参考stm32f4xx.h
NVIC_IRQChannelPreemptionPriority 抢占优先级 需要根据分组进行填写
NVIC_IRQChannelSubPriority 响应优先级 需要根据分组进行填写
编写中断服务函数 中断服务函数的名字必须从启动文件中进行拷贝
注意:中断服务函数的格式是固定的(没有返回值、没有参数) 名字也是固定的
注意:中断服务函数是不需要手动调用的,并且不要再中断中添加过长的延时时间,会导致系统的响应能力降低,所以如果打算处理比较复杂的事件,可以在中断中定义一个标志位,然后回到主程序中进行处理。