野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14412|回复: 5

在Tim7中断程序中调用SysTick延时,出现死机现象(已解决)

[复制链接]
发表于 2015-1-5 14:14:24 | 显示全部楼层 |阅读模式
本帖最后由 wxyz 于 2015-1-6 12:23 编辑

STM32F103VET6芯片,开启了Tim6,Tim7和SysTick定时中断,用教程例子中的SysTick延时,在Tim7中断程序中调用SysTick延时,出现死机现象【增加了独立软件狗,也是每6秒不停的复位(设置成每6秒复位),主程序中有重新装载独立软件狗的语句】。SysTick中断的优先级没有变,可能为默认的6级,Tim7中断的强占优先级设置大于6和小于6,只要调用SysTick延时,就出现死机现象。Tim7中断程序中不调用SysTick延时,调用简单的循环延时,运行正常。没有jtag工具,不知道是什么原因。而将Tim7中断换成Tim3中断,其他不变,则程序运行正常。
试了好几天,发现此现象。只好不用Tim7了,改用Tim3,Tim6和SysTick了。
回复

使用道具 举报

 楼主| 发表于 2015-1-6 11:03:42 | 显示全部楼层
唉!今天又测试了。在主程序中调用SysTick延时,运行正常。在Tim3中断服务程序中调用SysTick延时,也出现死机现象。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-6 12:20:34 | 显示全部楼层
本帖最后由 wxyz 于 2015-1-6 12:25 编辑

又本论坛搜索,发现原来是没有搞明白SysTick默认的优先级。
systick配置函数中包含中断优先级的设置,如下:

static __INLINE uint32_tSysTick_Config(uint32_t ticks)

{

…………

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 SystemInterrupts */

…………

}

由于__NVIC_PRIO_BITS定义为4,上式中(1<<__NVIC_PRIO_BITS)- 1)=15,所以systick的中断优先级是最低的。
-----
默认systick的优先级是最低的。
-----
/********************************************************************************
* 重新配置SysTick的中断优先级为最高,要不然SysTick延时中断抢占不了IO EXTI中断
* 因为SysTick初始化时默认配置的优先级是最低的
* 或者当你用其他定时器做延时的时候,要配置定时器的优先级高于IO EXTI中断的优先级
********************************************************************************/
NVIC_SetPriority (SysTick_IRQn, 0);

把上面这条语句加到你的程序里面去就好了。

将SysTick的优先级设置为0,Tim3的设置为7,在Tim3中断中调用SysTick延时,运行正常。
谢谢网友的帮助!
回复 支持 反对

使用道具 举报

发表于 2016-3-20 10:00:16 | 显示全部楼层
请问是把
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 SystemInterrupts */
换成
NVIC_SetPriority (SysTick_IRQn, 0);吗
回复 支持 反对

使用道具 举报

发表于 2016-3-20 10:03:06 | 显示全部楼层
我改了没有反应呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-21 14:37:45 | 显示全部楼层

看了以前的代码,我是按照以下的方法配置的:
1、初始化SysTick时,设置SysTick抢占优先级为6。
  NVIC_SetPriority(SysTick_IRQn, 6);                         // 设置SysTick抢占优先级为6。 SysTick抢占优先级默认为15,是最低的。

2、在Tim6的NVIC中断配置中,Tim6抢占优先级为7,比SysTick抢占优先级6低
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);            // NVIC第四优先级组有16种抢占优先级,没有种响应优先级。      

   NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;            // 定时器6为中断源
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;  // SysTick已设置为抢占优先级为6,TIM6应低于SysTick的,这里设置为7.
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
   NVIC_Init(&NVIC_InitStructure);

SysTick中断延时可以打断Tim6中断,没有死机现象。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-13 18:18 , Processed in 0.028260 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表