[STM8]

帮忙看个程序,使用TM2中断没有问题,多加一个中断就异常

[复制链接]
1667|17
手机看帖
扫描二维码
随时随地手机跟帖
ddc21ic|  楼主 | 2015-12-6 12:15 | 显示全部楼层 |阅读模式
各位大师,帮忙看看程序!
工程是EWSTM8-2105版本的,在main函数里面,只有任意开三个中断的其中一个,程序就会死机,这是哪里出了问题?
//UART2_ITConfig(UART2_IT_RXNE , ENABLE);
//UART2_ITConfig(UART2_IT_TC , ENABLE);

//SPI_ITConfig(SPI_IT_TXE, ENABLE);

EWSTM8还有什么启动文件这么一说的吗?看一下stm8s_it.c貌似可以了呀,怎么回事?
程序并不复杂啊,难道是EWSTM8的版本有问题?
高手帮帮忙。

STM8S_Test_V01.rar

1.61 MB

ddc21ic|  楼主 | 2015-12-6 12:28 | 显示全部楼层
不开中断,UART2和SPI都能发送出数据来,再开其中任意一个中断,程序就死机了。

使用特权

评论回复
desertsailor| | 2015-12-6 12:33 | 显示全部楼层
看看中断入口,中断函数有没有问题。

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-6 12:43 | 显示全部楼层
desertsailor 发表于 2015-12-6 12:33
看看中断入口,中断函数有没有问题。

中断入口是在stm8s_it.c里面,然后调用MAIN.C文件里面的
void UART2_RXD_IRQ(void)
void UART2_TXD_IRQ(void)
void SPI_TXD_IRQ(void)
函数
没看出有问题啊。

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-6 12:48 | 显示全部楼层
调试跟踪,发现程序会死在 assert_failed函数里面
void assert_failed(u8* file, u32 line)
{
    /* User can add his own implementation to report the file name and line number,
       ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    /* Infinite loop */
    while (1)
    {
    }
}

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-7 10:28 | 显示全部楼层
顶一下,期待高手指点!

使用特权

评论回复
s_f_tan| | 2015-12-7 13:45 | 显示全部楼层
断言错误?你看中断函数有没有使用指针,是不是指针溢出了

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-7 13:52 | 显示全部楼层
s_f_tan 发表于 2015-12-7 13:45
断言错误?你看中断函数有没有使用指针,是不是指针溢出了

没有用到指针,都是很简单的调试程序。
//------------------------------------------------------------------------------
//接收中断处理
void UART2_RXD_IRQ(void)
{
  UART2_ClearITPendingBit(UART2_IT_RXNE);
  UART2_SendData8(UART2_ReceiveData8());
}

//------------------------------------------------------------------------------
//发送中断处理
void UART2_TXD_IRQ(void)
{
  UART2_ClearITPendingBit(UART2_IT_TC);
}

//------------------------------------------------------------------------------
void SPI_TXD_IRQ(void)
{
  SPI_ITConfig(SPI_IT_TXE,DISABLE);   //禁止中断
  SPI_ClearITPendingBit(SPI_IT_TXE);  //清_中断标志位
  SPI_ClearFlag(SPI_FLAG_TXE);
  SPI_SendData(0x01);
}

使用特权

评论回复
s_f_tan| | 2015-12-7 16:20 | 显示全部楼层
原来以为是hardfault,刚刚下了程序看了下,应该是参数错误或者说是你的配置错误。
你在call stack 看下,是哪个函数调用后,出现错误的。然后再检查一下。

使用特权

评论回复
s_f_tan| | 2015-12-7 16:22 | 显示全部楼层
你用库里面的函数,它会对参数的范围进行有效性检查,不符合要求的,它就把你死锁在那里了。

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-7 16:22 | 显示全部楼层
s_f_tan 发表于 2015-12-7 16:20
原来以为是hardfault,刚刚下了程序看了下,应该是参数错误或者说是你的配置错误。
你在call stack 看下,是 ...

谢谢!:handshake
您的意思是单步运行吗?

使用特权

评论回复
s_f_tan| | 2015-12-7 16:37 | 显示全部楼层
加断点,跟进去看看,看是不是每次都发生,还是偶尔发生的。

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-7 22:04 | 显示全部楼层
s_f_tan 发表于 2015-12-7 16:37
加断点,跟进去看看,看是不是每次都发生,还是偶尔发生的。

