kation122 发表于 2015-3-30 22:15:27

LGT8F328 中断向量探疑.(IAR 开发环境)

本帖最后由 kation122 于 2015-3-30 22:32 编辑

      从LGT 买了仿真器,LGT 送了两片LGT8F328, 和两片对应的最小系统PCB,将MCU 焊接到PCB,准备选择IAR做为开发平台,
因为之前的项目,都是IAR 开发的,这样有利自己开放资源整合。下面正题。
   之前没用过AVR ,本人AVR 小白一个,所以用了LGTSDK_Builder 来自动生成程序。询问LGT 的大侠,答复说可以直接使用 88A 的头文件,LGTSDK_Builder 选88A 可以。
就开始弄了,第一步弄GPIO ,这个LGTSDK 挺好用的,一下GPIO 就OK 了,能闪LED 了。好的开头,不错。
        接下来就弄UART 了, UART 弄了中断接收、查询发送,先调试TX,使用LGTSDK 的函数,发送一下OK 了,表明UART 寄存器配置OK 了。
但是发现用串口助手给MCU 发数据,中断收不到。设置断点,发现进入不了UART RX 中断。
暂停仿真,检查MCU 的寄存器,SREG寄存器中的 I=1(开全局中断开了),RXEN0=1(UART 接收EN); RXCIE0=1(UART 接收中断使能);
让串口助手不停的发数据,可以观察到RXC0 位会置1,表明是收到数据了,但是进入不了中断,改用查询方法来接收(RXC0 置位表明收到一字节),查询方法能正确收到。
到此证明了UART 配置是正确的,问题应该出现中断入口上面,查看datasheet,查看汇编程序,请看图


可以看到中断向量是在0X000024 ,查看datasheet中描述 190x0024USART RXC USART 接收结束中断,没错呀,328D 的UART RX 中断向量地址是0X0024,对得上。
然后各种折腾,直到午饭时间了,也毫无进展,算鸟,先吃饭午休吧。

    16点午休起来了,精力又恢复了,先是一顿搜索 mega328 无法进入中断的贴子,无果,还是认真研究datasheet吧,看到中断向量部分有这样的描述
“LGT8F48D/88D/168D/328D 的中断资源基本相同,主要区别为:LGT8F48D/88D的中断向量为1个指令字(16bit),而LGT8F168D/328D2 的中断向量为2个指令字(32bit)”
问题应该在这里了,我用的头文件是88A 的,对应应该是88D,而我现在使用的328D 中断向量应该是88AX2 才对, lgt8f88a_iar.h 中 #define LGT_VECTOR_S_IVN_RXC                "vector = 36"
36X2=72 ,将其中断向量改为72,一测试,果然好了。后面还添加了Timer0 的OV中断,如果不修改中断向量,同样的无法进入OV中断,将#define LGT_VECTOR_S_IVN_TC0_TOV        "vector = 64"
就OK ,再次验证了同样的问题。

总结:所以目前看来328 使用88A 的头文件,是有一定bug 的。查看了最新发布发LGTSDK_Builder_1.5beta2 中的头文件。这个lgt8f328d_iar.h 的中断向量也是有问题的。如下图,328 中断向量应该是32bit 的,
所以中断向量的间隔应该是4byte 才对。请LGT 工程人员确认是否是有这样的问题。(规格书中的LGT8F88D 中断向量地址似乎也不对,手上没有88D 芯片无法测试,只是从数据来看不对)



我测试OK 的中断向量:
/** interrupt */
#define LGT_VECTOR_S_IVN_EXINT0                "vector = 4"
#define LGT_VECTOR_S_IVN_EXINT1                "vector = 8"
#define LGT_VECTOR_S_IVN_PCINT0                "vector = 12"
#define LGT_VECTOR_S_IVN_PCINT1                "vector = 16"
#define LGT_VECTOR_S_IVN_PCINT2                "vector = 20"
#define LGT_VECTOR_S_IVN_WDT                "vector = 24"
#define LGT_VECTOR_S_IVN_TC2_OCA        "vector = 28"
#define LGT_VECTOR_S_IVN_TC2_OCB        "vector = 32"
#define LGT_VECTOR_S_IVN_TC2_TOV        "vector = 36"
#define LGT_VECTOR_S_IVN_TC1_ICP        "vector = 40"
#define LGT_VECTOR_S_IVN_TC1_OCA        "vector = 44"
#define LGT_VECTOR_S_IVN_TC1_OCB        "vector = 48"
#define LGT_VECTOR_S_IVN_TC1_TOV        "vector = 52"
#define LGT_VECTOR_S_IVN_TC0_OCA        "vector = 56"
#define LGT_VECTOR_S_IVN_TC0_OCB        "vector = 60"
#define LGT_VECTOR_S_IVN_TC0_TOV        "vector = 64"
#define LGT_VECTOR_S_IVN_SPI_STC        "vector = 68"
#define LGT_VECTOR_S_IVN_RXC                "vector = 72"
#define LGT_VECTOR_S_IVN_UDR                "vector = 76"
#define LGT_VECTOR_S_IVN_TXC                "vector = 80"
#define LGT_VECTOR_S_IVN_ADC                "vector = 84"
#define LGT_VECTOR_S_IVN_EE_RDY                "vector = 88"
#define LGT_VECTOR_S_IVN_ACP                "vector = 92"
#define LGT_VECTOR_S_IVN_TWI                "vector = 96"
#define LGT_VECTOR_S_IVN_PCINT3                "vector = 108"

LGT 发表于 2015-3-30 23:17:32

你是对的,sdkbuilder里面直接复用了88a的头文件,因此向量地址不对,非常感谢您的反馈,我们会尽快修改更新!

LVmcu 发表于 2015-3-31 09:08:39

LGT仿真器和LGT8F328多少钱一个?

LGT 发表于 2015-3-31 12:02:05

LVmcu 发表于 2015-3-31 09:08
LGT仿真器和LGT8F328多少钱一个?

之前的仿真器也可以用, 升级下固件就可以了。 目前的价格是¥30元

kation122 发表于 2015-4-2 14:01:43

LGT 发表于 2015-3-31 12:02
之前的仿真器也可以用, 升级下固件就可以了。 目前的价格是¥30元

这个仿真器价格 很好。仿真器也好用。

iwqt1983 发表于 2015-4-2 16:41:52

kation122 发表于 2015-4-2 14:01
这个仿真器价格 很好。仿真器也好用。

你好,能共享下你改好的例程吗?谢谢。我的也快到了,好测试下。

kation122 发表于 2015-4-2 17:06:02

我另外一个贴子 是改好的,那里有完整的工程包,

mowin 发表于 2015-4-2 17:09:18

楼主大神,能否测试一下这个单片机ADC的线性度?谢谢。

liujian6f 发表于 2015-8-3 17:32:07

谢谢 被这个问题折腾了一下午。LGT官方这么久了 就不能抽点时间 理一下头文件吗!!
页: [1]
查看完整版本: LGT8F328 中断向量探疑.(IAR 开发环境)