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

SysTick问题

[复制链接]
zhjb1 提问时间:2020-4-14 09:57 /
案例使用64引脚的STM32F103C8T6芯片
设计功能:4个Input输入,7个Exit中断输入,2路PWM,3路ADC采样,1路I2C,1路USART,10路GPIO输出.
编译平台:用Keil5.3编译.
用CubeMX4.23创建项目ADC只有A1,A3可采样,A2永为0.不正常.
尝试用CubeMX5.3创建项目,3路ADC正常,但SysTick没有响应,即: HAL_SYSTICK_Callback函数没有响应.
使用SysTick做分时工作,采样和显示分别执行. SYSTICK没有响应,所以程序计数器无法工作.
在主程序中会造成计时不准. 对比过两CubeMX对SYSTICK的设置,移过来也无效,强制运行SYSTICKIRQ也无用.
请问是什么原因?解决的思路在那?
先谢谢了!
收藏 评论8 发布时间:2020-4-14 09:57

举报

8个回答
radio2radio 回答时间:2020-4-14 10:52:17
Systick是系统使用的,你可以试一试HAL_Delay是否正常,如果正常说明SysTick也工作正常。
你的系统比较复杂,建议加入RTOS系统,比如最简单的CMSIS_OS2等等。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

zhjb1 回答时间:2020-4-14 14:46:06
radio2radio 发表于 2020-4-14 10:52
Systick是系统使用的,你可以试一试HAL_Delay是否正常,如果正常说明SysTick也工作正常。
你的系统比较复杂 ...

您好!谢谢回复.
HAL_Delay正常,只是HAL_SYSTICK_Callback函数无效.我使用这个函数生成定时计数,而后用计数值做成类似分时操作.
这个函数在CUbeMX4.23中正常.在5.3中没有反应,试过返回错误信息,没有.
没有用OS.因为需要重新学习OS系统.
谢谢!
您好!刚试了挂载OS,可能是C8T6存储比较小,才设置了两个任务就报警了!我至少需要两个任务.
顺便说一下,MBED创建工程没有一点问题,所有功能都可以实现,但是明显速度较慢.就是说GPIO的效率比较低.

butterflyspring 回答时间:2020-4-23 17:05:54
CUBEMX 通常只是建立SYSTICK 1ms中断,并利用这个中断作为HAL库的部分应用节拍。 本身这个定时器也是为系统节拍设计的(通常是为操作系统)。所以一般应用都不建议去做其他使用,处理不好会扰乱系统工作(最常见的是中断)。 楼主需要定时器可以使用103的其他几个定时中断,这样保持cube软件库的架构逻辑完整。实际上几乎所有用户都是按照这个方式应用的。不是说SYSTICK不可以用做定时器,而是它已经有了重要的角色,改变它会产生很多连锁问题。而那么多芯片定时器资源还在那里等待用户使用呢 。 此外吗,HAL_delay正常说明SYSTICK 已经有中断了
zhjb1 回答时间:2020-4-23 20:17:39
butterflyspring 发表于 2020-4-23 17:05
CUBEMX 通常只是建立SYSTICK 1ms中断,并利用这个中断作为HAL库的部分应用节拍。 本身这个定时器也是为系统 ...

有道理,实际上已经采用Timer0作为自己的状态定时器了,谢谢!
谢谢所有回答此问题的朋友们!
glenxu 回答时间:2020-4-24 12:59:33
我也遇到同样的问题,查了很多资料,但听说是CUbeMX4.3以后版本取消了SYSTICK的中断函数,形式上在,但不会做任何操作,即使在SYSTICK中断中做个计数器++,都不可以。CALLBACK就更不可以了。
我也是想用它的分时调度功能,结果不能用。正不想再开辟TIMX,感觉好浪费。
怀念以前的SYSTICK,可以在不影响系统的情况下多很多用途。
radio2radio 回答时间:2020-4-24 15:32:59
glenxu 发表于 2020-4-24 12:59
我也遇到同样的问题,查了很多资料,但听说是CUbeMX4.3以后版本取消了SYSTICK的中断函数,形式上在,但不会 ...

我查了一下,CubeMX 5.4

在stm32f1xx_it.c里面,中断函数SysTick_Handler肯定可以直接修改的:
  1. /**
  2.   * @brief This function handles System tick timer.
  3.   */
  4. void SysTick_Handler(void)
  5. {
  6.   /* USER CODE BEGIN SysTick_IRQn 0 */

  7.   /* USER CODE END SysTick_IRQn 0 */
  8.   HAL_IncTick();
  9.   /* USER CODE BEGIN SysTick_IRQn 1 */

  10.   /* USER CODE END SysTick_IRQn 1 */
  11. }
复制代码


在stm32f1xx_hal.c里面,__weak的HAL_IncTick函数不用动,需要就用自己写的同名函数(没有__weak修饰,编译时自动覆盖原来的):
  1. /**
  2.   * @brief This function is called to increment  a global variable "uwTick"
  3.   *        used as application time base.
  4.   * @note In the default implementation, this variable is incremented each 1ms
  5.   *       in SysTick ISR.
  6.   * @note This function is declared as __weak to be overwritten in case of other
  7.   *      implementations in user file.
  8.   * @retval None
  9.   */
  10. __weak void HAL_IncTick(void)
  11. {
  12.   uwTick += uwTickFreq;
  13. }
复制代码


回答时间:2020-4-24 21:02:36
楼主,请确定一下5.3中是否包含HAL_SYSTICK_Callback这个函数的定义。如果没有定义,可能用法上有不同。我这里没有下载5.3,建议使用排除法。
glenxu 回答时间:2020-4-28 13:05:43
04.void SysTick_Handler(void)

05.{

06.  /* USER CODE BEGIN SysTick_IRQn 0 */

07.

08.  /* USER CODE END SysTick_IRQn 0 */

09.  HAL_IncTick();

10.  /* USER CODE BEGIN SysTick_IRQn 1 */

11.

12.  /* USER CODE END SysTick_IRQn 1 */

13.}
在这里面定义了一个全局变量++,也做过外部函数跳转(例如闪个LED),但都不执行!

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版