zhjb1 发表于 2020-4-14 09:57:19

SysTick问题

案例使用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也无用.
请问是什么原因?解决的思路在那?
先谢谢了!

radio2radio 发表于 2020-4-14 10:52:17

Systick是系统使用的,你可以试一试HAL_Delay是否正常,如果正常说明SysTick也工作正常。
你的系统比较复杂,建议加入RTOS系统,比如最简单的CMSIS_OS2等等。

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肯定可以直接修改的:/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */

/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */

/* USER CODE END SysTick_IRQn 1 */
}

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

发表于 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),但都不执行!
页: [1]
查看完整版本: SysTick问题