[USART 掃描法 接收發射]
收發的方法:
1.發送
void USART1_Puts(char *str){
while(*str) {
USART_SendData(USART1, *str++);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}
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; //存放接受的內容
while(1){
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");
}
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);
//USART2和USART3都在在APB1上而USART1是在APB2上的
//USART2和USART3都在在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);
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);
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_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_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
}
}
//接收中斷
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");
}
{
Uart2_Get_Flag=0;
USART2_Puts("\r\n2獲取到串口2資料:");
USART2_Putc(Uart2_Get_Data);
USART2_Puts("\r\n");
}
寫法就比較靈活了其實中斷實在是強大。
沒有留言:
張貼留言