【STM32H7教程】第41章 STM32H7的BDMA应用之控制任意IO做PWM和脉冲数控制

发布者:WhisperingRain最新更新时间:2023-07-11 来源: zhihu关键字:STM32H7  PWM 手机看文章 扫描二维码
随时随地手机看文章

41.1 初学者重要提示

  1. 学习本章节前,务必优先学习第39章和40章,需要对DMAMUX,BDMA的基础知识和HAL库的几个常用API有个认识。

  2. 使用半传输完成中断和传输完成中断实现的双缓冲效果跟BDMA本身支持的双缓冲模式实现的效果是一样的。只是最大传输个数只能达到32767次。

  3. 相比定时器本身支持的PWM,这种方式更加灵活,可以让任意IO都可以输出PWM,而且方便运行中动态修改输出状态。

41.2 定时器触发BDMA驱动设计

定时器触发DMAMUX,控制BDMA让GPIO输出PWM的实现思路框图如下:

下面将程序设计中的相关问题逐一为大家做个说明。

41.2.1 定时器选择

使用BDMA的话,请求信号都是来自DMAMUX2,而控制DMA做周期性传输的话,可以使用定时器触发,这样的话就可以使用DMAMUX的请求发生器功能,支持如下几种触发:

#define HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH0_EVT   0U   

#define HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH1_EVT   1U   

#define HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH2_EVT   2U   

#define HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH3_EVT   3U   

#define HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH4_EVT   4U   

#define HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH5_EVT   5U  

#define HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH6_EVT   6U   

#define HAL_DMAMUX2_REQ_GEN_LPUART1_RX_WKUP   7U   

#define HAL_DMAMUX2_REQ_GEN_LPUART1_TX_WKUP   8U   

#define HAL_DMAMUX2_REQ_GEN_LPTIM2_WKUP       9U   

#define HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT       10U  

#define HAL_DMAMUX2_REQ_GEN_LPTIM3_WKUP      11U   

#define HAL_DMAMUX2_REQ_GEN_LPTIM3_OUT       12U  

#define HAL_DMAMUX2_REQ_GEN_LPTIM4_WKUP      13U   

#define HAL_DMAMUX2_REQ_GEN_LPTIM5_WKUP      14U   

#define HAL_DMAMUX2_REQ_GEN_I2C4_WKUP        15U   

#define HAL_DMAMUX2_REQ_GEN_SPI6_WKUP        16U   

#define HAL_DMAMUX2_REQ_GEN_COMP1_OUT        17U   

#define HAL_DMAMUX2_REQ_GEN_COMP2_OUT        18U   

#define HAL_DMAMUX2_REQ_GEN_RTC_WKUP         19U   

#define HAL_DMAMUX2_REQ_GEN_EXTI0            20U  

#define HAL_DMAMUX2_REQ_GEN_EXTI2            21U   

#define HAL_DMAMUX2_REQ_GEN_I2C4_IT_EVT      22U  

#define HAL_DMAMUX2_REQ_GEN_SPI6_IT          23U  

#define HAL_DMAMUX2_REQ_GEN_LPUART1_TX_IT    24U  

#define HAL_DMAMUX2_REQ_GEN_LPUART1_RX_IT    25U   

#define HAL_DMAMUX2_REQ_GEN_ADC3_IT          26U   

#define HAL_DMAMUX2_REQ_GEN_ADC3_AWD1_OUT    27U  

#define HAL_DMAMUX2_REQ_GEN_BDMA_CH0_IT      28U  

#define HAL_DMAMUX2_REQ_GEN_BDMA_CH1_IT      29U   

我们这里使用的是LPTIM2_OUT,因为BDMA,LPTIM2和GPIO都在D3域。


接下来就是LPTIM的时钟配置问题,由前面的LPTIM章节,我们知道LPTIM2的时钟可以由LSE,LSI,APB或者外部输入时钟提供。使用LSE,LSI或者外部输入的好处是停机状态下,LPTIM1也可以正常工作。


V7开发板使用的LSE晶振是32768Hz。

