IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32串口中断接收实验 -> 正文阅读

[嵌入式]STM32串口中断接收实验

STM32串口中断接收实验的详细说明

准备

材料:STM32F407ZGT6最小系统板,串口1通过跳线帽连接到了CH340上。
在这里插入图片描述

需求:从电脑向板子的串口1发送一个字符串(以回车和换行结尾,字符串末尾两个字符为0x0d和0x0a),板子接收到之后原样返回给电脑。

思路:用串口的接收中断实现。

代码实现

后台执行内容:
当判断接收完毕后,将存放在字符数组里的字符用循环的方式发送出去。

后台时刻检查变量STA的bit15的状态决定要不要发送数据。

大部分时候后台仅仅运行闪灯的那一部分。

int main()
{
	u8 i=0; 
	u16 t=0;
	u16 len=0;
	uint8_t s[10];
	
	SysTick_Init(168);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	USART1_Init(115200);
	LED_Init();
	LED2=0;
	printf("初始化配置完成\r\n");
	
	while(1)
	{
		/*外层先检查15位的状态是0还是1,*/
		if(USART1_RX_STA&0x8000)//如果接收到了0x0a,表明字符串接收结束
		{					   
			len=USART1_RX_STA&0x3fff;//得到此次接收到的数据长度
			for(t=0;t<len;t++)
			{
				USART_SendData(USART1, USART1_RX_BUF[t]);         //向串口1发送数据
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}
			USART1_RX_STA=0;//将STA清0,以便接收下一个字符串
		}
		/*红灯闪烁指示后台程序的运行情况*/
		LED1=!LED1;
		delay_ms(500);
	}
}

前台执行内容:
用一个16位的变量来计数,同时由于字符串长度不可能达到16383个字符,故变量STA的bit15、bit14永远都是用不到的。

STA计数的作用一是发送数据是一次发送一个字符,要知道发送多少次;二是储存时要按下标存到数组的对应位置。

那么对STA的前两位进行操作时必然会影响到STA整体的值,是否存在问题呢?
不会!发送数据与储存数据均是只提取STA的低14位,在16383之内STA的自增只影响这14位数据。

/*一个16位整数从0自增到16383都不会用到15位与16位,可以按接收的字符情况对前两位进行标记。*/
//bit15,	接收完成标志
//bit14,	接收到0x0d
//bit13~0,	接收到的有效字节数目
//回车换行为0x0d,0x0a
u16 USART1_RX_STA=0;       //接收状态标记,初始16位全部为0

串口每接收一个字符就进入中断一次,对于每一字符来讲都可能有3种情况:有效数据、0x0d、0x0a。先检查15位的状态是0还是1,再检查14位的状态是0还是1,最后对这一次接收的数据进行比对并对相应位进行置1标记或者写入数组操作。

每次接收到字符前台也会检查STA的bit15的状态。

前台的程序执行由硬件层面引发,当串口接收到数据就触发中断,执行中断服务程序里面的内容。这里面会对外界的输入进行检查判断,在合适的时机对一个全局变量USART1_RX_STA进行操作。而后台会时刻检测这个变量。这样就建立起前后台的联系。

/*串口每接收一个字符就进入中断一次*/
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 r;
	u16 i=0;
	
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //判断中断类型是不是接收中断
	{
		r =USART_ReceiveData(USART1);  //读取接收到的数据
		/*外层先检查bit15的状态是0还是1*/
		if((USART1_RX_STA&0x8000)==0)//如果SAT的bit15是1
		{
			/*中间层检查bit14的状态是0还是1*/
			if(USART1_RX_STA&0x4000)//如果STA的bit14是1
			{
				/*里层判断这一次接收到的字符并执行相应的操作*/
				if(r!=0x0a)//如果这一次接收到的不是0x0a
					USART1_RX_STA=0;//接收错误,将STA重置0
				else USART1_RX_STA|=0x8000;	//否则接收完成,将15位置1(后台检测到这个变量的bit15的变化会立马执行if里的内容,这一句建立了前台与后台的联系)
			}
			else //如果STA14位是0
			{	
				/*里层判断这一次接收到的字符并执行相应的操作*/
				if(r==0x0d)//如果这一次是0x0d
					USART1_RX_STA|=0x4000;//将14位置1
				else//如果这一次也不是0x0d,表明接收到的是有效数据
				{
					USART1_RX_BUF[USART1_RX_STA&0X3FFF]=r;//将本次接收的字符存到数组里,位置由STA的前14位决定
					USART1_RX_STA++;//接收到有效数据的个数
					if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}
	} 
} 	

总结

从下午看到晚上才搞懂,花了我这么多时间,算是正式开始单片机之旅了。还是太菜了,万里长征第一步,迈出去就好了。写个博客纪念一下。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-05 20:25:18  更:2021-07-05 20:25:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 12:57:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码