OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4718|回复: 5

【求助】STM8S103F3 怀疑程序跑飞或不明问题

[复制链接]

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2020-4-5 01:01:07 | 显示全部楼层 |阅读模式
100金钱
本帖最后由 brucewoo 于 2020-4-6 13:45 编辑

已解决,是中断的问题。

//=================================================

大家好。
是这样的,本人之前用过STM32F103,现在想做个小东西,于是选了STM8S103F3P,初学。

打算仿照STM32那样,搞个定时器西宫系统时间,后面的延时或其他逻辑可以使用,于是就做了个很简单的试验项目,但在实验过程中,出现了问题。

(工程项目压缩包已上传)

首先,自己写个.h和.c文件,放置自己的初始化代码。
  1. /* 全局变量 ------------------------------------------------------- */
  2. volatile u32 Millis=0;

  3. /* 函数  总体初始化调用------------------------------------------------------- */
  4. void bwConfInit(void)
  5. {
  6.         TIM_init();
  7. }
  8. /* 函数  初始化CPU分频和TIM4作为系统定时器------------------------------------------------------- */
  9. void TIM_init(void)
  10. {
  11.         //CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV8);//设置为内部高速时钟 默认为DIV8
  12.         CLK->CKDIVR=CLK_PRESCALER_HSIDIV1;//本来应该是CLK_PRESCALER_HSIDIV8; 为了调试加快它
  13.         //按照 f_master 为8分频,配置TIM4为1ms更新
  14.         TIM4->PSCR=0;                        //本来应该是2^8分频 为了调试加快它
  15.         TIM4->ARR=249;                //调整到1ms
  16.         TIM4->IER=1;                        //更新中断使能
  17.         TIM4->CNTR=0;                        //计数器初始0
  18.         asm("rim");                                //调整主函数软件优先级 开启中断
  19.         TIM4->CR1 |=1;                //使能计数器
  20. }

  21. /* 函数  要放在TIM中断里的系统定时器实现函数------------------------------------------------------- */
  22. void SysTick(void)
  23. {
  24.         Millis++;
  25. }
复制代码
然后在 stm8s_it.c里,做了中断服务程序调用。
  1. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
  2. {
  3.   /* In order to detect unexpected events during development,
  4.      it is recommended to set a breakpoint on the following instruction.
  5.   */
  6.          
  7.          TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  8.          SysTick();
  9. //         Millis++; 这样也没有改善
  10. //         TIM4_ClearITPendingBit(TIM4_IT_UPDATE); 把中断标志清除放在前面或后面都没有改善
  11. }
复制代码
main.c里面是这样的:
  1. u32 LastCheck=0;        //记录上一次翻转IO的时间
  2. u32 itvl=500;                        //间隔
  3. u8 flag=0;                                //用于调试
  4. u32 copy=0;                                //用于调试
  5. u32 copyL=0;                        //用于调试
  6. u32 diff=0;                                //用于调试

  7. void setup(void)
  8. {
  9.         bwConfInit();
  10.         GPIO_DeInit(GPIOB);
  11.         GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
  12. }
  13. /* loop() ------------------------------------------------------------------*/
  14. void loop(void)
  15. {

  16.         if (Millis<=LastCheck)                        //这种情况理论上不可能发生,调试用
  17.         {
  18.                 flag=1;
  19.                 GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
  20.                 while(1);
  21.         }
  22.         
  23.         copy=Millis;                                                        //复制Millis
  24.         copyL=LastCheck;                                        //复制LastCheck用于调试
  25.         diff=copy-LastCheck;                        //计算经过的时间
  26.         
  27.         if (diff>itvl)                                                //如果经过时间超过间隔就翻转IO
  28.         {
  29.                 GPIO_WriteReverse(GPIOB, GPIO_PIN_5);
  30.                 LastCheck+=itvl;
  31.         }

  32. }
  33. /* 主函数 ------------------------------------------------------------------*/
  34. void main(void)
  35. {
  36.         setup();
  37.         /* Infinite loop */
  38.         while (1)
  39.         {
  40.                 loop();
  41.         }
  42.         
  43. }
复制代码


在实际运行,包括在IAR中调试,以及不调试,直接用st-link烧入hex文件,都出现了疑似程序跑飞,不按逻辑的情况。
例如这样:

又或者这样:


以前搞STM32时每碰到过这样奇葩的问题,就算有,后来也查出来是数组越界、野指针之类。
但这个工程是很简单的,没有数组或指针,缺出现了这样的问题,求大家拉一把!!
谢谢!

工程在附件: 2_testTemplate_New.rar (221.61 KB, 下载次数: 7)

最佳答案

查看完整内容[请看2#楼]

已破案,是中断问题。。。。。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
 楼主| 发表于 2020-4-5 01:01:08 | 显示全部楼层
已破案,是中断问题。。。。。。。。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-12-12
在线时间
5 小时
发表于 2020-4-5 19:02:30 | 显示全部楼层
1. 是否是优化等级过高;
2. 是否存在变量累加溢出;
3. 把中断里面操作的变量加上volatile试一下;
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
 楼主| 发表于 2020-4-6 08:40:35 | 显示全部楼层
已经破案了,是中断问题。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-5-20
在线时间
12 小时
发表于 2020-5-21 16:14:03 | 显示全部楼层
您好,我在使用stm8s105过程中,也有程序跑飞现象,您这边是咋解决的,是否可以分享
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
 楼主| 发表于 2020-8-9 09:59:13 | 显示全部楼层
dyf322322 发表于 2020-5-21 16:14
您好,我在使用stm8s105过程中,也有程序跑飞现象,您这边是咋解决的,是否可以分享

后来核实了不是跑飞,是中断处理的问题,应该和你的情况不一样。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 13:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表