STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理

这篇具有很好参考价值的文章主要介绍了STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

       本文主要介绍如何配置USART接收中断,使用乒乓缓存的设计接收数据并将其回显在PC 串口工具上。以stm32f10为例,配置USART1 9600波特率。具体配置参考上一章节STM32 寄存器配置笔记——USART配置 打印。

        乒乓缓存的设计应用场景:当后面的处理单元在工作期间,前面的 buffer 的内容不能被释放。或者,在处理单元工作期间, buffer 的特定地址的内容不止被访问一次。优点是相比全部写完再读的方式,可以节约读写时序。

二、中断优先级


       STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。即抢占优先级和响应优先级。

抢占
抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。

响应
响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。
 

三、配置流程

        1)使能RXNE中断

        接收缓冲区非空中断使能,通过MY_NVIC_init函数配置中断的抢占优先级和响应优先级为3(这里可以随意配置本章重点不在这)。最后一个参数表示分组为2。即有2位用来表示抢占优先级,2位用来表示响应优先级。

    USART1->CR1 |= 1 << 5;                                // enable RXNE interrupt 
	MY_NVIC_Init(3,3,USART1_IRQn,2);                      // 2bit PreemptionPriority 3 2bit SubPriority 3

stm32 usart1 接收缓存地址,stm32,笔记,嵌入式硬件,c语言

        2)编写串口中断函数

        USART1_IRQHandler是在启动文件里定义的只要有串口中断便会跑进来。查询状态寄存器USART_SR的RXNE位为1则表示收到数据可以读出。此时从USART_DR寄存器读取数据。

stm32 usart1 接收缓存地址,stm32,笔记,嵌入式硬件,c语言

stm32 usart1 接收缓存地址,stm32,笔记,嵌入式硬件,c语言

stm32 usart1 接收缓存地址,stm32,笔记,嵌入式硬件,c语言

stm32 usart1 接收缓存地址,stm32,笔记,嵌入式硬件,c语言

      三、乒乓缓存设计

         1)数据结构定义

typedef struct
{
    u8 USART_RX_BUF[USART_REC_LEN];
	u16 len;
} USART_DATA;

typedef struct
{
   USART_DATA stUartFifo[2];
   u8 curRecFifo;
} USART_HANDLE;

static USART_DATA *p_cur_Usart1_Handle = NULL;
static USART_DATA *p_cur_Data_ProcessingHandle = NULL;
static USART_HANDLE g_Usart1Handle;

uin16 needPro = 0;

        2)乒乓缓存初始化 

void init_usart_handle(void)
{
	memset((u8*)&g_Usart1Handle, 0, sizeof(USART_HANDLE));
    p_cur_Usart1_Handle = &g_Usart1Handle.stUartFifo[0];
}

        3)乒乓缓存接收

void USART1_IRQHandler(void)
{
    if(USART1->SR&(1<<5))
	{
		p_cur_Usart1_Handle->USART_RX_BUF[p_cur_Usart1_Handle->len++] = USART1->DR;
	}
}

         4)乒乓缓存切换

        这里是以每收到一帧完整帧的数据都是以0x0d 0x0a结尾的数据为例。收到一帧完整帧将当前乒乓缓存A切换为处理,乒乓缓存B切换为接收。

void change_curFifo(void)
{
    u16 len = p_cur_Usart1_Handle->len;
	if (len >= 2)
	{
		if (p_cur_Usart1_Handle->USART_RX_BUF[len - 2] == 0x0d 
			&& p_cur_Usart1_Handle->USART_RX_BUF[len - 1] == 0x0a)
		{
			printf("curFifo:%d len:%d\r\n", g_Usart1Handle.curRecFifo, len);
			p_cur_Data_ProcessingHandle = p_cur_Usart1_Handle;
			g_Usart1Handle.curRecFifo++;
			p_cur_Usart1_Handle = &g_Usart1Handle.stUartFifo[g_Usart1Handle.curRecFifo % 2];
			p_cur_Usart1_Handle->len = 0;
            needPro = 1;
		}

	}
}

        5)乒乓缓存处理

        打印接收内容。

void data_processing(void)
{
    if (needPro)
	{
        needPro = 0;
		p_cur_Data_ProcessingHandle->USART_RX_BUF[p_cur_Data_ProcessingHandle->len] = 0;
	    printf("func:%s dat:%s\r\n", __func__, p_cur_Data_ProcessingHandle->USART_RX_BUF);
	}
}

      6)调用如下

      主循环一直轮询是否需要切换乒乓缓存以及是否存在数据待处理。

