STM32串列埠中斷接收和中斷髮送
阿新 • • 發佈:2019-01-07
STM32串列埠USART1中斷接收和中斷髮送
先貼出中斷函式:
void USART1_IRQHandler(void){ if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_RXNE); USART1_Buffer[i++]=USART_ReceiveData(USART1); //USART1_Buffesh是一個自己定義的接收陣列 if(i>3){ SendFlag = 1; } } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){ //USART_IT_TC這裡也可替換 if(Open_Send_Flag){ //這是一個傳送的標誌 uart1_sendstring(temp_data); USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC Open_Send_Flag = 0; } else{ USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC } } }
傳送字串的函式:
void uart1_sendstring(uint8_t* cp)
{
while((*cp)!='\0')
{
Usart1_Send_isr(*cp);
cp++;
}
}
傳送單個字元的函式:
void Usart1_Send_isr(uint8_t ch){ USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //這裡做緩衝區是否傳送完判斷 }
然後在中斷函式外面傳送資料的時候,打開發送中斷。USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //USART_IT_TC
之後再貼出兩個簡單的串列埠接收和傳送的測試小例子:
第一種:中斷接收並把接收到的資料直接傳送。
void USART1_IRQHandler(void){ unsigned char RxData; if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_RXNE); RxData=USART_ReceiveData(USART1); RxData = RxData + 1; USART_SendData(USART1,RxData); } }
優點:簡單,適合很少量資料傳輸。
缺點:無快取區,並且對資料的正確性沒有判斷,資料量稍大可能導致資料丟失 。 第二種:中斷接收之後判斷資料頭和資料尾,如果正確就直接傳送出去。
void USART1_IRQHandler(void){
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART1_Buffer[i++]=USART_ReceiveData(USART1);
}
if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){
Flag = 1;
}
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){ //溢位,不明白?
USART_ClearFlag(USART1,USART_FLAG_ORE);
USART_ReceiveData(USART1);
}
if(Flag){
for(j = 0;j<20;j++){
USART_SendData(USART1,USART1_Buffer[j]);
}
}
}