NVIC_IRQChannel=USART1_IRQn;//串口1中断通道
68 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能中断通道
69 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
70 NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
71
72 NVIC_Init(&NVIC_InitStructure);
73
74 #endif
75
76 }
77
78 /*串口1中断服务函数,接收到一个数据就产生一次中断,当接收到两次数据为0X0D和OXOA时,
79 USART_RX_STA最高位置1,此时main函数while循环执行。*/
80
81 void USART1_IRQHandler(void)
82 {
83 u8 Res;
84 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)//接收中断
85 {
86 Res=USART_ReceiveData(USART1);
87 if((USART_RX_STA&0x8000)==0)
88 {
89 if(USART_RX_STA&0x4000)
90 {
91 if(Res==0x0a)
92 {
93 USART_RX_STA|=0x8000;//将bit15位置1,此时main函数while循环里面的判断生效。
94 }
95 else
96 {
97 USART_RX_STA=0;//上一次标志位bit14置1,此次数据不为0x0a,说明输入错误,只有整段数据末尾为0x0d,0x0a数据才有效。
98 }
99 }
100 else
101 {
102 if(Res==0x0d)
103 {
104 USART_RX_STA|=0x4000;}//这次数据为0x0d,将bit14位置1。
105 else
106 {
107 USART_RX_STA++;
108 USART_RX_BUF[USART_RX_STA]=Res;
109
110 if(USART_RX_STA >USART_REC_LEN-1) //如果接收到的长度大于规定的长度,说明发送错误,状态清零。
111 USART_RX_STA=0;
112 }
113 }
114 }
115 }
116 }
117 #endif
三、main.c
头文件
定义参数t,len(发送长度),times(时间参数)
设置系统中断优先级分组2
初始化延时、串口(波特率)
while(1)
{
if判断USART_RX_STA的Bit15位是否 为1,若是意味发送完成。
{
数据长度赋给len
for(0;t<len,t++)
{
将USART_RX_BUF[t]数组一个个通过串口1发送回数据
whilewhile(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);一直轮询,直到当前数据发送完
}
当所有数据发送完成后,USART_RX_STA置0
}
else
打印提示内容
}
1 #include"stm32f4xx.h"
2 #include "usart.h"
3 #include "delay.h"
4 #include "sys.h"
5
6
7 int main()
8 {
9 u8 t;
10 u8 len=0;
11 u16 times;
12 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组2
13 delay_init(168);
14 uart_init(115200);
15
16 while(1)
17 {
18
19 if(USART_RX_STA&0x8000)
20 {
21 printf("\r\n您打印的消息为:\r\n");
22 len = USART_RX_STA&0x3fff; //接收到此次接收到的数据长度
23 for(t=0;t<len;t++)
24 {
25 USART_SendData(USART1,USART_RX_BUF[t]); //将单片机接收到的数据发送回电脑
26 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); //获取发送的状态,轮询直到这一条数据发送成功
27 }
28 printf("\r\n\r\n"); //插入换行
29 USART_RX_STA =0;
30 }
31 else
32 {
33 times++;
34 if(times%5000==0)
35 {
36 printf("\r\nALIENTEK 探索者STM32F407开发板 串口实验\r\n");
37 38 }
39 if(times%200==0)printf("请输入数据,以回车键结束\r\n");
40 delay_ms(10);
41 }
42 }
43 }
其中
USART_GetFlagStatus(main.c用到)和USART_GetITStatus(usart.c用到),敲代码容易弄混,
USART_GetFlagStatus是在没有使能相应的中断函数时,通常使用该函数来判断标志位是否置位。
USART_GetITStatus则相反,参考关于STM32的USART_GetFlagStatus和USART_GetITStatus解析(异步通信) - CSDN博客