打印
[STM8]

使用TM2中断没有问题,多加一个中断就异常

[复制链接]
791|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lizye|  楼主 | 2019-3-8 15:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用TM2中断没有问题,多加一个中断就异常
沙发
zhanghqi| | 2019-3-8 15:24 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
板凳
lizye|  楼主 | 2019-3-8 15:28 | 只看该作者

工程是EWSTM8-2105版本的,在main函数里面,只有任意开三个中断的其中一个,程序就会死机,这是哪里出了问题?
//UART2_ITConfig(UART2_IT_RXNE , ENABLE);
//UART2_ITConfig(UART2_IT_TC , ENABLE);

//SPI_ITConfig(SPI_IT_TXE, ENABLE);

使用特权

评论回复
地板
heweibig| | 2019-3-8 15:32 | 只看该作者
有没有添加对应的中断回调函数?

使用特权

评论回复
5
xxrs| | 2019-3-8 15:34 | 只看该作者
EWSTM8还有什么启动文件这么一说的吗?

使用特权

评论回复
6
liuzaiy| | 2019-3-8 15:39 | 只看该作者
看一下stm8s_it.c貌似可以了呀,怎么回事?

使用特权

评论回复
7
lizye|  楼主 | 2019-3-8 15:42 | 只看该作者
程序并不复杂啊,难道是EWSTM8的版本有问题?

使用特权

评论回复
8
lizye|  楼主 | 2019-3-8 15:47 | 只看该作者
不开中断,UART2和SPI都能发送出数据来,再开其中任意一个中断,程序就死机了。

使用特权

评论回复
9
morrisk| | 2019-3-8 15:51 | 只看该作者
看看中断入口,中断函数有没有问题。

使用特权

评论回复
10
lizye|  楼主 | 2019-3-8 15:54 | 只看该作者

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

使用特权

评论回复
11
lizye|  楼主 | 2019-3-8 15:57 | 只看该作者
调试跟踪,发现程序会死在 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)
    {
    }

使用特权

评论回复
12
lizye|  楼主 | 2019-3-8 16:00 | 只看该作者
没有用到指针,都是很简单的调试程序。
//------------------------------------------------------------------------------
//接收中断处理
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);
}

使用特权

评论回复
13
zhaoxqi| | 2019-3-8 16:03 | 只看该作者

原来以为是hardfault,刚刚下了程序看了下,应该是参数错误或者说是你的配置错误。

使用特权

评论回复
14
zhaoxqi| | 2019-3-8 16:04 | 只看该作者

原来以为是hardfault,刚刚下了程序看了下,应该是参数错误或者说是你的配置错误。

使用特权

评论回复
15
jiajs| | 2019-3-8 16:07 | 只看该作者

你在call stack 看下,是哪个函数调用后,出现错误的。然后再检查一下。

使用特权

评论回复
16
juventus9554| | 2019-3-8 16:11 | 只看该作者

你用库里面的函数,它会对参数的范围进行有效性检查,不符合要求的,它就把你死锁在那里了。

使用特权

评论回复
17
lizye|  楼主 | 2019-3-8 16:14 | 只看该作者

您的意思是单步运行吗?

使用特权

评论回复
18
lizye|  楼主 | 2019-3-8 16:17 | 只看该作者
我又改成TIM4了,不是每次TIM4中断都会出错,不知道程序怎么跑到EWSTM8的库函数了的32位除法里面去了,见图。

使用特权

评论回复
19
chuxh| | 2019-3-8 16:20 | 只看该作者

感觉是多个中断,会有溢出?为什么会溢出呢?工程的设置,空间足够了吧

使用特权

评论回复
20
lizye|  楼主 | 2019-3-8 16:23 | 只看该作者

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 };

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

使用特权

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

本版积分规则

852

主题

9757

帖子

2

粉丝