STM32串口USART1中斷接收和中斷髮送

  先貼出中斷函數:

  

[plain] view plain copy
  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
  }
  }
  }

  

  發送字符串的函數:

  

[plain] view plain copy
  void uart1_sendstring(uint8_t* cp)
  {
  while((*cp)!='\0')
  {
  Usart1_Send_isr(*cp);
  cp++;
  }
  }

  

  發送單個字符的函數:

  

[plain] view plain copy
  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

  之後再貼出兩個簡單的串口接收和發送的測試小例子:

  第一種:中斷接收並把接收到的數據直接發送。

  

[plain] view plain copy
  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);
  }
  }

  

  優點:簡單,適合很少量數據傳輸。

  缺點:無緩存區,並且對數據的正確性沒有判斷,數據量稍大可能導致數據丟失 。

  第二種:中斷接收之後判斷數據頭和數據尾,如果正確就直接發送出去。

  

[plain] view plain copy
  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]);
  }
  }
  }

  

  相關的stm32串口以及中斷相關的資料

  (stm32串口應用)

  http://www.makeru.com.cn/live/1392_1164.html?s=45051

  基於STM32講解串口操作

  http://www.makeru.com.cn/live/1758_490.html?s=45051

  stm32之SPI通信

  http://www.makeru.com.cn/live/3523_1795.html?s=45051

  STM32中斷系統

  http://www.makeru.com.cn/live/3523_1745.html?s=45051


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章