GD32 库函数systick库BUG报告

[复制链接]
 楼主| lifenghk 发表于 2022-11-23 20:51 | 显示全部楼层 |阅读模式
测试芯片GD32F303CCT6
systick库中的delay_1ms(int ms) 函数存在重大BUG,进入就会死循环。打开库文件发现根本未进行正确实现。库文件代码如下:
/*!
    \brief      delay a time in milliseconds
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
*/
void delay_1ms(uint32_t count)
{
    delay = count;

    while(0U != delay){
    }
}

而这根本就未对delay做任何操作,不可能跳出循环。改用其他来源的delay函数才解决。
对比发现,F10x,E230,F30x等系列所提供的库函数均存在此BUG。systick库非常粗糙,未进行正确实现。

星辰大海不退缩 发表于 2022-11-23 21:03 | 显示全部楼层
确实有时候会有这种问题,库文件得即使更新纠正问题
sonicll 发表于 2022-11-24 09:45 | 显示全部楼层
你这是只看了代码,从来没在板子上跑过例程吗?只要你跑过一个例子,就会发现systick中断服务函数里调用了delay_decrement(),delay值是在delay_decrement函数里做递减的。这么简单的问题,如果真是bug,早就有人反馈了
lvben5d 发表于 2022-11-24 13:08 | 显示全部楼层
这种全局变量  首字母不大写的写法,要打PP 。 Delay = count   起码看上去区别于局部变量顺一些, 要是 ex_Delay  保不齐更利于新人们看看
jackcat 发表于 2022-11-25 10:38 | 显示全部楼层
参考stm32的systick熟悉爱你delayms的功能吧。
kkzz 发表于 2022-11-25 10:49 | 显示全部楼层
这个还真没有遇到过。              
 楼主| lifenghk 发表于 2022-11-25 10:52 | 显示全部楼层
sonicll 发表于 2022-11-24 09:45
你这是只看了代码,从来没在板子上跑过例程吗?只要你跑过一个例子,就会发现systick中断服务函数里调用了d ...

就是因为在板子上跑程序,调用这个函数就会死机。
modesty3jonah 发表于 2022-11-25 11:10 | 显示全部楼层
这个是库里面自带的函数的吗              
maudlu 发表于 2022-11-25 12:09 | 显示全部楼层
为什么不使用定时器实现delay函数呢
m564522634 发表于 2022-11-25 18:03 | 显示全部楼层
delay  明显就不是一个局部变量了, 你怎么算出不做啥的
sagade 发表于 2022-11-26 09:56 | 显示全部楼层
特意去试了下,文件完全没有问题的,是你没有调用systick_config吧,还有SysTick_Handler里面有没有调用delay_decrement。
呐咯密密 发表于 2022-11-26 16:53 | 显示全部楼层
我在这个函数也卡死,自己写了一个
呐咯密密 发表于 2022-11-26 16:56 | 显示全部楼层
  1. uint32_t  fac_us=0;       
  2. #define assert_param(expr) ((void)0)
  3. #define SysTick_CTRL_ENABLE_Pos1             0U                                            /*!< SysTick CTRL: ENABLE Position */
  4. #define SysTick_CTRL_ENABLE_Msk1            (1UL << SysTick_CTRL_ENABLE_Pos1)  

  5. void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
  6. {
  7.   /* Check the parameters */
  8.   assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  9.   
  10.   if (SysTick_CLKSource == SYSTICK_CLKSOURCE_HCLK)
  11.   {
  12.     SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;
  13.   }
  14.   else
  15.   {
  16.     SysTick->CTRL &= SYSTICK_CLKSOURCE_HCLK_DIV8;
  17.   }
  18. }

  19. /************************************************
  20. 函数名称 : delay_init
  21. 功    能 : 延时初始化
  22. 参    数 : 无
  23. 返 回 值 : 无
  24. 作    者 : Mico
  25. *************************************************/
  26. void delay_init(void)
  27. {

  28.         SysTick_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);        //选择外部时钟  HCLK/8
  29.         fac_us=SystemCoreClock/8000000;                                //为系统时钟的1/8  

  30. }       
  31. /************************************************
  32. 函数名称 : delay_us
  33. 功    能 : 实现微秒级别延时
  34. 参    数 : nus
  35. 返 回 值 : 无
  36. 作    者 : Mico
  37. *************************************************/

  38. void delay_us(uint32_t nus)
  39. {               
  40.        
  41.         uint32_t temp;                     
  42.         SysTick->LOAD=nus*9;                                         //时间加载                           
  43.         SysTick->VAL=0x00;                                                //清空计数器
  44.         SysTick->CTRL|=0x01 ;        //开始倒数          
  45.         do
  46.         {
  47.                 temp=SysTick->CTRL;
  48.         }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
  49.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk1;        //关闭计数器
  50.         SysTick->VAL =0X00;                                               //清空计数器         
  51. }


jacques0408 发表于 2022-11-26 17:05 | 显示全部楼层
我用的GD32C103,我这款是在gd32c10x_it.c文件的 void SysTick_Handler(void) 函数中调用delay_decrement(); 每次进入此中断就给delay变量减一。
6)HP2`DOF`J7[CTY}H_BVN7.png
T93WE])((ME%~M]9Q5TNU}N.png
sonicll 发表于 2022-11-28 09:28 | 显示全部楼层

这种用法需要注意systick的计数值是24bit的,所以延时时间不能设置的太长
呐咯密密 发表于 2022-11-28 09:55 | 显示全部楼层
sonicll 发表于 2022-11-28 09:28
这种用法需要注意systick的计数值是24bit的,所以延时时间不能设置的太长

是这样的,所以只是us的延时,可以在套一下变成ms
imdx 发表于 2022-11-28 10:35 | 显示全部楼层
这不是bug,是你没看懂代码。SysTick的ISR中会调用delay_decrement函数修改delay这个变量。
而且,这根本不是库,systick在Template目录下,只是一个简单的demo而已。
chenjun89 发表于 2022-12-3 18:53 来自手机 | 显示全部楼层
这确实不是bug
Jacquetry 发表于 2022-12-21 17:29 | 显示全部楼层
SysTick的ISR中会调用delay_decrement函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部