DMA串口接收中断实现数据存储与printf重定向

版权申诉
0 下载量 87 浏览量 更新于2024-11-07 收藏 5.09MB ZIP 举报
资源摘要信息:"该文件内容涉及如何使用直接内存访问(DMA)技术实现串口接收中断的功能。在这个过程中,DMA用于直接将接收到的数据存储到内存中,而不需要CPU的介入。这对于提高数据传输效率、减轻CPU负担非常有帮助。此外,文件还提到了将C语言标准输出函数printf重定向到USART1的操作方法,使得可以直接使用printf函数将单片机的数据输出到PC端的串口调试助手或超级终端中,极大地简化了程序调试和数据监控的过程。" 知识点一:DMA(直接内存访问)技术 DMA是一种允许外设和主内存之间直接进行数据交换的技术,无需CPU参与数据的读写过程。它提高了数据传输的效率,因为它可以在CPU处理其他任务的同时,独立地执行内存数据的搬运工作。DMA通常用于高速数据传输,比如硬盘、网络接口卡、视频采集卡等设备的数据传输过程。 知识点二:串口接收中断 串口接收中断是指当串口接收到数据时,单片机会停止当前正在执行的任务,转而执行一个中断服务程序来处理接收到的数据。这是微控制器处理串口通信的一种常见方法,可以实现边接收数据边执行其他任务的能力。在本例中,通过DMA实现的串口接收中断可以无需CPU介入地完成数据接收,进一步提高系统的响应速度和效率。 知识点三:printf函数的重定向 在嵌入式系统编程中,重定向printf函数是一个常见的操作,它使得原本输出到控制台的函数数据能够输出到其他设备,例如串口。在这个案例中,printf函数被重定向到USART1串口,意味着我们可以直接使用printf函数输出数据,而这些数据会通过串口发送到PC端的串口调试助手或超级终端。这对于程序调试非常有用,因为它允许开发者在不使用其他专门调试硬件的情况下,通过标准输出来监控程序运行情况和数据流。 知识点四:超级终端或串口调试助手 超级终端和串口调试助手是常用于串口通信调试的软件工具。它们能够显示从串口接收的数据,允许用户发送数据到串口,并且提供了一系列的调试功能,如数据捕获、数据分析等。在这个案例中,通过将printf函数重定向到USART1串口,开发者可以在超级终端或串口调试助手的界面上实时查看程序输出的信息,这大大简化了调试过程,提高了开发效率。 知识点五:文件名称列表的含义 文件名称“4.DMA_DEMO_RXNE”指明了这个Demo(演示程序)的功能和目的。其中“4”可能是用来区分不同的演示程序或者表示某种顺序,“DMA_DEMO_RXNE”表明这个程序是关于DMA的演示,特别关注了接收数据不为空(RXNE)的情况,这在处理串口通信时是一个重要的状态标志,表示接收到的数据可以被读取。 通过这些知识点,我们可以了解到如何利用DMA技术优化串口通信的数据接收过程,并且通过软件工具简化嵌入式系统开发中的调试工作。
2023-07-23 上传
2023-07-24 上传
2023-07-15 上传

void uart_init(u32 bound) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 }

2023-07-23 上传

请帮我解释一下下面这串代码”#include "sys.h" #include "delay.h" #include "usart.h" int main(void) { GPIO_SetBits(GPIOC, GPIO_Pin_13); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//复用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); //这行代码的作用是将初始化结构体 GPIO_InitStructure 中配置的参数应用到 GPIOA 引脚上,以完成引脚的初始化设置。 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); USART_InitTypeDef USART_InitStructure; //USART 是一种常见的串行通信接口,用于实现与外部设备或其他单片机之间的数据传输。 NVIC_InitTypeDef NVIC_InitStructure; USART_InitStructure.USART_BaudRate=9600; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Cmd(USART2,ENABLE); USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//用于配置 USART 模块的中断功能。 USART_Init(USART2, &USART_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART2,ENABLE); while(1) { } } void USART2_IRQHandler(void) { char Res; if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) //接收中断 { Res =USART_ReceiveData(USART2); //读取接收到的数据 if(Res=='a') { GPIO_ResetBits(GPIOC, GPIO_Pin_13); } if(Res=='b') { GPIO_SetBits(GPIOC, GPIO_Pin_13); } } USART_ClearITPendingBit(USART2,USART_IT_RXNE); } “

2023-07-24 上传