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

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

[复制链接]
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版