STM32H7的DMA双缓冲控制IO输出脉冲

STM32H7的DMA双缓冲控制IO输出脉冲

  • keil的sct文件配置
  • MPU配置
  • 初始化DMA双缓冲
  • 初始化TIM12用处触发DMAMUX的请求发生器

keil的sct文件配置

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00200000  {    ; load region size_regionER_IROM1 0x08000000 0x00200000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO)}RW_IRAM1 0x20000000 0x00020000  {  ; RW data - 128KB DTCM.ANY (+RW +ZI)}RW_IRAM2 0x24000000 0x00080000  {  ; RW data - 512KB AXI SRAM*(.RAM_D1) }RW_IRAM3 0x30000000 0x00048000  {  ; RW data - 128KB SRAM1(0x30000000) + 128KB SRAM2(0x3002 0000) + 32KB SRAM3(0x30040000)*(.RAM_D2)}RW_IRAM4 0x38000000 0x00010000  {  ; RW data - 64KB SRAM4(0x38000000)*(.RAM_D3)}
}

MPU配置

/* 配置 SRAM4 的属性为 Write through, read allocate,no write allocate */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x38000000;
MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER2;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);

初始化DMA双缓冲

在这里插入图片描述

/*初始化变量*/
#elif defined ( __CC_ARM )
ALIGN_32BYTES(__attribute__((section (".RAM_D3"))) uint32_t IO_Toggle[8]) ={ 0x00000002U, 0x00020000U, 0x00000002U, 0x00020000U, 0x00000002U, 0x00020000U, 0x00000002U, 0x00020000U, };
ALIGN_32BYTES(__attribute__((section (".RAM_D3"))) uint32_t IO_Toggle1[8]) ={ 0x00000002U, 0x00020000U, 0x00000002U, 0x00020000U, 0x00000002U, 0x00020000U, 0x00000002U, 0x00020000U, };
#endif
void bsp_InitTimDMA(void)
{GPIO_InitTypeDef  GPIO_InitStruct;DMA_HandleTypeDef DMA_Handle = {0};HAL_DMA_MuxRequestGeneratorConfigTypeDef dmamux_ReqGenParams = {0};/*##-1- 配置PB1用于PWM输出 ##################################################*/__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/*##-2- 使能DMA1时钟并配置 ##################################################*/__HAL_RCC_DMA1_CLK_ENABLE();DMA_Handle.Instance                 = DMA1_Stream1;            /* 使用的DMA1 Stream1 */DMA_Handle.Init.Request             = DMA_REQUEST_GENERATOR0;  /* 请求类型采用的DMAMUX请求发生器通道0 */  DMA_Handle.Init.Direction           = DMA_MEMORY_TO_PERIPH;    /* 传输方向是从存储器到外设 */  DMA_Handle.Init.PeriphInc           = DMA_PINC_DISABLE;        /* 外设地址自增禁止 */ DMA_Handle.Init.MemInc              = DMA_MINC_ENABLE;         /* 存储器地址自增使能 */  DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;     /* 外设数据传输位宽选择字,即32bit */     DMA_Handle.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;     /* 存储器数据传输位宽选择字,即32bit */    DMA_Handle.Init.Mode                = DMA_CIRCULAR;            /* 循环模式 */   DMA_Handle.Init.Priority            = DMA_PRIORITY_LOW;        /* 优先级低 */  DMA_Handle.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;    /* 禁止FIFO*/DMA_Handle.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL; /* 禁止FIFO此位不起作用,用于设置阀值 */DMA_Handle.Init.MemBurst            = DMA_MBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于存储器突发 */DMA_Handle.Init.PeriphBurst         = DMA_PBURST_SINGLE;       /* 禁止FIFO此位不起作用,用于外设突发 *//* 初始化DMA */if(HAL_DMA_Init(&DMA_Handle) != HAL_OK){Error_Handler(__FILE__, __LINE__);     }/* 开启DMA1 Stream1的中断 */HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 2, 0);HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); /*##-4- 配置DMAMUX ###########################################################*/dmamux_ReqGenParams.SignalID  = HAL_DMAMUX1_REQ_GEN_TIM12_TRGO;         /* 请求触发器选择LPTIM2_OUT */dmamux_ReqGenParams.Polarity  = HAL_DMAMUX_REQ_GEN_RISING;              /* 上升沿触发  */dmamux_ReqGenParams.RequestNumber = 1;                                  /* 触发后,传输进行1次DMA传输 */HAL_DMAEx_ConfigMuxRequestGenerator(&DMA_Handle, &dmamux_ReqGenParams); /* 配置DMAMUX */HAL_DMAEx_EnableMuxRequestGenerator (&DMA_Handle);                      /* 使能DMAMUX请求发生器 */   /*##-4- 启动DMA双缓冲传输 ################################################*//*1、此函数会开启DMA的TC,TE和DME中断2、如果用户配置了回调函数DMA_Handle.XferHalfCpltCallback,那么函数HAL_DMA_Init会开启半传输完成中断。3、如果用户使用了DMAMUX的同步模式,此函数会开启同步溢出中断。4、如果用户使用了DMAMUX的请求发生器,此函数会开始请求发生器溢出中断。*/HAL_DMAEx_MultiBufferStart_IT(&DMA_Handle, (uint32_t)IO_Toggle, (uint32_t)&GPIOB->BSRRL,(uint32_t)IO_Toggle1, 8);/* 用不到的中断可以直接关闭 *///DMA1_Stream1->CR &= ~DMA_IT_DME; //DMA1_Stream1->CR &= ~DMA_IT_TE;//DMAMUX1_RequestGenerator0->RGCR &= ~DMAMUX_RGxCR_OIE;TIM12_Config(0);
}

