在线时间0 小时
UID316192
注册时间2011-9-2
NXP金币0
该用户从未签到
新手上路

- 积分
- 130
- 最后登录
- 1970-1-1
|
发表于 2012-10-8 22:33:18
|
显示全部楼层
回复:接受中断连续进入两次,k60 UART3
回复第 8 楼 于2012-10-08 17:34:34发表:
回复第 7 楼 于2012-10-08 14:47:00发表:
回复第 6 楼 于2012-10-08 14:35:57发表:
刚才仔细查了一下datasheet,发现要清除RDRF标志,是要有顺序限制的,一定要查询S1的RDRF位,再读取data寄存器。只有这样的顺序才能成功清除RDRF标志,如果像我以前那样,不查询就直接读取数据寄存器的值是能不能清除RDRF标志的,如果程序这样
void UART3_IRQHander(void)
{
uint8 RxCh = 0;
RxCh = UART_D_REG(UART3_BASE_PTR); //取出接受的数据
printf("uart接收到%d\n",RxCh);
//UART_S1_REG(UART3_BASE_PTR) |= UART_S1_RDRF_MASK; //不加这句的话,printf就一直不停地打印。加上这句的话,每接受一次printf打印两次。
}
因为没有成功的清除RDRF,所以会一直产生中断,所以才会一直不停地打印数据,至于加上那条给RDRF置1的语句之后,就每次接到数据就中断两次,打印两次的原因,暂时还没有想明白。
你加了这句话相当于进两次中断清除一次标志位
我也是这么想的,第一次中断操作了状态寄存器,在第二个中断中操作了数据寄存器,这样两次中断,完成了清除标志位的操作。datasheet上说先读状态寄存器,再操作数据寄存器,完成清除标志位。从我两次进中断的情况来看,先写状态寄存器,再操作数据寄存器同样也能清除标志位。像这样
void UART3_IRQHander(void)
{
uint8 RxCh = 0;
UART_S1_REG(UART3_BASE_PTR) |= UART_S1_RDRF_MASK;
RxCh = UART_D_REG(UART3_BASE_PTR); //取出接受的数据
printf("uart接收到%d\n",RxCh);
}
你理解的还是不对,UART的状态寄存器是只读的,你怎么能进行写操作呢?UART_S1_REG(UART3_BASE_PTR) |= UART_S1_RDRF_MASK; 这句话其实执行的就是读了一下状态寄存器,根本没有写的作用。所以第一次中断从这开始,到第二次中断操作数据寄存器完成一个清除中断标志位。 |
|