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