初始化TIM12用处触发DMAMUX的请求发生器

/*
*********************************************************************************************************
*	函 数 名: TIM12_Config
*	功能说明: 配置TIM12,用于触发DMAMUX的请求发生器
*	形    参: _Mode 
*             0 表示配置为100KHz触发频率,配置为100KHz触发频率,如果DMAMUX配置为单边沿触发,那么输出PWM频
*               率是50KHz,双边沿是100KHz。
*			  1 表示配置为10KHz触发频率,如果DMAMUX配置为单边沿触发,那么输出PWM频率是5KHz,双边沿是10KHz。									  
*	返 回 值: 无
*********************************************************************************************************
*/
void TIM12_Config(uint8_t _Mode)
{TIM_HandleTypeDef  htim ={0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_OC_InitTypeDef sConfig = {0};uint32_t Period[2] = {1999, 19999};uint32_t Pulse[2]  = {999, 9999};/* 使能时钟 */  __HAL_RCC_TIM12_CLK_ENABLE();/*-----------------------------------------------------------------------bsp.c 文件中 void SystemClock_Config(void) 函数对时钟的配置如下: System Clock source       = PLL (HSE)SYSCLK(Hz)                = 400000000 (CPU Clock)HCLK(Hz)                  = 200000000 (AXI and AHBs Clock)AHB Prescaler             = 2D1 APB3 Prescaler         = 2 (APB3 Clock  100MHz)D2 APB1 Prescaler         = 2 (APB1 Clock  100MHz)D2 APB2 Prescaler         = 2 (APB2 Clock  100MHz)D3 APB4 Prescaler         = 2 (APB4 Clock  100MHz)因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz;因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;APB4上面的TIMxCLK没有分频,所以就是100MHz;APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5TIM12CLK = 200MHz/(Period + 1) / (Prescaler + 1)函数bsp_InitTimDMA1中DMAMUX1选择的是单边沿触发,每个时钟可以触发两次。----------------------------------------------------------------------- */  HAL_TIM_Base_DeInit(&htim);htim.Instance = TIM12;htim.Init.Period            = Period[_Mode];htim.Init.Prescaler         = 0;htim.Init.ClockDivision     = 0;htim.Init.CounterMode       = TIM_COUNTERMODE_UP;htim.Init.RepetitionCounter = 0;HAL_TIM_Base_Init(&htim);sConfig.OCMode     = TIM_OCMODE_PWM1;sConfig.OCPolarity = TIM_OCPOLARITY_LOW;/* 占空比50% */sConfig.Pulse = Pulse[_Mode];  if(HAL_TIM_OC_ConfigChannel(&htim, &sConfig, TIM_CHANNEL_1) != HAL_OK){Error_Handler(__FILE__, __LINE__);}/* 启动OC1 */if(HAL_TIM_OC_Start(&htim, TIM_CHANNEL_1) != HAL_OK){Error_Handler(__FILE__, __LINE__);}/* TIM12的TRGO用于触发DMAMUX的请求发生器 */sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig);
}

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

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

相关文章

kylin java.io.IOException: error=13, Permission denied

linux centos7.8 error13, Permission denied_linux open error13-CSDN博客 chmod -R 777 /home/zengwenfeng/kkFileView-4.2.1 2024-04-15 13:15:17.416 WARN 3400 --- [er-offprocmng-1] o.j.l.office.LocalOfficeProcessManager : An I/O error prevents us to determine…

【AIGC调研系列】rerank3是什么

Rerank 3是一个针对企业搜索和检索辅助生成(RAG)系统优化的新型基础模型,它支持多语种、多结构数据搜索,并提供高精度的语义重排。通过这种方式,Rerank 3能够大幅提升响应准确度和降低延迟,同时大幅降低成本…

Mac m1 安装虚拟机+docker 2024

由于最近需要学习docker,k8s,用到虚拟机测试;场景各不相同,慎用,我在mac m1的机器下已经安装运行成功,参考了网上的几篇文章,也给到相应的思路,大部分要么是镜像不完整,安装完发现缺…

ubuntu 20.04 更新显卡驱动

1. 问题描述 $ watch -n 1 nvidia-smi画面不动 而且运行 pytorch 代码时出现问题: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11070). Please update your GPU driver by downloading and installing a new…

Android APP 禁用深色模式

