-
学习了
-
怎么回事啊,如果我不打开观察寄存器的窗口,程序是正确的,P1.4口应该没有被清零,但是如果我打开看着寄存器的变化,就不行了,难道中断标志位在被观察窗口取走之后就会被清零,这是IAR的用法吗?
-
不应该啊,P1.4口就是接了一个按钮,而且进去中断的时候也就是到断点的时候标志位已经被置位了,我就是看了看GIE,怎么P1.4的标志位就被清零了呢,其它位的标志位没有变,我再找找看吧
-
确实是在头文件里定义了,真是让我好找啊
-
我重新把编译成功的例子改为我需要的程序,这次没有问题了,不知道什么原因,我原来也是这么做的啊,也许是之前不小心误删了什么东西吧。
-
这个相应的中断向量要在哪里看,我只找到了这一句
#define ISR(a,b) \
__PRAGMA__(vector=a ##_VECTOR) \
__interrupt void b(void)
我按下P1.4的开关的时候中断跳到了ISR(CC2520_IRQ, cc2520_port1_interrupt)为什么不是ISR(PORT1, irq_p1)
-
程序是在别的编译成功的程序上改的,头文件没敢动,还加了几个,不知道是不是还少哪个,所有程序如下
#include "contiki.h"
#include
#include "blink3.h"
#include "leds.h"
#include "uart1.h"
#include "stdio.h"
#include "dev/cc2520.h"
#include "lib/random.h"
#include "net/netstack.h"
#include "net/mac/frame802154.h"
#include "net/rime.h"
#include "node-id.h"
#include "sys/autostart.h"
#include "sys/profile.h"
//#include "sprintf.h"
#include "ds2411.h"
#include "i2c.h"
#include "light.h"
#include "dev/button-sensor.h"
#include "msp430x54x.h"
#include "isr_compat.h"
#include
#ifndef NODE_ID
#define NODE_ID 0x4
#endif /* NODE_ID */
void main(void)
{
/*
* Initalize hardware.
*/
WDTCTL = WDTPW + WDTHOLD;
msp430_cpu_init();
clock_init();
I2C_Init();
leds_init();
ds2411_init();
button_init();
sensors_light_init();
uart1_init(115200);
//点亮LED灯
P5OUT |= BIT2;
P5DIR |= BIT2;
P1DIR &= ~BIT4; //中断引脚应该设置为输入
P1IES |= BIT4; //设置为下降沿触发 =0上升沿触发
P1IFG &= ~BIT4; //因为P1IES设置会使中断标志位置位,故清零
P1IE |= BIT4; //设置中断使能
_EINT(); //打开总中断
LPM3; //设置为LPM3低功耗模式,产生中断时自动激活
//为活动模式,如果在中断中没有修改低功耗模
//式,中断程序执行完成后,又进入LPM3模式
while(1);
}
#pragma vector = PORT1_VECTOR
__interrupt void P1_Interrupt(void)
{
if((P1IFG&0x10) == BIT4)//判断是不是按键P10产生的中断
//因为P1端口共用这个中断向量表
{
P1IFG &= ~BIT4; //中断标志清楚(注意)
P5OUT ^= BIT2; //LED取反
}
else
{
P1IFG &= ~BIT4; //非P10的中断处理
}
}
-
不是中文路径的问题,改为全英文的路径也不行,还是相同的问题
-
学习学习,谢谢分享
-
找到原因了,在c文件中不把它定义成extern类型,然后在h文件中声明为extern类型,编译时就不会出现错误提示。
-
加了两个延时就没有问题了,应该是串口忙的问题,谢谢版主的帮助
-
while(1) {
printString("abcd\n");
static struct etimer et;
etimer_set(&et, CLOCK_SECOND * 5 );
ADC12CTL0 |= ADC12SC;
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
temperature = (uint16_t)(6.25 * TMP112_ReadTemp());
light1 = sensors_light1();
uart_buffer[0] = 'T';
uart_buffer[1] = ':';
uart_buffer[6] = (temperature % 10) + 0x30;
temperature /= 10;
uart_buffer[5] = (temperature % 10) + 0x30;
temperature /= 10;
uart_buffer[4] = '.';
uart_buffer[3] = (temperature % 10) + 0x30;
temperature /= 10;
uart_buffer[2] = (temperature % 10) + 0x30;
uart_buffer[7] = ';';
uart_buffer[8] = 'L';
uart_buffer[9] = ':';
for(i = 0; i < 4; i++)
{
uart_buffer[13 - i] = (light1 % 10) + 0x30;
light1 /= 10;
}
uart_buffer[14] = '\n';
uart_buffer[15] = 0;
printString("efg\n");
printString(uart_buffer);
}
这是串口程序的一部分,printString("abcd\n");和printString("efg\n");是我自己为了解串口自己加的,图片是串口调试助手的截图,hello是重启之后的内容,如果说abcd不输出是因为串口忙,那uart_buffer里面的内容为什么不从头输出,而是从uart_buffer[3]开始输出, uart_buffer[0]到uart_buffer[2]为什么不输出,如果把我加的两句去掉,输出正常,格式是T:23.06;L:1002,这是什么原因呢
-
我试了,一个程序里有一个串口输出语句的话,没有问题,有两个或是多个的话,输出的内容就和预期的不一样了,这是什么原因啊,有没有什么规定说是一个程序只能有一个串口输出语句啊
-
多谢楼主分享
-
谢谢分享
-
谢谢楼主分享:)
-
谢谢分享啊
-
买了:)
-
雪中送炭啊,谢谢楼主
-
谢谢楼主