welcom ! Handel home

2014年6月23日 星期一

ST32 Usart 掃描 AND 中斷法

[USART 掃描法 接收發射]
收發的方法:
 1.發送
void USART1_Puts(char *str){
    while(*str)  {
       USART_SendData(USART1, *str++);

       while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    }
}
//while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)  
//注意USART_FLAG_TXE(發送資料寄存器空標誌位元)
//不能改成USART_FLAG_TC(發送完成位)。
//否則有可能失去首字母。
USART1_Puts("hello-java~!\r\n"); //這樣就發送了hello-java~
C語言的printf不太一樣在於\n並沒有另起一行要用個\r這樣在終端上好看。
 2.接收
u8 uart1_get_data; //存放接受的內容
while1{
  if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)    {       
      uart1_get_data = USART_ReceiveData(USART1);
      USART1_Puts("\r\n
獲取到串口1資料:");
       USART1_Putc(uart1_get_data);
      USART1_Puts("\r\n");
    }
}
 =================================================================
[ UART 使用 中斷接收發射]
首先配置時鐘:For  USART2
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//USART2USART3都在在APB1上而USART1是在APB2上的
//設置GPIO:
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO |ENABLE);
    //A2 TX2
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
    //A3 RX2
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 //配置SUART2
 USART_InitTypeDef  USART_InitStructure;
 USART_ClockInitTypeDef  USART_ClockInitStructure;
 USART_StructInit(&USART_InitStructure);
 USART_ClockStructInit(&USART_ClockInitStructure);
 USART_ClockInit(USART2,&USART_ClockInitStructure);
 USART_Init(USART2,&USART_InitStructure);
 USART_Cmd(USART2, ENABLE);
 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//開啟SUART2的接收中斷同理還有【看圖】
然後中斷服務程式:這個自己在stm32f10x_it.c添加就可以了。

void USART2_IRQHandler(void){
 //接收中斷
    if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) {
         USART_ClearITPendingBit(USART2,USART_IT_RXNE);
         Uart2_Get_Data=USART_ReceiveData(USART2);
         Uart2_Get_Flag=1;

   }
 //溢出-如果發生溢出需要先讀SR,再讀DR寄存器則可清除不斷入中斷的問題
   if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET){
       USART_ClearFlag(USART2,USART_FLAG_ORE);  
//SR其實就是清除標誌
       USART_ReceiveData(USART2);   
 //DR
   }
}

然後在main裡檢測Uart2_Get_Flag

if(Uart2_Get_Flag)
  {
   Uart2_Get_Flag=0;
   USART2_Puts("\r\n2
獲取到串口2資料:");
   USART2_Putc(Uart2_Get_Data);
   USART2_Puts("\r\n");
  }
寫法就比較靈活了其實中斷實在是強大。

沒有留言: