好久没更新了,继续,上一回是
更新IV:Firmware Lib在EK_STM32F上的学习体会(I2C/IWDG)
NVIC Example 1
本例示范了如何使用中断向量列表控制器(Nested Vectored Interrupt Controller)来设置各个中断的优先级(Preemption Priority和SubPriority)。
设置2条外部中断线路(线路0和线路9)在每一个输入信号下降沿产生中断,开启SysTick中断。
这3个中断的优先级设置如下: EXTI Line0: o PreemptionPriority = PreemptionPriorityValue o SubPriority = 0 EXTI Line9: o PreemptionPriority = 0 o SubPriority = 1 SysTick Handler: o PreemptionPriority = !PreemptionPriorityValue o SubPriority = 0
初始时,PreemptionPriorityValue的值为0,这意味着外部中断线路0(EXTI Line0)有着比SysTick中断更高的优先级。
在外部中断线路9的中断中,程序交换EXTI Line0和SysTick中断的优先级。 在外部中断线路0的中断中,程序设置SysTick中断的pending比特,这样,如果SysTick中断的优先级较高,他就会被打断,反之则不会。 在SysTick中断中,程序检查是否中断是由打断外部中断线路0的中断进入的,如果是,把PreemptionOccured的值置为True。 当PreemptionOccured的值不为False时,连接在PC.06 – PC.09上的4个LED开始闪耀。
综上所述,运行程序结果如下:
1. 当第一次外部中断线路9的中断发生后,SysTick中断的优先级变得比外部中断线路0的优先级高,因此,一旦发生外部中断线路0的中断,它将被SysTick中断打断,PreemptionOccured的值被置为True,4个LED开始闪耀。
2. 再次发生外部中断线路9的中断,PreemptionOccured的值被置回False,SysTick中断的优先级变得比外部中断线路0的优先级低,因此,一旦发生外部中断线路0的中断,它不会被SysTick中断打断,4个LED停止闪耀。
以上2种情况会循环发生。
由于在EKSTM32F板上,2个按钮被连在PD.04和PD.03上,因此,为了是本例运行,要把配置EXTI Line9和EXTI Line0改为配置EXTI Line4和EXTI Line3。同时,由于4个LED连接在PC.04 – PC.07,而不是STM3210B-EVAL上的PC.06 – PC.09,因此,程序在这里也要做相应的改动。
NVIC Example 2
本例展示了如何使用中断向量列表控制器(Nested Vectored Interrupt Controller)来设置IRQ通道。
把3个计时器(TIM2,3,4)设置为在每一个计数器更新事项(counter update event)产生中断。这三个计时器都与各自对应的更新IRQ通道联系起来,并设置他们的中断优先级,TIM2为0,TIM4为2。
在他们各自的中断中:TIM2每1秒翻转一次PC.06的状态;TIM3每2秒翻转一次PC.07的状态;TIM4每3秒翻转一次PC.08的状态。
由于在EKSTM32F板上, 4个LED连接在PC.04 – PC.07,而不是STM3210B-EVAL上的PC.06 – PC.09,因此,程序要做相应的改动。
NVIC Example 3
本例展示了如何运用NVIC和系统Handler(system handler):
各个system handlers拥有如下的强制优先级(preemption priority): - NMI preemption priority -1 - PSV preemption priority 0 - SVCall preemption priority 1 - SysTick preemption priority 2
把Systick定时器设定为每当其计数器为零则产生一个Systick中断。
在Systick handler routine中,设置与PC.06相连的LED以1秒为周期闪耀。随后执行SVC(System Service Call)指令。这会激活SVCall handler来打断当前的指令流。 在SVCall handler routine中,设置与PC.07相连的LED闪耀,同时设置PSV handler的pending比特。由于PSV(Pendable request for system service)的优先级更高,因此他又会打断SVCall handler。 在PSV handler routine中,设置与PC.08相连的LED闪耀,并设置NMI(Non maskable interrupt)pending比特,进一步由NMI handler打断当前handler。 最后,在NMI handler中设置与PC.09相连的LED闪耀。
由于在EKSTM32F板上, 4个LED连接在PC.04 – PC.07,而不是STM3210B-EVAL上的PC.06 – PC.09,因此,程序要做相应的改动。
NVIC Example 4
本例展示了如何使用NVIC固件函数库来来展示Cortex-M3低功耗性能(WFE和WFI)。
本例使用了3条外部中断线路,线路0,线路9和线路13,在每一个信号下降研做为中断发生源或者事项(event),其中外部中断线路0和13被设置为中断而线路9被设置成事项。用户需要在main程序开头的5个定义(define)语句中选择定义一个来决定进入那种低功耗模式。
这些选择为: - Wait For Interrupt (WFI) Sleep On Exit: 选择“#define WFISLEEPNOW”,在这个模式里,如果某中断有足够高的优先级,那么系统会进入这个中断,在从这个中断返回后,自动执行指令WFI进入Sleep模式。运行例程,表现如下:
与PC.09连接的LED闪耀提示系统运行在RUN模式,主程序执行中。 按按钮,进入EXTI Line0的中断,会改变与PC.08相连的LED状态。 按按钮,进入EXTI Line13的中断,与PC.06相连的LED状态改变提示进入此中断,终端返回后程序选中SLEEPONEXIT功能,这时,如果程序如果再进入任一中断(如按按钮进入EXTI Line0中断),从中返回后,系统都会自动进入Sleep模式,这时,与PC.09连接的LED不再闪耀
- Wait For Event (WFE) SEV ON PEND 选择“#define WFISLEEPNOW”在此模式下,一旦执行WFI指令,系统立刻进入Sleep模式。运行例程,表现如下:
与PC.09连接的LED闪耀提示系统运行在RUN模式,主程序执行中。 按按钮,进入EXTI Line13的中断,与PC.06相连的LED状态改变提示进入此中断,终端返回后程序执行WFI进入Sleep模式。与PC.09连接的LED不再闪耀。 按按钮,进入EXTI Line0的中断,会改变与PC.08相连的LED状态。同时把系统从Sleep模式中唤醒,与PC.09连接的LED恢复闪耀。
- Wait For Interrupt (WFI) Sleep Now 选择“#define WFESEVONPEND”,在此模式下,程序会直接执行WFE指令,且主指令流会被PRIMASK寄存器??(主程序优先级为0)。运行例程,表现如下:
与PC.09连接的LED闪耀提示系统运行在RUN模式,主程序执行中。 按按钮,进入EXTI Line13的中断,与PC.06相连的LED状态改变提示进入此中断,从中断返回后,主程序优先级被置0,因此将屏蔽所有中断,然后执行WFE进入Sleep模式。与PC.09连接的LED不再闪耀。 此时,按按钮将不再进入中断,但是,在三条中断线路上的下降沿仍然构成事项,能够把系统唤醒,与PC.09连接的LED恢复闪耀。但是,由于没有进入中断其它LED状态就不再改变。 如果定义了“#define RTC_Alarm_WFEWakeUp”,激活实时时钟警报功能,那么,即便不按按钮,6秒钟后CPU仍会被唤醒。
- Wait For Event (WFE) SEV ON EVENT 选择“#define WFESEVONEVENT”,在此模式下,直接执行WFE指令。运行例程,表现如下:
与PC.09连接的LED闪耀提示系统运行在RUN模式,主程序执行中。 按按钮,进入EXTI Line13的中断,与PC.06相连的LED状态改变提示进入此中断,从中断返回后执行WFE进入Sleep模式。与PC.09连接的LED不再闪耀。 此时,按任意按钮都会在三条线路上构成事项,将CPU唤醒,与前一种情况不同,此时,会进入中断,表现为LED状态会随着按按钮而相应地改变。 如果定义了“#define RTC_Alarm_WFEWakeUp”,激活实时时钟警报功能,那么,即便不按按钮,6秒钟后CPU仍会被唤醒。
由于在EKSTM32F板上, 4个LED连接在PC.04 – PC.07,而不是STM3210B-EVAL上的PC.06 – PC.09,因此,程序要做相应的改动。
NVIC Example 5
本例展示了如何打开DMA后使系统进入等待模式(WFI Mode),并在DMA传输结束后利用中断(DMA End of Transfer interrupt)唤醒系统。
系统时钟设为72 MHz,设置DMA通道5从USART数据寄存器传送十个数据到缓存DST_Buffer,并在传输结束后产生中断。
USART1从PC的超级终端接收数据,与PC.06相连的LED根据系统时钟闪耀,可以据此判断系统处于运行模式还是等待模式。外部中断线9上的侦测到下降沿产生中断可以使系统进入等待模式。
通过传送序列(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)可以把系统从等待模式中唤醒,这个数据经USART1接收后,由DMA传送到缓存,然后产生中断将系统唤醒。
如果数据传输正确,那么与PC.07相连的LED闪耀,反之,与PC.08相连的LED闪耀。
NVIC Example 6
本例展示了如何NVIC固件函数库来把CortexM3向量列表设置在预设地址以外的地方。
这项功能可以用来建立这样的程序:这些程序由预先经过某些FLASH基地址写入的应用载入FLASH存储器。这些应用可以是通过USART的IAP(In-Application Programming),或者是通过USB的DFU(Device Firmware Upgrade)。查询在ST微控制器网页www.st.com/stm32以下载这些应用。
本例程利用系统计时器的计数到零时产生的中断编写了一个延时函数("Delay" function)。由这个函数可以规定一个固定的时间,周期性地翻转连在PC.06, PC.07, PC.08和PC.09管脚上(EKSTM32F为管脚PC.04, PC.05, PC.06和PC.07)的4个LED的状态。
当用户使用IAP来载入程序时,向量列表必须被设置到地址0x08002000。
当用户使用DFU来载入程序时,向量列表必须被设置到地址0x08003000。
下载: 相关链接:https://bbs.21ic.com/upfiles/img/20083/200838194653677.zip |