硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1346|回复: 13
收起左侧

STM32F429官方探索板-DMA+PWM通过GPIO输出指定数量脉冲

[复制链接]

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2024-9-10 14:51:10 | 显示全部楼层 |阅读模式
大神们,

        请教一个问题,我想使用一个GPIO输出频率范围为5-10Mhz的脉冲,并且脉冲数量可以自己定义,网上看到有通过DMA输出的方式,但是没有找到具体例程,有没有大神做过相关功能或者给一点建议?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-11 00:18:57 | 显示全部楼层
f429没做,h7做这种demo了
教程第41和43章节

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔,更新至95章(2024-05-06)
https://forum.anfulai.cn/forum.p ... 6980&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2024-9-11 08:32:51 | 显示全部楼层
eric2013 发表于 2024-9-11 00:18
f429没做,h7做这种demo了
教程第41和43章节

麻烦问下,F429也可以支持这种方式的是吧?
回复

使用道具 举报

5

主题

162

回帖

177

积分

初级会员

积分
177
发表于 2024-9-12 23:08:10 | 显示全部楼层
liwei0225 发表于 2024-9-11 08:32
麻烦问下,F429也可以支持这种方式的是吧?

可以的 很简单的,就是需要一个能挂在DMA上的定时器就可以了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-13 09:42:03 | 显示全部楼层
liwei0225 发表于 2024-9-11 08:32
麻烦问下,F429也可以支持这种方式的是吧?

可以,使用定时器UP更新事件触发DMA传输就行。
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2024-9-14 14:37:00 | 显示全部楼层
eric2013 发表于 2024-9-13 09:42
可以,使用定时器UP更新事件触发DMA传输就行。

群主,麻烦问下有HAL版的例程吗?
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2024-9-14 14:37:22 | 显示全部楼层
2859932063 发表于 2024-9-12 23:08
可以的 很简单的,就是需要一个能挂在DMA上的定时器就可以了

你好,能给个例程吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-15 09:42:45 | 显示全部楼层
liwei0225 发表于 2024-9-14 14:37
群主,麻烦问下有HAL版的例程吗?

就是二楼回复的,这个仅H7做了,其它系列没有做对应例子。
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2024-9-19 15:40:50 | 显示全部楼层
eric2013 发表于 2024-9-15 09:42
就是二楼回复的,这个仅H7做了,其它系列没有做对应例子。

群主,麻烦帮忙看下我的配置代码吧,dma 的NDTR寄存器减1后,就不变了,state显示一直处于busy状态。
/**
  * @brief TIM4 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM4_Init(void)
{

  /* USER CODE BEGIN TIM4_Init 0 */

  /* USER CODE END TIM4_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM4_Init 1 */

  /* USER CODE END TIM4_Init 1 */
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 0;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 16-1;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_TIMING;
  sConfigOC.Pulse = 8;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_OC_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM4_Init 2 */
  /* USER CODE END TIM4_Init 2 */
  HAL_TIM_MspPostInit(&htim4);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(htim_base->Instance==TIM4)
  {
  /* USER CODE BEGIN TIM4_MspInit 0 */

  /* USER CODE END TIM4_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM4_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**TIM4 GPIO Configuration
    PB8     ------> TIM4_CH3
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* TIM4 DMA Init */
    /* TIM4_UP Init */
    hdma_tim4_up.Instance = DMA1_Stream6;
    hdma_tim4_up.Init.Channel = DMA_CHANNEL_2;
    hdma_tim4_up.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_tim4_up.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim4_up.Init.MemInc = DMA_MINC_ENABLE;
    hdma_tim4_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_tim4_up.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_tim4_up.Init.Mode = DMA_CIRCULAR;
    hdma_tim4_up.Init.Priority = DMA_PRIORITY_LOW;
    hdma_tim4_up.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_tim4_up) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_UPDATE],hdma_tim4_up);

  /* USER CODE BEGIN TIM4_MspInit 1 */

  /* USER CODE END TIM4_MspInit 1 */

  }

}






回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2024-9-19 15:41:11 | 显示全部楼层
C:\Users\wli\Pictures\Screenshots
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2024-9-19 16:03:56 | 显示全部楼层
这个是寄存器的数值照片
Screenshot 2024-09-19 153830.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-20 09:18:06 | 显示全部楼层
liwei0225 发表于 2024-9-19 16:03
这个是寄存器的数值照片

启动DMA传输在那里调用的。
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2024-9-20 09:59:49 | 显示全部楼层
eric2013 发表于 2024-9-20 09:18
启动DMA传输在那里调用的。

在主函数里:

int main(void)
{

  /* USER CODE BEGIN 1 */
uint16_t buff[20] ={0x0000, 0x0008, 0x0004, 00002, 0x0001,0,0x0008, 0x0004, 00002, 0x0001,0x0000, 0x0008, 0x0004, 00002, 0x0001,0,0x0008, 0x0004, 00002, 0x0001};
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */
  htim4.hdma[0]->XferCpltCallback = TransferComplete;
  htim4.hdma[0]->XferErrorCallback = TransferError ;
  if (HAL_DMA_Start_IT(htim4.hdma[TIM_DMA_ID_UPDATE], (uint32_t)&buff, GPIOD_ODR, 20) != HAL_OK)
  {
    /* Transfer Error */
    Error_Handler();
  }

  /* USER CODE END 2 */
__HAL_DMA_DISABLE_IT(htim4.hdma[TIM_DMA_ID_UPDATE], DMA_IT_TC);

  __HAL_TIM_ENABLE_DMA(&htim4, TIM_DMA_ID_UPDATE);


  /* Start TIM PWM channel 1 */
  if (HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2) != HAL_OK)
  {
    /* PWM Generation Error */
    Error_Handler();
  }
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

Screenshot 2024-09-20 095630.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-21 09:53:57 | 显示全部楼层
liwei0225 发表于 2024-9-20 09:59
在主函数里:

int main(void)

你把完整的代码贴出来,我看下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 03:45 , Processed in 0.048301 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表