如果采用查詢接收方式接受串口數據,就會造成接收不及時,還沒接收完數據,下一個數據就發(fā)過來了,就會把上一個數據覆蓋了,造成數據丟失。所以可以通過中斷去接收數據,開啟接收中斷。而發(fā)送數據,是我們自己決定的,只要調用函數就可以了,不需要開啟中斷。
要串口接收數據,需要在昨天串口發(fā)送數據的基礎上,再設置中斷接收函數。接收數據的中斷時間有準備好讀取接收到的數據、檢測到空閑線路,事件標志分別為RXNE、IDLE。對應狀態(tài)寄存器(USART_SR)的位5和位4。相應的使能控制位RXNEIE、IDLEIE在控制寄存器 1 (USART_CR1)的位5和位4。
根據寄存器配置中斷
//設置中斷
USART1- >SR = 0; //清中斷標志
//外設中斷
USART1- >CR1 |= 1< 5; //開接收中斷
USART1- >CR1 |= 1< 4; //開空閑中斷
//nvic
prigroup = NVIC_GetPriorityGrouping(); //得到優(yōu)先級分組
priority = NVIC_EncodePriority(prigroup,1,2); //優(yōu)先級編碼
NVIC_SetPriority(USART1_IRQn,priority); //設置中斷優(yōu)先級
// //
// NVIC- >ISER[EXTI2_IRQn/32] = 1< (EXTI2_IRQn%32);
NVIC_EnableIRQ(USART1_IRQn); //使能USART1中斷
接著就是中斷函數來接收并處理得到的數據。需要標志判斷是否進入接收中斷,還要設置一個一定長度的數組保存數據寄存器的數據。
中斷函數
u8 Usart1_buf[USART1_BUF_SIZE] = {0}; //定義數組保存數據
u8 Usart1_OK = 0; //接收數據標志位
void USART1_IRQHandler()
{
static u16 cnt = 0;
if((USART1- >SR & (1< 5)) != 0) //接收中斷
{
Usart1_buf[cnt] = USART1- >DR; //把數據寄存器的值保存到數組中
cnt++;
if(cnt == USART1_BUF_SIZE - 1) //判斷數組是否裝滿
{
Usart1_buf[cnt] = '?';
Usart1_OK = 1; //接收數據標志
cnt = 0;
}
}
else if((USART1- >SR & (1< 4)) != 0) //空閑中斷
{
Usart1_buf[cnt] = '?';
Usart1_OK = 1; //接收數據標志
cnt = 0;
}
else
USART1- >SR = 0;
}
主函數
#include "stm32f4xx.h"
#include "usart.h"
#include "stdio.h"
#include "string.h"
int main()
{
Usart1_Init(9600);
while(1)
{
if(Usart1_OK == 1)
{
Usart1_OK = 0;
if(strcmp((const char *)Usart1_buf,"Hello!") == 0)//判斷接收到的數據
Usart1_SendStr("Hi!rn");
else
Usart1_SendStr("What do you say?rn");
}
}
}
在昨天發(fā)送程序的基礎上,再加上以上程序,就可以進行中斷接收數據了。其中string.h頭文件中,有很多函數可以處理字符串,可以用來方便地處理串口接收的數據。
最后編譯完燒入程序,從串口發(fā)送數據到STM32,達到預期效果,串口中斷接收就成功了。
-
處理器
+關注
關注
68文章
19435瀏覽量
231306 -
STM32
+關注
關注
2273文章
10926瀏覽量
357767 -
數據寄存器
+關注
關注
0文章
33瀏覽量
7799 -
串口中斷
+關注
關注
0文章
67瀏覽量
14019 -
狀態(tài)寄存器
+關注
關注
0文章
39瀏覽量
7154
發(fā)布評論請先 登錄
相關推薦
評論