实验4——串口实验

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
 
 int main(void)
 {		
 	u16 t;  
	u16 len;	
	u16 times=0;
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();			     //LED端口初始化
	KEY_Init();          //初始化与按键连接的硬件接口
 	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			printf("\r\n您发送的消息为:\r\n\r\n");
			for(t=0;t<len;t++)
			{
				USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}else
		{
			times++;
			if(times%5000==0)
			{
				printf("\r\n精英STM32开发板 串口实验\r\n");
				printf("正点原子@ALIENTEK\r\n\r\n");
			}
			if(times%200==0)printf("请输入数据,以回车键结束\n");  
			if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
			delay_ms(10);   
		}
	}	 
 }

NVIC_PriorityGroupConfig

第0组:所有4位用于指定响应优先级

第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

第4组:所有4位用于指定抢占式优先级

NVIC_PriorityGroup_0 => 选择第0组

NVIC_PriorityGroup_1 => 选择第1组

NVIC_PriorityGroup_2 => 选择第2组

NVIC_PriorityGroup_3 => 选择第3组

NVIC_PriorityGroup_4 => 选择第4组

USART_RX_STA&0x8000

if((USART_RX_STA&0x8000)==0)//接收未完成

if(USART_RX_STA&0x8000)//接收完成

最开始定义USART_RX_STA为0000 0000 0000 0000,0x8000为1000 0000 0000 0000
0&1为0,1&1为1
第十六位为0则串口数据没有接收完,为1则接收完了(中断里有判断)

USART_RX_STA&0x3fff;
0x3fff:0011 1111 1111 1111

这里我们设计了一个小小的接收协议:通过这个函数,配合一个数组 USART_RX_BUF[], 一个接收状态寄存器 USART_RX_STA(此寄存器其实就是一个全局变量,由作者自行添加。 由于它起到类似寄存器的功能,这里暂且称之为寄存器)实现对串口数据的接收管理。 USART_RX_BUF 的大小由 USART_REC_LEN 定义,也就是一次接收的数据最大不能超过 USART_REC_LEN 个字节。USART_RX_STA 是一个接收状态寄存器其各的定义如表 5.3.1.1 所 示在这里插入图片描述
设计思路如下: 当接收到从电脑发过来的数据,把接收到的数据保存在 USART_RX_BUF 中,同时在接收 状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由 2 个字节组成:0X0D 和 0X0A)的第一个字节 0X0D 时,计数器将不再增加,等待 0X0A 的到来, 而如果 0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到 0X0A, 则标记 USART_RX_STA 的第 15 位,这样完成一次接收,并等待该位被其他程序清除,从而开 始下一次的接收,而如果迟迟没有收到 0X0D,那么在接收数据超过 USART_REC_LEN 的时候, 则会丢弃前面的数据,重新接收.

(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET)

获取相应中断状态。当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄 存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这 个函数来判断到底是否是串口发送完成中断,方法是:
USART_GetITStatus(USART1, USART_IT_TC)
返回值是 SET,说明是串口发送完成中断发生。
其中

(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET)

等价于
(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
由于结果不是SET,则会继续循环发送,直到发送完毕

USART_RX_STA=0;

状态寄存器清空 ,即解析完之后清空接收标记(USART_RX_STA 置零)

TC 与 RXNE
判断读寄存器是否非空(RXNE),操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
我们要判断发送是否完成(TC),操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_TC);
RXNE(读数据寄存器非空)
当该位被置 1 的时候,就是提示已经有数据被接收到了,并 且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将 该位清零,也可以向该位写 0,直接清除。
TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如 果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR,写 USART_DR。2)直接向该位写 0。
在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我 们开启中断的方法是:
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断
我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: USART_ITConfig(USART1,USART_IT_TC,ENABLE);
USART_DR
STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是 一个双寄存器,包含了 TDR 和 RDR。
当向该寄存器写数据的时候,串口就会自动发送,当收 到数据的时候,也是存在该寄存器内。
STM32 库函数操作 USART_DR 寄存器发送数据的函数是:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 

通过该函数向串口寄存器 USART_DR 写入一个数据。
STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是:

uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 

通过该函数可以读取串口接受到的数据

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实验1r软件基本操作.docx是一份实验指导文档,其主要介绍了如何使用实验1r软件进行基本操作。 该文档中首先详细描述了实验1r软件的安装流程,让使用者能够顺利地将该软件安装到自己的计算机上。接着,文档介绍了该软件的主界面及其组成部分,使使用者能够对该软件的各个功能模块有一个初步的了解。 文档还介绍了如何创建新的实验,并详细讲解了实验的各种参数设置和数据输入方式。此外,文档还介绍了如何进行实验过程中的数据处理和图形绘制等高级功能,并提供了详细的操作步骤和示范。 最后,文档介绍了实验1r软件的一些高级特性和扩展功能,如如何编写自定义脚本和使用插件等,帮助使用者进一步发掘该软件的灵活性和实用性。 总的来说,实验1r软件基本操作.docx是一份详细、实用的实验指导文档,它对实验1r软件的各个操作模块进行了详细介绍,使使用者可以更加轻松地进行实验操作和数据处理。 ### 回答2: 实验1r软件基本操作.docx是一个介绍实验1r软件的基本操作的文档。该文档详细介绍了如何打开实验1r软件、创建项目、添加设备、添加感知器、添加动作器、写入程序、运行程序、调试程序、保存项目等基本操作步骤。 首先,文档介绍了如何打开实验1r软件,打开软件后可以看到软件的主界面,包括左侧的工程树、中间的画布区和右侧的属性栏。 接下来,文档介绍了如何创建项目,包括设置项目名称、设备类型和连接方式等。创建项目后,可以在工程树中看到项目的层级结构。 然后,文档介绍了如何添加设备。实验1r软件支持多种设备类型,包括Arduino、NodeMCU、Micro:bit等。添加设备后,可以在画布区中看到该设备的图标。 接着,文档介绍了如何添加感知器和动作器。实验1r软件支持多种感知器和动作器,包括LED、舵机、超声波传感器、温湿度传感器等。添加感知器和动作器后,可以在画布区中看到它们的图标。 文档还介绍了如何写入程序、运行程序和调试程序等基本操作步骤。写入程序后,可以通过串口监视器查看程序输出的结果。运行程序后,可以在实物设备上看到感知器和动作器的相应反应。调试程序可以帮助排查程序中的错误和bug。 最后,文档介绍了如何保存项目。保存项目后,可以在下次打开软件时继续进行开发。 总的来说,实验1r软件基本操作.docx详细地介绍了实验1r软件的基本操作步骤,对于初学者来说是非常有帮助的。 ### 回答3: 实验1r软件基本操作是一份关于实验室常用的实验工具软件——实验1r软件的使用指南。该文档详细地介绍了实验1r软件的基本操作方法,包括软件的启动、菜单栏和工具栏、设计面板、数据表面板、图形面板等主要功能模块的使用方法。 首先,该文档介绍了如何启动实验1r软件,并对菜单栏和工具栏进行了详细的讲解。菜单栏是实验1r软件的主要操作方式之一,可以通过菜单栏的各个选项来完成不同的操作,如添加元件、对电路进行分析等。同时,工具栏也提供了常用的工具按钮,可以快速地完成一些操作。 其次,该文档介绍了实验1r软件的设计面板,包括如何通过拖拽方式添加元件、连接元件、设置元件属性等。设计面板是实验1r软件的核心功能之一,通过在设计面板中添加元件可以完成不同类型的电路设计和仿真。 接着,该文档介绍了实验1r软件的数据表面板,可以查看和编辑元件的属性和数值。数据表面板可以方便地编辑元件参数,以及配置元件的初始状态和性能指标。 最后,该文档介绍了实验1r软件的图形面板,可以对电路进行仿真和输出结果。图形面板可以显示电路的电流、电压和功率等重要的信息,同时还可以根据用户需求输出不同格式的图像和数据结果。 总之,实验1r软件基本操作是一份非常实用的文档,对于电子类的科研人员和学生来说,阅读并熟练掌握该文档中介绍的实验1r软件基本操作方法,将对电路设计和仿真有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值