stm32—普通串口(接收查询和中断相结合)

                                                                                                               串口实验

                     1. 在做任何实验之前都是将目标文件导入库文件,然后在main函数中导入头文件,在FWLIB中写入路径,当然串口也不例外

                                                                  

                           2.导入文件之后第二步也都是端口初始化(初始化里面语句的作用已经在后面说明)

                            

                                     在初始化完成之后,记得在main函数中调用

                                  3.用串口发送数据

                                   

                                   利用USART_SendData(USART1,'9');来发送一个字节的数据,printf();也可使用来发送字符串,在使用printf的时候记得给main()函数添加

                                  #include"stdio.h"的头文件不然会报错的,当然,之前在C语言的学习知识也可以运用到项目中来,因为这本来就是用C语言写的

                                 4.给串口发送数据,让串口接收并且显示到串口上有两种方式

                                   (1)查询方式

                                       

                                     第一条语句是检测是否把数据发送完毕,没有就继续等待

                                     第二条语句是从串口接收数据USART_ReceiveData(USART1),然后赋值给我们定义的变量USART1_RE

                                     第三条语句是将接收到的数据加一然后输出USART_SendData()

                                   (2)中断方式

                                           

                                  当然,在写入任何方式之前都需要将端口初始化中将USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启串口接收中断

                        

                       串口工具的推荐

                       

                        下面的更为简单使用

                             

                          

                                   

                    


STM32F4 系列中,串口接收不定长数据可以采用空闲中断和 DMA 相结合的方式来实现,其主要流程如下: 1. 配置串口3的接收缓冲区大小和波特率等参数。 2. 配置串口3的空闲中断,当串口接收到数据后触发中断,并将接收到的数据存储到接收缓冲区中。 3. 配置 DMA,将串口3的数据传输到内存中,使用循环模式,不断接收数据。 4. 在空闲中断中,判断是否接收到了完整的数据包,如果接收到了完整的数据包,则可以对数据进行处理;否则继续等待下一个数据包。 下面是实现该功能的代码示例,供参考: ``` // 定义串口接收缓冲区大小 #define RX_BUF_SIZE 256 // 定义串口接收缓冲区 uint8_t rx_buf[RX_BUF_SIZE]; // 定义 DMA 缓冲区 uint8_t dma_buf[RX_BUF_SIZE]; // 定义 DMA 传输完成标志 volatile uint8_t dma_transfer_complete = 0; // 串口空闲中断处理函数 void USART3_IRQHandler(void) { // 判断是否为接收空闲中断 if (USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) { // 清除接收空闲中断标志位 USART_ClearITPendingBit(USART3, USART_IT_IDLE); // 关闭 DMA 传输 DMA_Cmd(DMA1_Stream1, DISABLE); // 计算接收到的数据长度 uint16_t len = RX_BUF_SIZE - DMA_GetCurrDataCounter(DMA1_Stream1); // 处理接收到的数据 process_data(rx_buf, len); // 重启 DMA 传输 DMA_Cmd(DMA1_Stream1, ENABLE); } } // DMA 传输完成中断处理函数 void DMA1_Stream1_IRQHandler(void) { // 判断是否为传输完成中断 if (DMA_GetITStatus(DMA1_Stream1, DMA_IT_TCIF1) != RESET) { // 清除传输完成中断标志位 DMA_ClearITPendingBit(DMA1_Stream1, DMA_IT_TCIF1); // 设置 DMA 传输完成标志 dma_transfer_complete = 1; } } // 初始化函数 void init(void) { // 初始化串口3 USART_InitTypeDef usart_init; USART_StructInit(&usart_init); usart_init.USART_BaudRate = 115200; USART_Init(USART3, &usart_init); // 配置串口3空闲中断 USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); NVIC_EnableIRQ(USART3_IRQn); // 配置 DMA DMA_InitTypeDef dma_init; DMA_StructInit(&dma_init); dma_init.DMA_Channel = DMA_Channel_4; dma_init.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR; dma_init.DMA_Memory0BaseAddr = (uint32_t)dma_buf; dma_init.DMA_DIR = DMA_DIR_PeripheralToMemory; dma_init.DMA_BufferSize = RX_BUF_SIZE; dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable; dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable; dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; dma_init.DMA_Mode = DMA_Mode_Circular; dma_init.DMA_Priority = DMA_Priority_VeryHigh; dma_init.DMA_FIFOMode = DMA_FIFOMode_Disable; dma_init.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; dma_init.DMA_MemoryBurst = DMA_MemoryBurst_Single; dma_init.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA1_Stream1, &dma_init); // 配置 DMA 传输完成中断 DMA_ITConfig(DMA1_Stream1, DMA_IT_TC, ENABLE); NVIC_EnableIRQ(DMA1_Stream1_IRQn); // 启动 DMA 传输 DMA_Cmd(DMA1_Stream1, ENABLE); } int main(void) { // 初始化 init(); while (1) { // 等待 DMA 传输完成标志被设置 while (!dma_transfer_complete); // 复制数据到接收缓冲区 memcpy(rx_buf, dma_buf, RX_BUF_SIZE); // 清除 DMA 传输完成标志 dma_transfer_complete = 0; } } ``` 相关问题: 1. 如何配置 STM32F4 的串口3接收缓冲区大小和波特率等参数? 2. 如何配置 STM32F4 的空闲中断? 3. 如何配置 STM32F4 的 DMA?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值