STM32H743的LSI频率约32KHz。

LPTIM1 – LPTIM5的频率都是100MHz。

System Clock source       = PLL (HSE)

SYSCLK(Hz)                = 400000000 (CPU Clock)

HCLK(Hz)                  = 200000000 (AXI and AHBs Clock)

AHB Prescaler             = 2

D1 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; 不含这个总线下的LPTIM1

因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2 = 200MHz;


APB4上面的TIMxCLK没有分频,所以就是100MHz;


APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1

APB2 定时器有 TIM1, TIM8 , TIM15, TIM16,TIM17


APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5

如果选择APB时钟的话,配置如下:


RCC_PeriphCLKInitTypeDef   RCC_PeriphCLKInitStruct = {0};


RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM2;

RCC_PeriphCLKInitStruct.Lptim2ClockSelection = RCC_LPTIM2CLKSOURCE_D3PCLK1;

HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);

使用APB作为LPTIM系统时钟注意以下两点:


LPTIM1 – LPTIM5的最高主频都是100MHz。

注意参数RCC_LPTIM2CLKSOURCE_D3PCLK1。

LPTIM1使用的RCC_LPTIM1CLKSOURCE_D2PCLK1。


LPTIM2使用的RCC_LPTIM2CLKSOURCE_D3PCLK1。


LPTIM3-LPTIM5使用的RCC_LPTIM345CLKSOURCE_D3PCLK1。


LPTIM2的配置代码如下:


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: LPTIM_Config

4.    *    功能说明: 配置LPTIM,用于触发DMAMUX的请求发生器

5.    *    形    参: 无

6.    *    返 回 值: 无

7.    ******************************************************************************************************

8.    */

9.    void LPTIM_Config(void)

10.    {

11.        

12.        RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;

13.    

14.        

15.        /*##-1- 配置LPTIM2使用PCLK时钟 ##################################################*/

16.        PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPTIM2;

17.        PeriphClkInitStruct.Lptim2ClockSelection = RCC_LPTIM2CLKSOURCE_D3PCLK1;

18.        HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);  

19.    

20.    

21.        /*##-2- 使能LPTIM2时钟并配置 ####################################################*/

22.        __HAL_RCC_LPTIM2_CLK_ENABLE();

23.    

24.        LptimHandle.Instance                           = LPTIM2;

25.        LptimHandle.Init.CounterSource                 = LPTIM_COUNTERSOURCE_INTERNAL;

26.        LptimHandle.Init.UpdateMode                    = LPTIM_UPDATE_ENDOFPERIOD;

27.        LptimHandle.Init.OutputPolarity                = LPTIM_OUTPUTPOLARITY_HIGH;

28.        LptimHandle.Init.Clock.Source                  = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;

29.        LptimHandle.Init.Clock.Prescaler               = LPTIM_PRESCALER_DIV1;

30.        LptimHandle.Init.UltraLowPowerClock.Polarity   = LPTIM_CLOCKPOLARITY_RISING;

31.        LptimHandle.Init.UltraLowPowerClock.SampleTime = LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION;

32.        LptimHandle.Init.Trigger.Source                = LPTIM_TRIGSOURCE_SOFTWARE;

33.        LptimHandle.Init.Trigger.ActiveEdge            = LPTIM_ACTIVEEDGE_RISING;

34.        LptimHandle.Init.Trigger.SampleTime            = LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION;

35.    

36.        /*##-3- 初始化LPTIM2 ##########################################################*/

37.        if(HAL_LPTIM_Init(&LptimHandle) != HAL_OK)

38.        {

39.            Error_Handler(__FILE__, __LINE__);

40.        }

41.    

42.        /*##-4- 启动LPTIM2的PWM模式,但使用输出引脚,仅用于DMAMUX的触发 ##############*/

43.        /* LPTIM2的时钟主频是100MHz,这里配置触发是100MHz / (10000 - 1 + 1) = 10KHz */

44.        if (HAL_LPTIM_PWM_Start(&LptimHandle, 10000-1, 5000 - 1) != HAL_OK)