我又改成TIM4了,不是每次TIM4中断都会出错,不知道程序怎么跑到EWSTM8的库函数了的32位除法里面去了,见图。
问题出在哪呢?
错误.jpg

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-7 22:09 | 显示全部楼层
感觉是多个中断,会有溢出?为什么会溢出呢?工程的设置,空间足够了吧
错误2.jpg

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-7 22:20 | 显示全部楼层
icf文件,没有修改过
/////////////////////////////////////////////////////////////////
//      Example ILINK command file for
//      STM8 IAR C/C++ Compiler and Assembler.
//
//      Copyright 2014 IAR Systems AB.
//
/////////////////////////////////////////////////////////////////

define memory with size = 16M;

define region TinyData = [from 0x00 to 0xFF];

define region NearData = [from 0x0000 to 0x07FF];

define region Eeprom = [from 0x4000 to 0x43FF];

define region BootROM = [from 0x6000 to 0x67FF];

define region NearFuncCode = [from 0x8000 to 0xFFFF];

define region FarFuncCode = [from 0x8000 to 0xFFFF];

define region HugeFuncCode = [from 0x8000 to 0xFFFF];


/////////////////////////////////////////////////////////////////

define block CSTACK with size = _CSTACK_SIZE  {};

define block HEAP  with size = _HEAP_SIZE {};

define block INTVEC with size = 0x80 { ro section .intvec };

// Initialization
initialize by copy { rw section .far.bss,
                     rw section .far.data,
                     rw section .far_func.textrw,
                     rw section .huge.bss,
                     rw section .huge.data,
                     rw section .huge_func.textrw,
                     rw section .iar.dynexit,
                     rw section .near.bss,
                     rw section .near.data,
                     rw section .near_func.textrw,
                     rw section .tiny.bss,
                     rw section .tiny.data,
                     ro section .tiny.rodata };

initialize by copy with packing = none {section __DLIB_PERTHREAD };

do not initialize  { rw section .eeprom.noinit,
                     rw section .far.noinit,
                     rw section .huge.noinit,
                     rw section .near.noinit,
                     rw section .tiny.noinit,
                     rw section .vregs };

// Placement
place at start of TinyData      { rw section .vregs };
place in TinyData               { rw section .tiny.bss,
                                  rw section .tiny.data,
                                  rw section .tiny.noinit,
                                  rw section .tiny.rodata };

place at end of NearData        { block CSTACK };
place in NearData               { block HEAP,
                                  rw section __DLIB_PERTHREAD,
                                  rw section .far.bss,
                                  rw section .far.data,
                                  rw section .far.noinit,
                                  rw section .far_func.textrw,
                                  rw section .huge.bss,
                                  rw section .huge.data,
                                  rw section .huge.noinit,
                                  rw section .huge_func.textrw,
                                  rw section .iar.dynexit,
                                  rw section .near.bss,
                                  rw section .near.data,
                                  rw section .near.noinit,
                                  rw section .near_func.textrw };

place at start of NearFuncCode  { block INTVEC };
place in NearFuncCode           { ro section __DLIB_PERTHREAD_init,
                                  ro section .far.data_init,
                                  ro section .far_func.textrw_init,
                                  ro section .huge.data_init,
                                  ro section .huge_func.textrw_init,
                                  ro section .iar.init_table,
                                  ro section .init_array,
                                  ro section .near.data_init,
                                  ro section .near.rodata,
                                  ro section .near_func.text,
                                  ro section .near_func.textrw_init,
                                  ro section .tiny.data_init,
                                  ro section .tiny.rodata_init };

place in FarFuncCode            { ro section .far.rodata,
                                  ro section .far_func.text };

place in HugeFuncCode           { ro section .huge.rodata,
                                  ro section .huge_func.text };

place in Eeprom                 {    section .eeprom.noinit };

place in Eeprom                 {    section .eeprom.data };

place in Eeprom                 {    section .eeprom.rodata };

/////////////////////////////////////////////////////////////////

使用特权

评论回复
s_f_tan| | 2015-12-8 10:20 | 显示全部楼层
乱飞的时候,看下stack指针指到哪里去了,看是不是stack 溢出了。

使用特权

评论回复
ddc21ic|  楼主 | 2015-12-8 11:43 | 显示全部楼层
s_f_tan 发表于 2015-12-8 10:20
乱飞的时候,看下stack指针指到哪里去了,看是不是stack 溢出了。

多谢您!
stack 都设到0x200了,还溢出。
EWSTM8有问题吧,唉,本以为用STM8封装小,好焊接
搞了一个星期了,不行还的换回STM32了。
STM8就这么少人用么?!!

使用特权

评论回复
s_f_tan| | 2015-12-8 13:19 | 显示全部楼层
如果怀疑编译器的问题,那用stvd看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

211

帖子

2

粉丝