STM32 HAL库定时器触发DMA并口数据传输

这篇具有很好参考价值的文章主要介绍了STM32 HAL库定时器触发DMA并口数据传输。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码目的:

STM32与FPGA通讯,通过8位并口线进行通讯,16byte的数据在10us之内通过8位并口数据线传给FPGA,FPGA读取该数据。

HAL库设置说明:

时钟采用80MHz,由于16byte的数据要在10us之内传完,那么10/(16*2)=0.3125us/次,也就是传输频率得≥3.2MHz。
hal 读并口数据,STM32学习,stm32,fpga开发,嵌入式硬件

定时器设置:为了方便起见,先选用了4MHz的传输频率。80MHz/((1+1) * (9 + 1)) = 4MHz,PWM的占空比为5/10=50%
hal 读并口数据,STM32学习,stm32,fpga开发,嵌入式硬件

  • 关于PWM
    PWM中Pulse与占空比有关,当定时器计数递增模式下,计数值从0开始,当CNT的值小于CCRx(也就是Pulse),则输出CH Polarity的极性,当大于CCRx则输出相反极性,当CNT的值=ARR(counter period),则定时器溢出重新开始计数。

  • 启动PWM有3种方式
    hal 读并口数据,STM32学习,stm32,fpga开发,嵌入式硬件
    顾名思义可以看出来,第一种启动后就开始输出;第二种是带中断方式,能产生中断;第三种就是DMA的方式,这种应用在电机精准步进控制上比较多,我打算通过这章方式应用到数据传输中,因为传输速度比较快,如果人为进行管脚输出我试过,16byte的数据即使在80MHz的时钟下也得50us左右,因为准备用DMA的方式。以上三种方式各有各的应用场景。

定时器触发DMA设置说明:传输方向是内存到外设端口,传输宽度16位=half word
hal 读并口数据,STM32学习,stm32,fpga开发,嵌入式硬件hal 读并口数据,STM32学习,stm32,fpga开发,嵌入式硬件

代码实现

由于我设置的传输宽度是16位的,因此定义一组16位的数据缓冲区:
uint16_t databuf[16];
原来的HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)查看具体的代码可以知道,主要是针对PWM的占空比进行配置的。因此重写该函数,将外设地址改为GPIOF端口:
HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)(&(GPIOF->ODR)), Length)
在主函数中进行调用即可。
MY_TIM_PWM_Start_DMA(&htim5,TIM_CHANNEL_2,(uint32_t *)(&databuf), 16);
在回调函数HAL_TIM_PWM_PulseFinishedCallback中停止DMA,并置标志位u8dmacop ,为下一次传输做准备。

  while (1)//主函数中
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  if(u8dmacop)
	  {
		  u8dmacop = 0;
			htim5.Instance->CNT = 0;
			HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET);
			MY_TIM_PWM_Start_DMA(&htim5,TIM_CHANNEL_2,(uint32_t *)(&databuf), 16);
	  }
  }
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	if( htim == &htim5)
	{
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
		u8dmacop = 1;
		HAL_TIM_PWM_Stop_DMA(&htim5, TIM_CHANNEL_2);
		htim5.Instance->CNT = 0;
	}

}

其中HAL_TIM_PWM_PulseFinishedCallback是计数器CNT = CCRx值时进行触发,另外还有一个函数HAL_TIM_PWM_PeriodElapsedCallback,该函数是计数溢出时触发,也就是整个周期结束,CNT=ARR时。
为了用示波器查看方便,把缓冲区数据做递增处理,使得8位并口线最低位可以看到数据的来回变化。用示波器在PF7管脚可以看到4MHz的PWM波在输出,数据最低位管脚在2MHz的频率变化,输出波形有8个,也就是16组数据。文章来源地址https://www.toymoban.com/news/detail-787945.html

