ST H743 可移植BSP驱动测试实验-综合

365 阅读4分钟

image.png

1 可移植BSP外设综合驱动

  • BSP外设驱动 image.png
  • bsp.c image.png
  • bsp.h image.png

2 驱动实验深入实践

2.1 按键检测(软件滤波,FIFO机制)

2.2 基于Systick滴答定时器的多组软件定时器实现

2.3 TCM,SRAM等五块内存的超方便使用方式(V1.1)

image.png image.png image.png

  • MPU设置 image.png image.png image.png
  • 主程序设计 image.png image.png
  • 结果 image.png

2.4 TCM,SRAM等五块内存的动态内存分配实现

2.5 DMAMUX的定时器触发+BDMA控制任意IO做PWM和脉冲数控制

  • 当前STM32H7有两路DMAMUX,分别是DMAMUX1和DMAMUX2,其中DMAMUX1负责DMA1和 DMA2,而 DMAMUX2 负责 BDMA。
  • DMAMUX1 有 16 个输出通道,前 8 个通道分别连接 DMA1 Stream0 到 Stream7,而后 8 个通道分别连接DMA2 Stream0到Stream7。下面DMAMUX1的前8路接到DMA1的8路数据流通道Stream0到Stream7 中。DMAMUX2 有 8 个输出通道,连接BDMA的8个输入通道
  • 对于 DMAMUX1 来说,这个接口支持 107 个 DMA 外设请求,供 DMA1 和 DMA2 的数据流使用:
  • 对于 DMAMUX2 来说,这个接口支持 9 个 DMA 外设请求,供 BDMA 通道使用
  • DMAMUX1 支持 8 种触发输入,供 DMA1 和 DMA2 使用 image.png
  • DMAMUX2 支持的 30 种触发输入,供 BDMA 使用 image.png
  • 使用半传输完成中断和传输完成中断实现的双缓冲效果跟 BDMA 本身支持的双缓冲模式实现的效果是一样的。只是最大传输个数只能达到 32767 次。
  • 相比定时器本身支持的 PWM,这种方式更加灵活,可以让任意 IO 都可以输出 PWM,而且方便运行中动态修改输出状态。
  • 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
  • 定时器触发+BDMA控制 image.png image.png image.png image.png image.png
  • 主函数 image.png
  • 结果
  • 5MHZ dd587a790d8851cc9e4b135374c8009.jpg
  • 20KHZ 11ac98bb778a556d798582a4c7872af.jpg
  • 10MHZ(已失真) 3549f18c175df54ae3c5c7fbbe56d6c.jpg

2.6 DMAMUX的定时器触发+DMA双缓冲控制任意IO做PWM和脉冲数控制

  • 当前STM32H7有两路DMAMUX,分别是DMAMUX1和DMAMUX2,其中DMAMUX1负责DMA1和 DMA2,而 DMAMUX2 负责 BDMA。
  • DMAMUX1 有 16 个输出通道,前 8 个通道分别连接 DMA1 Stream0 到 Stream7,而后 8 个通道分别连接DMA2 Stream0到Stream7。下面DMAMUX1的前8路接到DMA1的8路数据流通道Stream0到Stream7 中。DMAMUX2 有 8 个输出通道,连接BDMA的8个输入通道
  • 对于 DMAMUX1 来说,这个接口支持 107 个 DMA 外设请求,供 DMA1 和 DMA2 的数据流使用:
  • 对于 DMAMUX2 来说,这个接口支持 9 个 DMA 外设请求,供 BDMA 通道使用
  • DMAMUX1 支持 8 种触发输入,供 DMA1 和 DMA2 使用 image.png
  • DMAMUX2 支持的 30 种触发输入,供 BDMA 使用 image.png
  • TIM12CLK = 200MHz/(Period + 1) / (Prescaler + 1),函数 bsp_InitTimDMA1 中 DMAMUX1 选择的是单边沿触发,每个时钟可以触发两次。
    • uint32_t Period[2] = {1999, 19999};
    • uint32_t Pulse[2] = {1000, 10000};
  • 当选择第 1 组配置时
    • TIM12CLK = 200MHz / (Period + 1) / (Prescaler + 1) = 200MHz/(1999+1) = 100KHz
    • 占空比 = Pulse / (Period + 1) = 1000 / (1999+1)= 50%
  • 当选择第 2 组配置时,
    • TIM12CLK = 200MHz / (Period + 1) / (Prescaler + 1) = 200MHz/(19999+1) = 10KHz
    • 占空比 = Pulse / (Period + 1) = 10000 /(19999+1)= 50%
  • TIM12 的 TRGO 用于触发 DMAMUX 的请求发生器。 image.png
  • DMAMUX的定时器触发 image.png image.png image.png
  • DMA双缓冲控制 image.png image.png image.png image.png
  • 结果 image.png
  • 50KHZ 984a40197d94908145151986f0a4185.jpg
  • 5KHZ e81e3de0312dd733e7efd2cdfdb67b7.jpg

2.7 ADC定时器触发+DMA双缓冲实现

  • ADC 转换既可以选择外部触发也可以选择软件触发。定时器属于外部触发方式,使用定时器触发的好处是可以设置任何 ADC 能够支持的转换频率 image.png
  • MPU image.png
  • ADC 触发设置 image.png image.png
  • ADC DMA 设置 image.png image.png image.png image.png image.png
  • 中断 image.png image.png
  • 结果 image.png

2.8 ADC多通道过采样实现(最高可实现26位分辨率)

2.9 DAC定时器触发+DMA方式双通道同步输出

  • 注意 STM32H7 只有一个 DAC,但有两个独立的通道,跟 F4 的略不同,F4 是两个 DAC
  • 12 位分辨率,双通道,支持独立或者同时使用。两个 DAC 通道均支持 DMA。每路 DAC 输出均可与 DAC_OUTx 输出引脚断开连接,而且 DAC 输出可与片上外设连接。支持偏移校准,参考电压可以使用内部的 VREFBUF,也可以使用 VREF+引脚外接的电压基准。支持噪声波和三角波生成。这两种方案不够灵活,所以基本都采用定时器触发+DMA 方式生成任意波形。 image.png image.png
  • DAC 触发设置 image.png image.png image.png image.png
  • DAC DMA设置 image.png image.png image.png
  • 结果(注:因为PA4引脚接有电容,导致波形出现滤波),STM32H7 的 DAC 输出 100KHz 方波的效果比 F429 好不少,满幅输出,参考蓝色波形 00a5c8b1da7e0ce81418d56ff06cdd7.jpg