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…

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…

活动预告|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家…

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

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

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

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

CTF之comment

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

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

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

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

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

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

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

【机器视觉】opencv教程、示例代码学习笔记汇总(建议收藏)

Microsoft Designer : https://designer.microsoft.com/design 注:文末附 AI对人生寄语的解析 通过对opencv的学习,机器视觉水平也从入门(十分之)二级提升到了入门(十分之)五级。 主页菜单已更新&#xff0…

Flink入门学习 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &…

仿真服务器介绍及应用

仿真服务器是一种高性能的计算设备,专门用于运行复杂的仿真软件和处理大量的计算任务。 仿真服务器通常具备以下特点: 1. 高性能硬件配置:为了满足仿真软件对计算能力的要求,仿真服务器通常配备高性能的CPU、大量的内存以及高速的…

Win11 使用 WSL2 安装 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu 段子手168 1、用 部署映像服务和管理工具 dism.exe 命令,开启 WSL2 按【WIN R】,打开【运行】,输入:【cmd】,管理员打开【命令行提示符】。 启用适用于 Linux 的 Windo…

正则表达式---【Python版】

目录 前言 一.正则表达式概括 1.1简介 1.2使用场景 二.正则表达式语法 2.1基本匹配 2.2元字符 2.2.1点运算符. 2.2.2字符类[] 2.2.3否定字符类 2.2.4*号 2.2.5号 2.2.6?号 2.2.7{}号 2.2.8()号 2.2.9|或运算 2.2.10转码特殊字符\ 2.2.11^和$ 2.3简…

社交媒体数据恢复:超级课程表

超级课程表是一款广受欢迎的应用程序,为学生提供便捷的课程查询和管理功能。然而,在使用过程中,数据丢失或误删的情况难免会发生。本文将介绍如何进行超级课程表的数据恢复,以确保用户的数据安全。 首先,我们需要了解…

Scrapy框架 进阶

Scrapy框架基础Scrapy框架进阶 【五】持久化存储 命令行:json、csv等管道:什么数据类型都可以 【1】命令行简单存储 (1)语法 Json格式 scrapy crawl 自定义爬虫程序文件名 -o 文件名.jsonCSV格式 scrapy crawl 自定义爬虫程…

更改android 安装的sdk版本

打开sdk manager 勾选show details 就可以选择了。

DrugBAN:基于双线性注意力网络进行药物-靶点结合预测。

DrugBan:一种可解释的双线性注意力网络进行药物-靶点结合预测。 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 DrugBan:一种可解释的双线性注意力网络进行药物-靶点结合预测。前言一、模型…

内网渗透-域环境的搭建

域环境的搭建 文章目录 域环境的搭建前言一、什么是域环境 什么是域内网基础知识点 二、域环境的搭建 1. 部署域结构2.如何加入域3.SRV出错及解决办法4.SRV记录注册不成功的可能原因 禁用域中的账户将计算机退出域添加域用户总结 前言 一、什么是域环境 什么是域 域是一种管…