到了这里,关于STM32 HAL库定时器触发DMA并口数据传输的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 ADC+定时器+DMA+FFT

    本次实现的功能为单片机DAC输出一个正弦波,然后ADC定时采样用DMA输出,最后对DAC输出的波形进行FFT。 单片机STM32F103ZET6 内部时钟 一、配置ADC ADC端口为PA1,采用DMA输出,定时器3触发 定时器时钟64M,分频后为102.4KHz ADC采样时间为102.4KHz/100=1.024KHz 二、配置DAC DAC端口PA4 DMA传输

    2024年02月13日
    浏览(44)
  • 【STM32】- 定时器+DMA+ADC 双重模式

    目录   1 前言 2 ADC介绍 2.1 多重工作模式 2.2 多重ADC框图 2.3 规则同时模式 3 程序设计 3.1 时序图 3.2 初始化流程图 3.3 初始化代码 4 结论        关于ADC,相信大家都比较了解,关于STM32的学习教程都会有所讲解,但以查询方式、单通道讲解的较多,主要告诉大家基本的原理。

    2024年02月10日
    浏览(56)
  • STM32定时器DMA连续传送功能示例

    在STM32定时器应用中,定时器事件配合DMA连续传输可对定时器的多个寄存器进行读写访问。 定时器事件可以请求DMA,分为以下几种;并不是所有定时器都支持以下事件, 高级定时器是支持的。其他定时器按功能部分支持,例如基础定时器因为没有输出输入通道,所以只有更新

    2024年02月11日
    浏览(42)
  • 基于STM32的定时器--定时中断(HAL库)

    本文旨在介绍如何使用STM32CubeMX配置+KEIL 5开发一个每10us定时器中断触发一次的项目。帮助初学者入门STM32的定时器使用。 定时器是STM32微控制器中非常重要的功能模块之一,用于计时、生成精确的时间延迟、触发事件等。STM32微控制器通常具有多个定时器模块,包括通用定时

    2024年02月14日
    浏览(58)
  • Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步)

    本文的初衷一方面是将我的一些关于STM32开发方面浅显的个人经验分享给初学者、并期望得到大佬的批评指正,另一方面是记录自己的实验过程便于回顾。 我预感应该要写很多,不过鉴于之前的数篇笔迹中,对于SPI/DMA/ADXL3XX系列加表的使用已经详细描述过了,所以这篇博客只

    2024年02月10日
    浏览(54)
  • STM32 HAL库-定时器中断

    关闭或开启所有中断;代码如下: STM32F407 有众多的定时器,其中包括 2 个基本定时器(TIM6 和 TIM7)、10 个通用定时 器(TIM2 ~ TIM5、TIM9 ~TIM14)、2 个高级控制定时器(TIM1 和 TIM8),这些定时器彼此完 全独立,不共享任何资源。 选择定时器,配置时钟源,设置预分频系数,计

    2024年01月25日
    浏览(65)
  • STM32F407 ADC+DMA+定时器 定时采样模拟量

    项目中需要对多个通道的电压进行一定频率的AD采样,由于采样过程贯穿整个任务,为了使采样过程尽可能不占用CPU资源,采用定时器触发的多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存。 这样做有以下几个好处:1、由定时器触发ADC采样,这样采样的频率可控,且定时

    2024年02月14日
    浏览(50)
  • stm32——hal库学习笔记(定时器)

    使用纯软件(CPU死等)的方式实现定时(延时)功能 使用精准的时基,通过硬件的方式,实现定时功能 递增计数模式实例说明 中心对齐模式实例说明 TIM6 和TIM7 控制寄存器 1(TIMx_CR1) TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER) TIM6 和TIM7 状态寄存器(TIMx_SR) TIM6 和TIM7 计数器(TIMx_CNT)

    2024年02月21日
    浏览(56)
  • # HAL库STM32常用外设教程(四)—— 定时器 基本定时

    1、STM32F407ZGT6 2、STM32CubeMx软件 3、keil5 内容简述: 通篇文章将涉及以下内容,如有错误,欢迎指出 : 1、基础定时器特性 2、基础定时器的结构和功能 3、基础定时器HAL库驱动程序 (1)CubeMx配置 (2)TIM驱动程序   STM32F407有2个高级控制定时器(TIM1、TIM8)、8个通用定时器和

    2024年02月02日
    浏览(68)
  • STM32 HAL库 STM32CubeMX -- TIM(定时器中断)

    STM32F1 系列中,除了一些特殊的型号,大部分F1有8 个定时器,分为 基本定时器,通用定时器和高级定时器 。 基本定时器TIM6 和TIM7 是一个16 位的只能向上计数的定时器,只能定时,没有外部IO。 通用定时器TIM2/3/4/5 是一个16 位的可以向上/下计数的定时器,可以定时,可以输出

    2024年02月16日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包