|
本帖最后由 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中描述 19 0x0024 USART 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" |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|