STM32屏蔽SysTick中断服务

SysTick_Config(uint32_t ticks);库函数是用来定义重装载值的,我们来看下它的详细信息。该库函数在在 core_cm3.h中被定义。

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

可以看出SysTick->的TICKINT位被配置为1,为1时倒计时数到 0 时产生 SysTick 异常请
求, 为0时倒计时数到 0 时无动作。我们只需要把SysTick_CTRL_TICKINT_Msk换成0就可以屏蔽掉SysTick中断服务函数

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   0| 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}
### STM32 SysTick 定时器中断计时不准确的原因 STM32 中的 SysTick 定时器用于提供精确的时间延迟和定时功能。然而,在实际应用中可能会遇到计时不准确的情况,这通常由以下几个原因引起: - **系统时钟配置错误**:SysTick 使用的是系统的 HCLK 作为其时钟源。如果系统时钟配置不正确,将会直接影响到 SysTick 的工作频率[^1]。 - **中断优先级设置不当**:当多个外设共享相同的中断线或存在更高优先级的中断抢占 CPU 资源时,可能导致 SysTick 中断响应延迟,从而影响计时精度[^2]。 - **代码执行效率问题**:在某些情况下,程序中的其他部分可能占用过多 CPU 时间片,使得 SysTick 计数未能及时更新,进而造成延时误差。 - **硬件噪声干扰**:外部环境因素如电磁兼容性(EMC)等问题也可能对微控制器内部电路产生不利影响,间接导致 SysTick 行为异常[^3]。 ### 解决方案 针对上述提到的各种可能性,以下是几种常见的改进措施来提高 SysTick 定时准确性: #### 正确配置系统时钟 确保系统时钟被正确初始化并稳定运行。可以通过读取 RCC 寄存器的状态位验证当前使用的时钟源是否符合预期,并调整 `SystemCoreClock` 变量以反映最新的核心频率值。 ```c // 初始化系统时钟至72MHz HAL_RCC_OscConfig(&RCC_OscInitStruct); HAL_RCC_ClkInit(&RCC_ClkInitStruct); // 更新全局变量 SystemCoreClock SystemCoreClockUpdate(); ``` #### 合理规划中断优先级 对于多任务环境下使用 SysTick 实现精准延时时,应合理安排各中断的服务顺序,降低高优先级事件对低级别处理过程的影响程度;同时也可以考虑采用 DMA 或者双缓冲机制减少数据传输过程中产生的抖动现象。 ```c NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); ``` #### 提升软件性能优化 尽可能简化临界区内的逻辑运算复杂度以及缩短循环体长度,避免不必要的等待状态发生;另外还可以利用编译器内置属性标记关键路径上的函数/语句段落以便于后续调试分析工具识别跟踪. ```c __attribute__((optimize("O3"))) void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while (TimingDelay != 0); } ``` #### 加强抗噪能力设计 采取有效的屏蔽手段防止外界信号串扰进入 PCB 板内敏感区域附近;选用质量可靠的元器件产品组合构建稳固可靠的应用平台基础架构体系结构。 通过以上方法可以有效改善 STM32 设备上基于 SysTick 构建起来的时间管理子系统的稳定性表现水平。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值