45.        {

46.            Error_Handler(__FILE__, __LINE__);

47.        }  

48.    }

这里把几个关键的地方阐释下:


第16 – 18行,配置LPTIM2使用APB时钟。

第22 – 40行, 配置LPTIM2的相关参数,具体每个参数代表的含义可以看前面LPTIM章节的讲解。

第44 – 47行,配置LPTIM2工作在PWM模式,频率10KHz,占空比50%。这里仅仅是用到LPTIM2_OUT的输出信号作为DMAMUX的请求发生器触发源,所以用不到PWM的输出引脚。

41.2.2 DMMUX和BDMA配置

完整配置如下:


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: bsp_InitTimBDMA

4.    *    功能说明: 配置DMAMUX的定时器触+DMA控制任意IO做PWM和脉冲数控制

5.    *    形    参: 无

6.    *    返 回 值: 无

7.    ******************************************************************************************************

8.    */

9.    void bsp_InitTimBDMA(void)

10.    {

11.        GPIO_InitTypeDef  GPIO_InitStruct;

12.        DMA_HandleTypeDef DMA_Handle = {0};

13.        HAL_DMA_MuxRequestGeneratorConfigTypeDef dmamux_ReqGenParams ={0};

14.    

15.        

16.         /*##-1-  ##################################################*/ 

17.        __HAL_RCC_GPIOB_CLK_ENABLE();

18.          

19.        GPIO_InitStruct.Pin = GPIO_PIN_1;

20.        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

21.        GPIO_InitStruct.Pull = GPIO_NOPULL;

22.        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

23.        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

24.        

25.      

26.        /*##-2- Configure the DMA ##################################################*/

27.        __HAL_RCC_BDMA_CLK_ENABLE();

28.    

29.        DMA_Handle.Instance            = BDMA_Channel0;           /* 使用的BDMA通道0 */

[1] [2] [3] [4] [5]
关键字:STM32H7  PWM 引用地址:【STM32H7教程】第41章 STM32H7的BDMA应用之控制任意IO做PWM和脉冲数控制

上一篇:【STM32H7教程】第42章 STM32H7的DMA基础知识和HAL库API
下一篇:【STM32H7教程】第40章 STM32H7的BDMA基础知识和HAL库API

推荐阅读最新更新时间:2024-11-13 03:23

PWM简介和原理分析
PWM是什么 PWM,即脉冲宽度调制,是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 PWM原理 随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而在镍氢电池智能充电器中采用的脉宽PWM法,它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目
[单片机]
单相电压型PWM整流电路原理分析与仿真(一)
引言 众所周知,在传统的整流电路中,晶闸管可控整流装置的功率因数会随着其触发角的增加而变坏,这不但使得电力电子类装置成为电网中的主要谐波因素,也增加了电网中无功功率的消耗。 PWM整流电路是采用脉宽调制技术和全控型器件组成的整流电路,能有效地解决传统整流电路存在的问题。通过对PWM整流电路进行有效的控制,选择合适的工作模式和工作时序,从而调节了交流侧电流的大小和相位,使之接近正弦波并与电网电压同相或反相,不但有效地控制了电力电子装置的谐波问题,同时也使得变流装置获得良好的功率因数。 1 单相电压型桥式PWM整流电路的结构 单相电压型桥式PWM整流电路最初出现在交流机车传动系统中,为间接式变频电源提供直流中间环节,电
[电源管理]
单相电压型<font color='red'>PWM</font>整流电路原理分析与仿真(一)
MSL2164:16串LED驱动器设计指南详解
MSL2164和MSL2166器件以高电流精度和LED串匹配来驱动外部MOSFET, 这些器件具有爱特梅尔LED驱动器产品系列中最宽的调光分辨率,能够提高对比度,与其它解决方案相比,功耗降低至少20%。 过去,TV OEM厂商必须计算合适的参数,以便有效地照亮所要求的显示屏背光区域。LED驱动器将生成算法以设置合适的LED串相位,优化背光与LCD面板的同步。 OEM厂商必须经常执行附加算法以调节LED串相位,确保背光在帧刷新期间完全同步。MSL2164和MSL2166具有多种脉宽调制(PWM)模式, 包括正向、逆向、拖尾和中心,由于新器件中集成了定时算法,设计复杂性得以降低,这确保背光在所有LCD像素已经稳定的最佳时刻照亮。
[电源管理]
MSL2164:16串LED驱动器设计指南详解
STM8 PWM例程
在单片机应用系统中,也常常会用到PWM 信号输出,例如电机转速的控制。现在很多高档的单片机 也都集成了PWM 功能模块,方便用户的应用。 对于PWM 信号,主要涉及到两个概念,一个就是PWM 信号的周期或频率,另一个就是PWM 信号的 占空比。例如一个频率为1KHZ,占空比为30%,有效信号为1 的PWM 信号,在用示波器测量时, 就是高电平的时间为300uS,低电平的时间为700uS 的周期波形。 在单片机中实现PWM 信号的功能模块,实际上就是带比较器的计数器模块。首先该计数器循环计数, 例如从0 到N,那么这个N 就决定了PWM 的周期,PWM 周期=(N+1)*计数器时钟的周期。在计数 器模块中一定还有一个比
[单片机]
噪声扰人烦 PWM稳压电源帮你抑制噪声
PWM型开关稳压电源优点有很多,比如效率高、体积小等等,因此PWM作为电源设备在很多领域都有广泛的应用。但是,开关三极管的工作状态转换持续期短、频谱甚宽的尖峰干扰是其致命弱点,它不仅影响开关电源本身,而且还会干扰邻近的其它电子设备。开关稳压电源工作时开关三极管和续流二极管(亦可以是另一个开关三极管)总是交替地导通或者截止,图1中KQ和KD并非是理想器件,两种状态的转换需要一定的时间,这就产生了尖峰干扰。在状态转变过程中,该导通的开关没有完全导通,而该截止的开关却又没有截止的瞬间,电源到地有直接的通路,产生瞬态电流Is。该电流跟开关三极管导通时的电流Imax及截止时的电流Icmin的差值、开关KQ和KD同时导通的持续时间等因素有关。
[电源管理]
噪声扰人烦 <font color='red'>PWM</font>稳压电源帮你抑制噪声
STM32输出PWM状态总结
输出极性(Polarity): 基于正逻辑,即高电平为1,低电平为0 1.输出极性高(Polarity_High):高电平1为有效状态(active),低电平0为无效状态(inactive) 2.输出极性低(Polarity_Low):低电平0为有效状态(active),高电平1为无效状态(inactive) PWM Mode: 分为边沿对齐和中心对齐模式 对应向上/下计数,中心对齐计数 PWM Mode 1: 向上计数:TIMx_CNT TIMx_CCR1 active ;TIMx_CNT =TIMx_CCR1 inactive 向下计数:TIMx_CNT TIMx_CCR1 inactive ;TIMx_CNT
[单片机]
PWM技术应用在逆变器中的几大优点
  逆变器的脉宽调制技术PWM是一种参考波为“调制波”,而以N倍于调制波频率的正三角波为“载波”。由于正三角波或锯齿波的上下宽度是线性变化的波形,因此,它与调制波相交时,就可以得到一组幅值相等,而宽度正比于调制波函数值的矩形脉冲序列用来等效调制波。用开关量取代模拟量,并通过对逆变器开关管的通断控制,把直流电变交流电,这种技术叫做脉宽调制技术。当调制波为正弦波时,输出矩形脉冲序列的脉冲宽度按照正弦函数规律变化,这种调制技术通常又称为正弦波脉宽调制技术。   PWM技术从打的方面可以分为三大类,即波形调制PWM技术、优化PWM技术和随机PWM技术。PWm技术可以用于电压型逆变器,也可以用于电流型逆变器,它对于逆变器技术的发展起到了很大
[电源管理]
飞思卡尔单片机PWM模块分析(1)
例程: /******************* //功能:完成PWM模块初始化 //入口参数:无 //出口参数:无 *******************/ void PWM_Init(void) { PWME=0x00; //禁止PWM模块 PWMPRCLK=0x06; //CLOCK A的预分频设置为6 PWMSCLA=125; //SA的分频因子设置为125 PWMCLK=0x01; //通道0选择SA作为PWM时钟 PWMPER0=200; //通道0周期寄存器设置为200 PWMDTY0=0; //通道0占空比寄存器设置 PWMPOL=0x01; /
[单片机]

推荐帖子

《RT-Thread设备驱动开发指南》读书笔记3一DS18B20传感器应用
rtthread最好用的地方就是,给我们提供了许多优秀的经过验证的代码,避免我们重复造轮子,加速应用快速开发。比如配置一个DS18B20温度传感器打开Setting~首先在Drivers中打开传感器组件,接着添加软件包,选择DS18B20的软件包,使用最新版本即可添加DS18B20的软件包保存,自动链接,编译,整理错误~编译后发现对uint8_t和int32_t没有适配,便在sensor_dallas_ds18b20.h中添加了#in
chrisrh 嵌入式系统
求助:关于RFID读卡器设计的问题
坛子里有没有设计过上下班打卡的那种RFID读卡器的朋友?我的毕业设计需要应用RFID读写卡器,需要自己设计。主要想实现:有人拿着一个标签,在他进入读写卡器读写范围的时候能读取标签相关信息即可。我专业是电气工程的,不懂通信和信号方面的知识。具体的参数我就提不出来了!只求坛子里有人设计过这方面的东西,给提供个芯片型号,有人推荐ADF7020我看坛子里还有人发过RF905的资料,不知道他们两款芯片的读写距离都是多少?更重要的是有人告诉我ADF7020需要设计一个接受部分、一个发送部分,但是没说清楚是不
cqr RF/无线
请问万利什么时候出独立的STLINKII?
开发板不错就是调试自己单独的电路板用它有点不太方便最好出个独立的带外科的STLINKII。还有就是开发板的例程最好能测试无误再公布而且最好加点中文注释请问万利什么时候出独立的STLINKII?估计受到了LM-LINK的启发这么下去的还应该会有NXP-LINK(LPC-LINK)等等呵呵这是个关键问题~~~2008.01.05STLINK驱动程序(含STM32FCortex-M3驱动)莫非ST
holystw stm32/stm8
汽车油量表及传感器试验检测系统机械装置研究
对汽车油量表及传感器试验要求进行了分析,设计研制了检测系统机械装置.汽车油量表及传感器试验检测系统机械装置研究写得屁话,还教授!ssssssssssssssssssssssssssffffffffffffffffffffffffffffvcvccccccgrfregsssss
frozenviolet 测试/测量
ESD增强型器件推动超高频放大器在汽车电子中的应用
汽车制造业在超高频(UHF)频段的应用要求晶体管不但具有良好的射频性能,还要很好鲁棒性。英飞凌公司生产的BFP460正是一款对应于这种应用的通用的晶体管,它是静电释放(ESD)增强型器件。它受益于具有23GHz转换频率的双极硅加工技术,能够安全地承受任意一对引脚间1500V的ESD脉冲。这种新型器件的有效性将在一种超高频低噪声放大器LNA中得以展示,这种放大器对在汽车制造业中使用非常理想。现在各种各样的汽车系统都利用了RF技术,包括无键遥控输入(RKE)、GPS、卫星数字式声频无线电服务(
frozenviolet 汽车电子
实习第二波
一实习,首先碰到的是STM32,用IAREWARM开发。20天左右的时间,我们完成了老板交给我们的一个小任务。当然,我们是在别人的例程的基础上做的,如果现在让我们重头来过,从零建立一个完整的项目文件,配置寄存器,恐怕还要费不少脑筋。仔细想想,我们连中断都没用过,来来去去就是操作GPIO,还有就是用FLASH编程实现了现场存储数据。虽然STM32没玩了,但最近玩STM8L,其实从固件库的角度来说,以及同使用iar,几乎是一样的,而我发现,我现在玩起来一点都不费劲
辛昕 Linux与安卓
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved