STM32_串口的DMA接收

2023-05-16

  STM32使用DMA在串口接收数据的方法如下:

#define DMA_Rec_Len 200

u8 DMA_Rece_Buf[DMA_Rec_Len] = {0};

void uart2_init ( u32 bound ) {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;
    RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA, ENABLE );
    RCC_APB1PeriphClockCmd ( RCC_APB1Periph_USART2, ENABLE );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init ( GPIOA, &GPIO_InitStructure );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init ( GPIOA, &GPIO_InitStructure );
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init ( &NVIC_InitStructure );
    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    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 ( USART2, &USART_InitStructure );
    USART_ITConfig ( USART2, USART_IT_TC, DISABLE );
    USART_ITConfig ( USART2, USART_IT_RXNE, DISABLE );
    USART_ITConfig ( USART2, USART_IT_IDLE, ENABLE ); // 开启空闲中断
    USART_DMACmd ( USART2, USART_DMAReq_Rx, ENABLE ); // 使能串口2的DMA接收
    USART_Cmd ( USART2, ENABLE );
    RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1, ENABLE );
    DMA_DeInit ( DMA1_Channel6 );
    DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) &USART2->DR;
    DMA_InitStructure.DMA_MemoryBaseAddr = ( u32 ) DMA_Rece_Buf;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // 数据传输方向,即从外设读取数据发送到内存
    DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len; // DMA通道的DMA缓存的大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址寄存器不变
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址寄存器递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 数据宽度为8位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 数据宽度为8位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 工作在正常缓存模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // DMA通道拥有高优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMA通道没有设置为内存到内存传输
    DMA_Init ( DMA1_Channel6, &DMA_InitStructure );
    DMA_Cmd ( DMA1_Channel6, ENABLE );
}

void USART2_IRQHandler ( void ) {
    u16 Usart2_Rec_Cnt = 0;

    if ( USART_GetITStatus ( USART2, USART_IT_IDLE ) != RESET ) {
        USART2->SR;
        USART2->DR; // 清USART_IT_IDLE标志
        DMA_Cmd ( DMA1_Channel6, DISABLE );
        // USART_ClearITPendingBit ( USART2, USART_IT_IDLE ); // 清除中断标志
        // 计算接收到的数据帧长度
        Usart2_Rec_Cnt = DMA_Rec_Len - DMA_GetCurrDataCounter ( DMA1_Channel6 );
        // printf ( "The length is %d\r\n", Usart2_Rec_Cnt );
        // printf ( "The data is %s", DMA_Rece_Buf );
        DMA_SetCurrDataCounter ( DMA1_Channel6, DMA_Rec_Len );
        DMA_Cmd ( DMA1_Channel6, ENABLE );
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32_串口的DMA接收 的相关文章

  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • ros c++ 开发错误“集锦”

    集锦 xff0c 才能经常回放 1 error s getMD5Sum is not a member2 ROS datatype md5sum错误 持续更新 1 error s getMD5Sum is not a member 目前观测
  • 嵌入式ARM算法移植与优化

    目录 一 算法优化指导思想 1 算法优化基本原则 2 算法优化方法 二 编译器优化 1 xff0c 函数内联 2 xff0c 消除公共子表达式 3 xff0c 循环展开 4 xff0c GCC优化选项 5 xff0c ARMCC优化选项 三
  • OV2640摄像头驱动与应用代码

    目录 一 摄像头基础 1 1 OV2640参数 1 2 视场角与镜头 二 OV2640驱动 三 OV2640视频接入
  • ubuntu16.04常用软件安装

    目录 1 办公软件 xff1a WPS 2 文本比较工具 Meld 3 版本管理 xff1a git 4 安装wine 5 安装常用库 6 配置阿里源 7 vim 8 OpenCV 9 QT 10 VSCode 11 gparted 1 办
  • RK1109 NPU算法测试demo

    目录 一 矩阵乘法测试 二 测试结果 一 矩阵乘法测试 通过一个简单的矩阵乘法 xff0c 和L2距离计算来测试NPU计算性能与启动NPU的一般方法 具体代码如下 xff1a Example Calculate x y 2 using Ma
  • VS2015远程连接虚拟机

    目录 一 安装VC Linux exe 二 打开VS 选择新建项目 三 配置VS 四 创建项目 一 安装VC Linux exe 下载地址 xff1a 二 打开VS 选择新建项目 三 配置VS 打开VS xff0c 菜单栏点击工具 gt 选
  • MiniFly微型四轴学习与开发日志(四)

    文章目录 任务创建和删除 API 函数任务调度器开启函数分析临界区atkp c 任务创建和删除 API 函数 FreeRTOS 最基本的功能就是任务管理 xff0c 而任务管理最基本的操作就是创建和删除任务 xff0c FreeRTOS 的
  • Git常用命令

    目录 一 提交代码 二 更新本地代码 三 修改项目中Git远程仓库地址 1 开启Git Bash 2 查看git远程仓库地址 3 修改远程仓库地址 4 检查新地址 Git常用命令备忘 一 提交代码 1 在项目内点击Git Bash Here
  • linux动态库找不到

    linux动态库找不到 一 分析二 解决方式一方式二方式三 三 如何检查RPATH的值 问题状态 xff1a xxx so cannot open shared object file No such file or directory 一
  • ubuntu14.04LTS下创建Qt5.5.1桌面快捷方式

    以下是网上的方法 xff0c 我试了一下 xff0c 反正没成功 Ubuntu14 04LTS在桌面上创建Qt5 4 1快捷方式 1 下载并安装Qt5 4 1 xff0c 我的安装路径时home cao Qt5 4 1 xff08 默认路径
  • Linux操作系统之一:简述Linux系统开机引导和启动过程

    Linux操作系统之一 xff1a 简述Linux系统开机引导和启动过程 操作系统的启动分为两个阶段 xff1a 引导boot 启动startup 引导阶段开始于打开电源开关 xff0c 结束于内核初始化完成和 systemd 进程成功运行
  • TCP IP与UDP含义 区别 总结

    TCP IP协议 xff08 一 xff09 网络基础知识 OSI参考模型中每个分层的作用 1 3 1 应用层 xff1a 为应用程序提供服务并规定应用程序中通信相关的细节 xff1b 包括的协议如下 xff1a xff1a 超文本传输协议
  • STM32F103 CAN总线配置总结

    stm32的can总线的配置如下 xff1a CAN InitStructure CAN TTCM 61 DISABLE 禁止时间触发通信模式 CAN InitStructure CAN ABOM 61 DISABLE CAN InitSt
  • 新版标准日本语初级_第四十八课

    语法 1 自谦语 xff1a 自谦语是通过压低说话人自身或说话人一方的形式表示敬意的表达方式 如跟别人谈到自己的家人或自己公司的上级时 xff0c 也使用自谦语 2 43 一类动 二类动 或 43 三类动的汉字部分 xff1a 这是自谦语中
  • STM32同时使用多个定时器

    代码如下 xff1a span class token keyword void span span class token function TIM2 IRQHandler span span class token punctuatio
  • Qt之定时器

    文章目录 QObject类的定时器定时器类QTimer Qt使用定时器有两种方法 xff0c 一种是使用QObiect类的定时器 xff0c 一种是使用QTimer类 定时器的精确性依赖于操作系统和硬件 xff0c 大多数平台支持20ms的
  • ucos信号量集

    事件标志组 信号量集 的使用 xff1a span class token keyword static span OS STK task testled span class token punctuation span STARTUP
  • Ubuntu 18.04 swap分区扩展

    在开始之前 xff0c 请先使用命令检查您的 Ubuntu 系统的SWAP 分区 sudo swapon show 创建 swap 的文件 xff08 分配 1G 的swap分区大小 xff09 sudo fallocate l 1G sw
  • ping通ipv6地址

    文章目录 WindowsLinux为什么Link local地址后面要有百分号 xff1f Windows ping ipv6主机名的方法如下 xff1a span class token function ping span 6 ipv6
  • STM32_串口的DMA接收

    STM32使用DMA在串口接收数据的方法如下 xff1a span class token macro property span class token directive hash span span class token direc