int fputc(int ch,FILE *p) { USART_SendData(USART1,(u8)ch); while(USART_GetITStatus(USART1,USART_IT_TXE) != SET); return ch; }
今天學到printf實驗,結果跑半天就是不知道程序卡在哪個地方,比較板子的源碼發現,我的這兩個語句用錯了,雖然題目不是寫的是這個,但道理是一樣,所以解釋一下
USART_GetITStatus(USART1,USART_IT_TXE)
USART_GetFlagStatus(USART1,USART_FLAG_TXE
第一個是獲取中斷標志位,而我的程序並不是中斷服務函數,所以一直卡在這個循環上,而第二個只是單純處理完或者獲得標志位,和中斷無關,所以一定要記住其他的不是中斷的函數一定要使用第二個
若是在中斷服務函數中,則兩者並無區別,可以隨意替換
void USART1_IRQHander(void) { u8 r; if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET) { r = USART_ReceiveData(USART1); USART_SendData(USART1,r); while(USART_GetITStatus(USART1,USART_IT_TC) != SET); } USART_ClearITPendingBit(USART1,USART_FLAG_TC); }