设为首页 加入收藏

TOP

stm32串口通信实验,一点笔记(二)
2019-09-01 23:09:35 】 浏览:55
Tags:stm32 串口 通信 实验 一点 笔记
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博客 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Linux下1号进程的前世(kernel_ini.. 下一篇启动期间的内存管理之初始化过程..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目