从Android10(API 29)开始,在原有的主题适配的基础上,Google开始提供了Force Dark机制,在系统底层直接对颜色和图片进行转换处理,原生支持深色模式。当系统设置深色主题背景或者进入省电模式情况下会进入深色…

活动预告|NineData 创始人CEO叶正盛将参加QCon全球软件开发大会,共话AI大模型技术在数据库DevOps的实践

4月13日下午,NineData创始人&CEO叶正盛即将参加InfoQ中国主办的『QCon全球软件开发大会北京站』的技术大会。在本次技术峰会上,叶正盛将以《AI大模型技术在数据库DevOps的实践》为主题,深入剖析AI大模型技术在数据库DevOps领域的最新进展…

AI天使汇联合150家顶级基金、战投,征集优秀AI创业项目

鉴于AI天使汇主办的2024年3月期优秀项目征集活动效果超出预期,3月活动最后TOP20路演者中已有多家快速拿到了TS。 路演活动质量受到了AI创业公司和基金/战投伙伴的高度评价,现在开始四月期活动报名! 本期征集活动联合的顶级基金和战投数量增加到了150家…

【MYSQL】索引优化思考题

假设有一张订单表 order,主要包含了主键订单编码 order_no、订单状态 status、提交时间 create_time 等列,并且创建了 status 列索引和 create_time 列索引。此时通过创建时间降序获取状态为 1 的订单编码,以下是具体实现代码: s…

熟悉GC回收算法

GC(Garbage Collection,垃圾回收)回收算法是Java等高级语言中的一个重要概念,用于自动管理内存。 1:请简述什么是垃圾回收? 答案:垃圾回收是编程语言提供的一种内存管理机制,它自动…

香港银行个人账户开户实用指南

内地居民申请香港银行个人账户指南 内地居民申请香港银行个人账户,可以通过以下两种方式: 自行前往香港银行申请开户,需要携带齐全的开户资料,在规定开户行进行面谈,一般银行会要求客户购买理财产品或是做大额的资金…

【菜狗学前端】npm i -g nodemon 遇到的下载卡住及运行权限问题解决记录

一、下载nodemon原因 nodemon作用:用node环境运行js文件时可以实时刷新运行出结果 (即修改js代码后不需再手动重新运行js文件) 二、下载卡住 reify:semver:timing reifyNode:node_modules/nodemon Completed 卡住位置:reify:semver: timing reifyNode…

零基础学网页设计,6个特别案例带你入门!

网站设计是通过艺术手法呈现项目策划案例的内容、网站的主题模式和自己的理解。优秀的网站设计应该能够充分吸引访问者的注意力,让访问者有视觉愉悦感。因此,网站设计的特殊性非常重要,可以直接影响网站的用户保留。那么如何做出特殊的网站设…

vue3从精通到入门23:定义全局变量

在vue2中,我们知道vue2.x是使用Vue.prototype.$xxxxxxx来定义全局变量, 比如定义一个全局的工具函数。 // 定义 ... Vue.prototype.$utilsutils;// 使用 this.$utils() ... 在vue3中我们无法使用this,提供了globalProperties; …

SpringBoot 面试题(七)

1. 在SpringBoot项目中如何实现数据库连接的连接池管理? 在Spring Boot项目中,数据库连接的连接池管理通常通过配置和自动配置功能来实现。Spring Boot默认使用HikariCP作为连接池,但也可以配置为使用其他连接池,如Tomcat JDBC Pool或C3P0。…

CTF之comment

网站的登录框里有提示 账号:zhangwei 密码:zhangwei***(后三位要自己猜) 用burpsuit抓包爆破发现密码为zhangwei666 进去后就一个留言榜(目前没发现怎么用) 扫一下网站发现git泄露 1.下载 进入root用户&…

故障诊断 | Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电缆故障诊断算法

故障诊断 | Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电缆故障诊断算法 目录 故障诊断 | Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电缆故障诊断算法分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现基于小波包结合卷积神经网络DWT-CNN实现电…

ssm052游戏攻略网站的设计与实现+vue

游戏攻略网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本游戏攻略网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处…

shell的awk之gsub函数

gsub函数用法 gsub函数是AWK中用于全局替换的函数。它的语法是: gsub(regex, replacement, target) 其中,regex是一个正则表达式,用于匹配要替换的内容,replacement是替换的字符串或者值,target是要进行替换操作的目…

【AIGC调研系列】行业Agent的未来?来看看Newton模型

Archetype AI发布的Newton模型具有以下特点: 实时物理数据连接:Newton设计用于连接实时物理数据,如雷达、摄像头、加速度计等,通过全球数十亿传感器的输入,实现对物理世界的深入理解[3]。 理解并推理物理世界&#xf…

ssm+springboot校园勤工俭学助学兼职系统

本校园勤工俭学兼职系统主要包括三大功能模块,即管理员功能模块和学生功能模块及企业功能模块。 (1)管理员模块:系统中的核心用户是管理员,管理员登录后,通过管理员功能来管理后台系统。主要功能有&#xf…