你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于滴答定时器中断的问题

[复制链接]
vbsjyf 提问时间:2017-4-6 14:59 /
在用滴答定时器中断的时候,写完用软件模拟测试了一下,没什么问题,然后就烧了。结果一个写在SysTick_Handler里灯一直不闪,用了一个变量累加,效果是1s亮半秒。然后检查了一下,实际上SysTick_Handler只执行了一次。我配置的是SysTick_Config(SystemCoreClock/1000),1ms进一次中断。请问有没有遇到同样问题的,实在很费解

赞 收藏 1 评论9 发布时间:2017-4-6 14:59

举报

9个回答
翱翔云端的鸟 回答时间:2017-4-6 16:01:44
你可以在里面取反IO  看看是不是1ms的波形
如果没有 说明你配置有问题
vbsjyf 回答时间:2017-4-6 16:16:20
翱翔云端的鸟 发表于 2017-4-6 16:01
你可以在里面取反IO  看看是不是1ms的波形
如果没有 说明你配置有问题

是1ms,但是中断只进了一次。滴答定时器需要什么配置吗,我就只设置了一个SysTick_Config,没别的了,还需要别的什么配置吗
废鱼 回答时间:2017-4-6 16:44:52
最好有代码,说明具体的型号,大家有对应芯片的可以帮你试一下。
翱翔云端的鸟 回答时间:2017-4-6 17:07:43
我是1us中断一次的
  1. void SystemClock_Config(void)
  2. {

  3.   RCC_OscInitTypeDef RCC_OscInitStruct;
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  5.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;//HSE=8MHZ
  6.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;                                                                        //使能HSE                                                       
  7.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;                //HSE分频系数1
  8.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  9.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  10.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;                        //使用HSE作为PLL的输入时钟
  11.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;                                                        //PLL9倍频 SYSCLK=8*9=72MHZ
  12.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  13.   {
  14.     Error_Handler();
  15.   }

  16.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  17.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  18.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  19.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;                                //AHB=SYSCLK/1=72MHZ
  20.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;                                        //APB1=SYSCLK/2=36MHZ
  21.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;                                        //APB2=SYSCLK/1=72MHZ

  22.        
  23.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  24.   {
  25.     Error_Handler();
  26.   }

  27.   //SYSCLK中断配置
  28.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);

  29.   /**Configure the Systick*/
  30.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  31.   /* SysTick_IRQn interrupt configuration */
  32.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  33. }
复制代码
vbsjyf 回答时间:2017-4-6 17:14:08

这是HAL库写的吗,我没接触过HAL库,不过大概意思能看懂,我先看看我是不是漏了什么
vbsjyf 回答时间:2017-4-6 17:18:41
安 发表于 2017-4-6 16:44
最好有代码,说明具体的型号,大家有对应芯片的可以帮你试一下。

兄弟,主要代码公司是不让贴出来,要是能直接贴出来,我早放上来了。。。。。主要是想咨询一下,大家有没有遇到过这种系统定时器中断只执行一次的情况,真的很怪,我是第一次碰到,以前不管怎么乱配置也没出现过这种情况
anywill 回答时间:2017-4-7 04:09:58
本帖最后由 anywill 于 2017-4-7 04:11 编辑

看看我用mbed写的,很简洁#include<mbed>
DigitalOut led(PA_5);
Ticker timer led;
void ledflip()
{led=1;//假设高电平点亮      
   wait(1);   
  led=0;      
    }
int main()
{   
  timer_led.attach(&ledflip,0.5);//滴答中断   
while(1);  
}
手机编的排版不太好
废鱼 回答时间:2017-4-7 08:39:33
没有遇到过类似情况,楼主可以在线仿真,看一下寄存器的值,再确定是没有运行还是配置时间太长。
Cortexxx 回答时间:2017-4-9 12:04:59
本帖最后由 Cortexxx 于 2017-4-9 17:01 编辑

我用寄存器写的
  1. <blockquote>#define FOC_CLK 80       //1ms = FOC_CLK*125;
复制代码
  1. void SysTick_Init(void)
  2. {
  3.   SysTick->LOAD = 10000;
  4.   SysTick->VAL  = 0;
  5.   SysTick->CTRL = 3;
  6. }

  7. void SysTick_Handler(void)
  8. {
  9.   SysTick->VAL  = 0;
  10.   GPIOB->ODR^=0x80;
  11. }
复制代码


QQ图片20170409120155.png
听说SysTick 的中断默认最低优先级  而且不需要配置NVIC   地址竟然是-1 属于 处理器运行异常

然后测一下电平翻转情况 如下
QQ图片20170409114632.png
QQ截图20170408150008.jpg

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版