打印
[STM32F0]

基于HAL库的PWM+DMA的例程代码

[复制链接]
1411|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiajs|  楼主 | 2022-4-13 23:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用Cube生成的代码,单纯PWM是可以的。但不知道为什么PWM加上DMA后完全没用,不可控。

使用特权

评论回复
沙发
jiajs|  楼主 | 2022-4-13 23:33 | 只看该作者
谁能发个例程给我

使用特权

评论回复
板凳
supernan| | 2022-4-13 23:35 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
地板
jiajs|  楼主 | 2022-4-13 23:38 | 只看该作者
STM32F030芯片,代码几乎都是用Cube生成的,除了main函数上的几行代码。

使用特权

评论回复
5
jiajs|  楼主 | 2022-4-13 23:40 | 只看该作者
int main(void)

{

  /* USER CODE BEGIN 1 */

        uint16_t i;

  /* 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_TIM3_Init();

  MX_DMA_Init();

  /* USER CODE BEGIN 2 */

        

        for(i = 0; i < SEND_SIZE; i++)

        {

                pwm_buf[i] = 200;

        }

  /* USER CODE END 2 */



  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */



    /* USER CODE BEGIN 3 */

               

                HAL_TIM_PWM_Start_DMA(&htim3, TIM_CHANNEL_3, (uint32_t *)(&(pwm_buf[0])), SEND_SIZE*2);

                HAL_Delay(200);

  }

  /* USER CODE END 3 */

}

使用特权

评论回复
6
jiajs|  楼主 | 2022-4-13 23:42 | 只看该作者
static void MX_TIM3_Init(void)

{



  /* USER CODE BEGIN TIM3_Init 0 */



  /* USER CODE END TIM3_Init 0 */



  TIM_ClockConfigTypeDef sClockSourceConfig = {0};

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  TIM_OC_InitTypeDef sConfigOC = {0};



  /* USER CODE BEGIN TIM3_Init 1 */



  /* USER CODE END TIM3_Init 1 */

  htim3.Instance = TIM3;

  htim3.Init.Prescaler = 0;

  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim3.Init.Period = 10000;

  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)

  {

    Error_Handler();

  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)

  {

    Error_Handler();

  }

  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)

  {

    Error_Handler();

  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)

  {

    Error_Handler();

  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;

  sConfigOC.Pulse = 0;

  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)

  {

    Error_Handler();

  }

  __HAL_TIM_DISABLE_OCxPRELOAD(&htim3, TIM_CHANNEL_3);

  /* USER CODE BEGIN TIM3_Init 2 */



  /* USER CODE END TIM3_Init 2 */

  HAL_TIM_MspPostInit(&htim3);



}

使用特权

评论回复
7
jiajs|  楼主 | 2022-4-13 23:44 | 只看该作者
static void MX_DMA_Init(void)

{



  /* DMA controller clock enable */

  __HAL_RCC_DMA1_CLK_ENABLE();



  /* DMA interrupt init */

  /* DMA1_Channel2_3_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);

  HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);



}

使用特权

评论回复
8
chuxh| | 2022-4-13 23:47 | 只看该作者
static void MX_GPIO_Init(void)

{



  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOB_CLK_ENABLE();



}

使用特权

评论回复
9
jiajs|  楼主 | 2022-4-13 23:49 | 只看该作者
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)

{

  if(htim_base->Instance==TIM3)

  {

  /* USER CODE BEGIN TIM3_MspInit 0 */



  /* USER CODE END TIM3_MspInit 0 */

    /* Peripheral clock enable */

    __HAL_RCC_TIM3_CLK_ENABLE();

  

    /* TIM3 DMA Init */

    /* TIM3_CH3 Init */

    hdma_tim3_ch3.Instance = DMA1_Channel2;

    hdma_tim3_ch3.Init.Direction = DMA_MEMORY_TO_PERIPH;

    hdma_tim3_ch3.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_tim3_ch3.Init.MemInc = DMA_MINC_ENABLE;

    hdma_tim3_ch3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;

    hdma_tim3_ch3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;

    hdma_tim3_ch3.Init.Mode = DMA_CIRCULAR;

    hdma_tim3_ch3.Init.Priority = DMA_PRIORITY_VERY_HIGH;

    if (HAL_DMA_Init(&hdma_tim3_ch3) != HAL_OK)

    {

      Error_Handler();

    }



    __HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_CC3],hdma_tim3_ch3);



  /* USER CODE BEGIN TIM3_MspInit 1 */



  /* USER CODE END TIM3_MspInit 1 */

  }



}

使用特权

评论回复
10
jiajs|  楼主 | 2022-4-13 23:52 | 只看该作者
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(htim->Instance==TIM3)

  {

  /* USER CODE BEGIN TIM3_MspPostInit 0 */



  /* USER CODE END TIM3_MspPostInit 0 */

  

    __HAL_RCC_GPIOB_CLK_ENABLE();

    /**TIM3 GPIO Configuration   

    PB0     ------> TIM3_CH3

    */

    GPIO_InitStruct.Pin = GPIO_PIN_0;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;

    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);



  /* USER CODE BEGIN TIM3_MspPostInit 1 */



  /* USER CODE END TIM3_MspPostInit 1 */

  }



}

使用特权

评论回复
11
renyaq| | 2022-4-13 23:54 | 只看该作者
你现在不是要例程的问题,应该先将基本的原理搞清楚。

使用特权

评论回复
12
dengdc| | 2022-4-13 23:56 | 只看该作者
比方 你现在想用DMA,那DMA请求是什么,从哪里传到哪里?

使用特权

评论回复
13
zhenykun| | 2022-4-13 23:58 | 只看该作者
使用DMA 是不是要做波形输出?

使用特权

评论回复
14
huquanz711| | 2022-4-14 08:35 | 只看该作者
肯定是配置没对三

使用特权

评论回复
15
juventus9554| | 2022-4-14 20:33 | 只看该作者
例如简单的 SIN 正弦波 ?

使用特权

评论回复
16
dingy| | 2022-4-14 20:37 | 只看该作者
或者数组里面的波形?是这个意思吗?

使用特权

评论回复
17
jiajs|  楼主 | 2022-4-14 20:39 | 只看该作者
是的,就是想输出数组里的波形。

使用特权

评论回复
18
jiajs|  楼主 | 2022-4-14 20:41 | 只看该作者
我想做的事情很简单啊。。就是想把数组的一段波形数据输出给TIM的PWM上。

使用特权

评论回复
19
zhenykun| | 2022-4-14 20:44 | 只看该作者
那个似乎应该是DDS该干的事情。。。你用两个定时器控制如何?

使用特权

评论回复
20
yszong| | 2022-4-14 20:46 | 只看该作者
请问dds是什么啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

940

主题

11975

帖子

6

粉丝