金牌会员
- 积分
- 1001
- 金钱
- 1001
- 注册时间
- 2018-8-16
- 在线时间
- 327 小时
|
100金钱
本帖最后由 brucewoo 于 2020-4-6 13:45 编辑
已解决,是中断的问题。
//=================================================
大家好。
是这样的,本人之前用过STM32F103,现在想做个小东西,于是选了STM8S103F3P,初学。
打算仿照STM32那样,搞个定时器西宫系统时间,后面的延时或其他逻辑可以使用,于是就做了个很简单的试验项目,但在实验过程中,出现了问题。
(工程项目压缩包已上传)
首先,自己写个.h和.c文件,放置自己的初始化代码。
- /* 全局变量 ------------------------------------------------------- */
- volatile u32 Millis=0;
- /* 函数 总体初始化调用------------------------------------------------------- */
- void bwConfInit(void)
- {
- TIM_init();
- }
- /* 函数 初始化CPU分频和TIM4作为系统定时器------------------------------------------------------- */
- void TIM_init(void)
- {
- //CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV8);//设置为内部高速时钟 默认为DIV8
- CLK->CKDIVR=CLK_PRESCALER_HSIDIV1;//本来应该是CLK_PRESCALER_HSIDIV8; 为了调试加快它
- //按照 f_master 为8分频,配置TIM4为1ms更新
- TIM4->PSCR=0; //本来应该是2^8分频 为了调试加快它
- TIM4->ARR=249; //调整到1ms
- TIM4->IER=1; //更新中断使能
- TIM4->CNTR=0; //计数器初始0
- asm("rim"); //调整主函数软件优先级 开启中断
- TIM4->CR1 |=1; //使能计数器
- }
- /* 函数 要放在TIM中断里的系统定时器实现函数------------------------------------------------------- */
- void SysTick(void)
- {
- Millis++;
- }
复制代码 然后在 stm8s_it.c里,做了中断服务程序调用。- INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
- {
- /* In order to detect unexpected events during development,
- it is recommended to set a breakpoint on the following instruction.
- */
-
- TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
- SysTick();
- // Millis++; 这样也没有改善
- // TIM4_ClearITPendingBit(TIM4_IT_UPDATE); 把中断标志清除放在前面或后面都没有改善
- }
复制代码 main.c里面是这样的:
- u32 LastCheck=0; //记录上一次翻转IO的时间
- u32 itvl=500; //间隔
- u8 flag=0; //用于调试
- u32 copy=0; //用于调试
- u32 copyL=0; //用于调试
- u32 diff=0; //用于调试
- void setup(void)
- {
- bwConfInit();
- GPIO_DeInit(GPIOB);
- GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
- }
- /* loop() ------------------------------------------------------------------*/
- void loop(void)
- {
- if (Millis<=LastCheck) //这种情况理论上不可能发生,调试用
- {
- flag=1;
- GPIO_WriteHigh(GPIOB, GPIO_PIN_5);
- while(1);
- }
-
- copy=Millis; //复制Millis
- copyL=LastCheck; //复制LastCheck用于调试
- diff=copy-LastCheck; //计算经过的时间
-
- if (diff>itvl) //如果经过时间超过间隔就翻转IO
- {
- GPIO_WriteReverse(GPIOB, GPIO_PIN_5);
- LastCheck+=itvl;
- }
- }
- /* 主函数 ------------------------------------------------------------------*/
- void main(void)
- {
- setup();
- /* Infinite loop */
- while (1)
- {
- loop();
- }
-
- }
复制代码
在实际运行,包括在IAR中调试,以及不调试,直接用st-link烧入hex文件,都出现了疑似程序跑飞,不按逻辑的情况。
例如这样:
又或者这样:
以前搞STM32时每碰到过这样奇葩的问题,就算有,后来也查出来是数组越界、野指针之类。
但这个工程是很简单的,没有数组或指针,缺出现了这样的问题,求大家拉一把!!
谢谢!
工程在附件:
2_testTemplate_New.rar
(221.61 KB, 下载次数: 7)
|
|