stm32 usart1 接收缓存地址,stm32,笔记,嵌入式硬件,c语言文章来源地址https://www.toymoban.com/news/detail-828841.html

到了这里,关于STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【明解STM32】中断系统理论基础知识篇之中断寄存器功能原理

    目录 一、前言 二、寄存器概述 三、NVIC寄存器组 四、SCB寄存器组 五、中断屏蔽寄存器组 六、总结         在之前的STM32的中断系统理论基础知识之基本原理及NVIC中,分别中断的基本原理,中断的管理机制和中断的处理流程进行了较为详细的论述,读者通过全篇的阅读了

    2024年02月16日
    浏览(48)
  • 学习素材之USART篇——通过使用STM32与ESP8266(esp-01s)连接阿里云系列操作来了解USART协议和寄存器操作

    目录 USART详解 一、串口通讯协议简介 串口通讯的物理层 串口通讯的协议层 二、STM32 的 USART 简介 USART功能概述 功能引脚 三、与USART有关的寄存器 USART寄存器地址映像  四、USART寄存器描述 1、USART状态控制器(USART_SR) 2、数据寄存器(USART_DR) 3、波特比率寄存器(USART_BRR) 4、控

    2024年02月16日
    浏览(50)
  • 【STM32学习】定时器寄存器配置、功能工作过程详解

    STM32-定时器详解 STM32个人笔记-定时器 本文针对STM32F103系列单片机的定时器进行介绍。 主要是其常用功能的工作流程、以及寄存器的对应配置。 该图清晰的表明了各种定时器的参数与功能。其中,基础定时器基本上就只有最简单的计数到了然后触发中断的功能;通用和高级定

    2024年02月15日
    浏览(48)
  • STM32-串口通信波特率计算以及寄存器的配置详解

    处理器与外部设备通信的两种方式 并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信 传输原理:数据按位顺序传输 优点:占用引脚资源少 缺点:速度相对较慢 按照数据传送方向,分为: 单工 :数据传输只支持数据在一个方向上传输

    2024年02月05日
    浏览(99)
  • 野火霸天虎 STM32F407 学习笔记_2 寄存器介绍

    虽然正式编程没有必要用寄存器编程,通常都是库函数或者 hal 库。但是还是有必要学一下原理的。 寄存器映射 芯片视图如下。 丝印:芯片上印的信息。型号,内核,生产批次等。 引脚:左上角是有小圆点的,从左上-左下-右下-右上逆时针看。或者如果没有小圆点,把丝印

    2024年02月06日
    浏览(51)
  • 【DRV8323】电机驱动芯片寄存器配置指南,通过STM32F407的SPI通信配置

    笔者计划使用一块使用到STM32F407控制芯片与DRV8323s驱动芯片的板子,驱动BLDC。了解到需要使用SPI通信来配置DRV8323s驱动芯片,配置过程中涉及DRV8323数据手册中提及的几个寄存器,故写此文做个记录。 另外,DRV8323芯片和DRV8302、DRV8303、DRV8353都有极大的相似之处,可以相互参考

    2024年02月02日
    浏览(62)
  • stm32的BRR寄存器和BSRR寄存器

    1、BRR---   bit   RESET(置0)  register   //高16位无,低16位置1为0,不能写1 2 、BSRR---   bit   SET(设置1或0)       register   //低16位设置1为0 BSRR:用于低16位的作用是让指定的IO口置1;而高16位的作用是让指定的IO口置0。  

    2024年02月11日
    浏览(48)
  • STM32之寄存器

    在学习STM32之前有必要了解一下ARM架构,以下相关ARM架构的知识来自百度百科​:​ ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的

    2024年02月22日
    浏览(49)
  • STM32寄存器点亮LED灯

     这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮 那么我们得让 打开控制GPIOB5的时钟 让GPIOB5 输出模式 让GPIOB5低电平 时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。 看中文参考手册 系统架构 找到你的GPIO

    2024年02月07日
    浏览(53)
  • STM32 入门 —— 寄存器与 GPIO

    STM32 总线构图: 什么是寄存器 根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。简单来说,寄存器就是存放东西的东西,存放的东西是指令、数据或地址 存放数据的寄存器最容易理解,不同

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包