最近在看国芯的一个串口中断问题。
串口发送完成中断和接收中断是这样写的。
寄存器描述是这样的:
发送完成和接收完成中断,写1清除。
乍一看,上面的中断处理函数写的应该没问题,但其实这样写是有隐患的。
先来看段程序:
可以看到简单一个位操作,在汇编中是4段语句,
可以看到是r3寄存器中保存的是UART_TCR的地址,之后将第四个字节的值放在r2寄存器上,
orr r2, r2, #64,为置1 DTFTFF位, strb r2, [r3, #3] 为回写到寄存器中,注意改变是仅仅是DTFTFF位,将其置1。
因为发送完成标志和接收标志是在同一个寄存器,一个寄存器地址是4字节,恰好DRFRFE、DTFTFF,在29、30bit在同一字节,但是这时如果DRFRFE也被硬件置为1了,则因为前面的orr r2, r2, #64中,导致r2寄存器回写的过程也将DRFRFE置为1,手动清除中断了,导致接收中断无法进入。
那怎么解决这个问题了,芯片厂家提出了W1C的概率:
写1清除,
我只需要整体去操作寄存器就行: