【N32L40X】学习笔记06-串口dma空闲中断+dma接收数据

news2024/11/27 10:45:01

串口dma

8 个可独立配置的 DMA 通道。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VchCudlf-1689952378831)(./picture/dma.png)]

在这里插入图片描述

实例代码

串口dma使用的是串口绑定方式实现串口的dma数据传输

在这里插入图片描述

bsp_uart_dma.h

#ifndef _BSP_UART_DMA_H_
#define _BSP_UART_DMA_H_
#include<stdio.h>
#include<stdint.h>
#include "n32l40x.h"

#define BUFF_SIZE 48
//调试串口指定
#define DEBUG_UART USART1

//dma接收数据和中断接收数据不可以同时使用

typedef enum
{
    UART1_DMA_RECV,//串口1接收
	UART1_DMA_SEND,//串口1发送
    UART2_DMA_RECV,//串口2接收
    UART3_DMA_RECV,//串口3接收
    UART_DMA_NUM,
}em_uart_dma_t;

typedef struct
{

    DMA_ChannelType* dma_ch_rx;//dma 发送通道
    uint32_t dma_remap_rx;//串口接收映射的dma通道
    uint16_t dma_irq_rx;//dma rx 中断编号
    uint32_t send_or_recv;//发送还是接收

} uart_dma_t;

/*
	一键初始化所有串口
*/
void bsp_uart_dma_config(uart_dma_t *puartx,uint32_t reg_data,const uint32_t *buff,const uint16_t len);

uart_dma_t* bsp_uart_dma_get_handler(em_uart_dma_t id);

void bsp_uart_dma_send_ex(uart_dma_t *puartx,uint8_t *data,uint16_t len);

#endif


bsp_uart_dma.c

#include <stdio.h>
#include <math.h>
#include <string.h>
#include "bsp_include.h"
#include "uart/bsp_uart_dma.h"

//这里的通道和外设随便映射,没得固定的映射关系
static uart_dma_t s_uart_dma_s[UART_DMA_NUM]= {
    //UART1
    {  DMA_CH4,DMA_REMAP_USART1_RX,DMA_Channel4_IRQn,DMA_DIR_PERIPH_SRC},
    {  DMA_CH5,DMA_REMAP_USART1_TX,DMA_Channel5_IRQn,DMA_DIR_PERIPH_DST},
    //UART2
    {  DMA_CH2,DMA_REMAP_USART2_RX,DMA_Channel2_IRQn,DMA_DIR_PERIPH_SRC},
    //UART3
    {  DMA_CH3,DMA_REMAP_USART3_RX,DMA_Channel3_IRQn,DMA_DIR_PERIPH_SRC},

};

uart_dma_t* bsp_uart_dma_get_handler(em_uart_dma_t id)
{	
	if(UART_DMA_NUM>id)
		return s_uart_dma_s+id;
	else 
		return 0;
}


void bsp_uart_dma_nvic_config(uart_dma_t *puartx)
{
    NVIC_InitType NVIC_InitStructure;
	
	
	NVIC_InitStructure.NVIC_IRQChannel					 = puartx->dma_irq_rx;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority		 = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd				 = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
 
}


void bsp_uart_dma_config(uart_dma_t *puartx,uint32_t reg_data,const uint32_t *buff,const uint16_t len)
{
   DMA_InitType DMA_InitStructure;

   // USARTy_Tx_DMA_Channel (triggered by USARTy Tx event) Config
	//使能时钟
	RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_DMA, ENABLE);
   
  	DMA_StructInit(&DMA_InitStructure);
	
	DMA_DeInit(puartx->dma_ch_rx);
	DMA_InitStructure.PeriphAddr     = reg_data;
	DMA_InitStructure.MemAddr        = buff;
	DMA_InitStructure.Direction      = puartx->send_or_recv;//外设是源数据
	if(DMA_DIR_PERIPH_DST==puartx->send_or_recv)//发送模式就是默认发送数量为0
	{
		DMA_InitStructure.BufSize        = 0;
	}
	else
	{
	DMA_InitStructure.BufSize        = len;
	}
	DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;//外设地址自动增加关闭
	DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;	//内存地址自动增加
	DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_BYTE;//数据宽度
	DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_Byte;//数据宽度
	DMA_InitStructure.CircularMode   = DMA_MODE_NORMAL;//工作模式-普通模式
	DMA_InitStructure.Priority       = DMA_PRIORITY_MEDIUM;//中等优先级
	DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;//不是内存到内存的传输方式
	DMA_Init(puartx->dma_ch_rx, &DMA_InitStructure);
	//dma 通道映射
	DMA_RequestRemap(puartx->dma_remap_rx, DMA, puartx->dma_ch_rx, ENABLE);
	//中断分组
	bsp_uart_dma_nvic_config(puartx);
	//使能dma中断
	DMA_ConfigInt(puartx->dma_ch_rx,DMA_INT_TXC,ENABLE);
	
	//通道使能
   DMA_EnableChannel(puartx->dma_ch_rx, ENABLE);
	
	

}


void bsp_uart_dma_send_ex(uart_dma_t *puartx,uint8_t *data,uint16_t len)
{
	//通道使能
	DMA_EnableChannel(puartx->dma_ch_rx, DISABLE);
	DMA_SetCurrDataCounter(puartx->dma_ch_rx,len);
	//通道使能
	DMA_EnableChannel(puartx->dma_ch_rx, ENABLE);
}


/**

DMA_Channel1_IRQHandler
DMA_Channel2_IRQHandler
DMA_Channel3_IRQHandler
DMA_Channel4_IRQHandler
DMA_Channel5_IRQHandler
DMA_Channel6_IRQHandler
DMA_Channel7_IRQHandler
DMA_Channel8_IRQHandler
*/


void  bsp_uart_dam_irq_handler(uint32_t DMA_IT)
{
    //DMA_INT_HTX1 这个是个变量
    if( DMA_GetIntStatus(DMA_IT, DMA))
    {
        DMA_ClrIntPendingBit(DMA_IT, DMA);
       
    }

}




//发送/接收 dma
void DMA_Channel4_IRQHandler(void)
{	
		bsp_uart_dam_irq_handler(DMA_INT_TXC4);
	

}

//发送/接收 dma
void DMA_Channel5_IRQHandler(void)
{

		bsp_uart_dam_irq_handler(DMA_INT_TXC5);
	

}




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32(HAL库)驱动(1.44寸)TFT-LCD彩屏

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 屏幕引脚配置 2.3 项目生成 3、KEIL端程序整合 3.1 LCD驱动添加 3.2 函数修改 3.2.1 lcd.h修改 3.2.2 lcd_innit.h 修改 3.2.3 lcd.c修改 3.2.4 lcd_inut.c修改 3.3 主函数代码 3.3…

网络安全(零基础)自学

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识&#xff0c;可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题&#xff0c;可以帮助您更好地解决网络安全的原理和技术…

Spring Cloud Alibaba 集成 Skywalking 链路追踪

Spring Cloud Alibaba 集成 Skywalking 链路追踪 简介 skywalking 是一个国产开源框架&#xff0c;2015 年由吴晟开源 &#xff0c; 2017 年加入 Apache 孵化器。skywalking 是分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Doc…

前端 | ( 十)HTML5简介及相关新增属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;HTML5简介&#x1f407;什么是HTML5&#x1f407;HTML5 优势&#x1f407;HTML5兼容性 &#x1f4da;新增语义化标签&#x1f407;新增布局标签&#x1f407…

怎样原生制作lis的CentOS容器镜像

本文介绍从一个空白的裸机CentOS自己构造检验允许的docker环境。来达到运行环境的高度定制&#xff0c;而不是只能依赖VS或者微软或者数据库厂商提供的镜像当做基础制作。更容易理解基础原理。最终输出产物为lisnew.tar&#xff0c;一个开箱即用的lis运行环境。 制作的整个过程…

自动驾驶分级和技术架构

标题SAE 和 NHTSA自动驾驶分级 当前全球汽车行业中两个最权威的分级系统由美国国家公路交通安全管理局&#xff08;NHTSA&#xff09;和国际自动化工程师协会(SAE)提出。2013年&#xff0c;NHTSA将驾驶自动化的描述分为5个层级。2014年1月&#xff0c;SAE制定J3016自动驾驶分级…

【深度学习-神经网络架构-通俗易懂的入门课程】

文章目录 深度学习与AI的关系机器学习的流程机器学习的核心以及问题深度学习要解决的问题模型如何搭建&#xff1f;特征如何提取&#xff1f;为什么要深度学习&#xff1f; 深度学习的应用深度学习的问题计算机视觉任务分类与检索如何实现分类 神经网络基础线性函数损失函数防止…

Golang 中的可测试示例函数(Example Function)详解

Golang 可测试示例含函数 (Example Function) 示例函数类似于单元测试函数&#xff0c;但没有 *testing 类型的参数。编写示例函数也是很容易的&#xff1a; 创建对应的测试文件&#xff1a;在 Go 项目的源代码目录下创建一个新的文件&#xff08;和被测代码文件在同一个包&…

Java 知识合集 | 多线程与并发

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

C++初阶之内存分布

C/C内存管理 C/C内存分布C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free1.malloc和free2.calloc3.realloc4.常见的动态内存错误 C内存管理方式1.new/delete操作内置类型2.new和delete操作自定义类型3.new和malloc使用上的区别 operator new与operator delete函…

设计模式: 23重设计模式

设计模式 设计模式概述设计模式的概念设计模式的组成23种设计模式设计模式与软件架构设计模式分类创建型设计模式结构型设计模式行为型设计模式 设计模式概述 在20世纪70年代&#xff0c;Christopher Alexander 提出了城市建筑的模式&#xff0c;他认为&#xff1a;模式是描述…

Windows的内部结构API

Windows内部结构 由于 Windows 机器构成了企业基础设施的大部分&#xff0c;红队需要了解 Windows 的内部结构以及如何&#xff08;滥用&#xff09;使用它们。在制作攻击性工具或漏洞利用时&#xff0c;红队可以滥用这些来帮助规避和利用。 进程 进程维护并代表程序的执行&…

Abaqus 中的步进、增量、迭代和尝试概念 硕迪科技

Abaqus 中的步进、增量、迭代和尝试等可能会在概念上让 Abaqus 初学者感到困惑。清楚地了解分析步骤、荷载增量和迭代之间的区别非常重要。在这篇文章中快速了解 Abaqus 步骤和增量迭代。 在ABAQUS中&#xff0c;步进增量迭代是解决非线性问题的一种数值计算方法。这种方法通常…

【分布式】1、CAP 理论 | 一致性、可用性、分区容忍性

文章目录 一、CAP 理论1.1 Consistency 一致性1.2 Availbility 可用性1.3 Partition Tolerance 分区容忍性1.4 CAP 应用1.4.1 CP1.4.2 AP 二、CAP 实践2.1 ACID2.2 BASE 一、CAP 理论 是 2002 年证明的定理&#xff0c;原文&#xff0c;内容如下&#xff1a; In a distributed…

Day52: 84.柱状图中最大的矩形

84.柱状图中最大的矩形 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 思路 本题是要找每个柱子左右两边第一个小于该柱子的柱子&#xff0c;所以从栈头&#xff08;元素从栈头弹出&#xff09;到栈底的顺序是从大到小的顺序。例&#xff1a; 三种情况&a…

安装 VNC 服务器-iTOPRK3588开发板

开发板联网以后&#xff0c;在串口终端输入以下命令&#xff1a; sudo apt-get update sudo apt-get upgrade sudo apt-get install tightvncserver apt-get install xfonts-base 安装完毕之后&#xff0c;在串口终端输入以下命令运行 vnc tightvncserver 然后要求设置密…

算法专题:投票法

文章目录 169.多数元素&#xff08;找频率>n/2&#xff0c;且多数元素一定存在&#xff09;思路完整版补充&#xff1a;注意点 面试题 17.10. 主要元素&#xff08;找频率>n/2&#xff0c;但多数元素不一定存在&#xff09;思路完整版 229.多数元素Ⅱ&#xff08;找频率&…

“智能文件批量改名工具:轻松去除文件名中的特殊符号“

您是否曾经为繁杂的文件命名而感到困扰&#xff1f;特殊符号导致文件名混乱难辨&#xff0c;给您的工作和学习带来不便&#xff1f;现在&#xff0c;我们的智能文件批量改名工具为您解决这一难题&#xff01; 首先&#xff0c;我们要进行文件批量改名高手主页面&#xff0c;并…

基于Docker容器安装TensorFlow测试GPU

前言 当基于nvidia gpu开发的docker镜像在实际部署时&#xff0c;需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose 1. CentOS7安装docker详细教程 安装docker 1. Docker 要求 CentOS 系统的内核版本高于 3.10 &#xff0c;查看本页面的前提条件来验…

【iOS】CALayer的理解与简单使用

文章目录 前言一、UIView与CALayer的关系二、CALayer的简单使用1.圆角与裁剪2.contents3.边框属性 总结 前言 在实现网易云音乐demo开发的过程中&#xff0c;通过查阅网上资料&#xff0c;发现了我们可以对我们的视图进行裁剪来实现美观的体现&#xff0c;例如这样&#xff1a…