新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2020-7-1
- 在线时间
- 9 小时
|
1金钱
RT,最近要用STM8S串口做一个项目,用到串口,接收没问题,主要是发送,我就吶了闷,只要开了TXE的发送空中断,就直接往中断里冲了。先把代码贴上:
初始化:
GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_PU_NO_IT);
UART1_DeInit();
UART1_Init((u32)1200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_TXE, ENABLE);
UART1_Cmd(ENABLE);
中断处理函数:
static u8 i;
i++;
if(i==1) UART1_SendData8(0x11);
else if(i==2) UART1_SendData8(0x22);
else if(i==3) UART1_SendData8(0x33);
else if(i==4) UART1_SendData8(0x44);
else if(i==5) UART1_SendData8(0x55);
else if(i==6) UART1_SendData8(0x66);
else if(i==7) {UART1_ITConfig(UART1_IT_TXE, DISABLE);UART1_SendData8(0x77);}
初始化写完这么多后,发现程序直接往发送中断里跑了,找了半天,发现UART1->SR状态寄存器的最高位永远是1,在IAR中VIEW,REGISTER中看到,这个寄存器复位值为OXC0,但是后面我无论怎么改,诸如&=0X3F,这样,最高位还是为1,所以只要UART1_IT_TXE被设置为ENABLE了,就直接进发送中断。
按照我上面的中断写法,使用起来没什么问题。但是那个SR寄存器的最高位为什么一直是1,心理总是不舒服,就怕程序上有什么隐患,还望各位大佬帮分析分析,是不是我新手哪里有遗漏的。
补上:后来我直接在时钟初始化后加上UART1->SR&=0X3F,用断点查看,TC为0了,TXE仍然为1!!!!!!!草,OMG.........
|
|