搜索
bottom↓
回复: 2

stm32g030f使用TIM1_PWM_DMA丢信号,频率降了一半有遇到过的吗?

[复制链接]

出0入53汤圆

发表于 2022-10-28 21:39:58 | 显示全部楼层 |阅读模式
本帖最后由 zhcj66 于 2022-10-28 21:41 编辑

如题<stm32g030f使用TIM1_PWM_DMA丢信号,频率降了一半有遇到过的吗?>

使用定时器直接产生固定脉宽的pwm信号正常,100hz,

但是使用DMA时,发送了10组pwm数据,竟然出现了5个波形,频率也减了一半,成了50hz

请问坛友有遇到过的吗?

  1. static void MX_TIM1_Init(void)
  2. {

  3.   /* USER CODE BEGIN TIM1_Init 0 */

  4.   /* USER CODE END TIM1_Init 0 */

  5.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  6.   TIM_OC_InitTypeDef sConfigOC = {0};
  7.   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  8.   /* USER CODE BEGIN TIM1_Init 1 */

  9.   /* USER CODE END TIM1_Init 1 */
  10.   htim1.Instance = TIM1;
  11.   htim1.Init.Prescaler = 4800;//48000;//0;
  12.   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  13.   htim1.Init.Period = 100-1;//59;
  14.   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  15.   htim1.Init.RepetitionCounter = 0;
  16.   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  17.   if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  18.   {
  19.     Error_Handler();
  20.   }
  21.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  22.   sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  23.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  24.   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  25.   {
  26.     Error_Handler();
  27.   }
  28.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  29.   sConfigOC.Pulse = 50;//占空比
  30.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  31.   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  32.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  33.   sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  34.   sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  35.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  36.   {
  37.     Error_Handler();
  38.   }
  39.   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  40.   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  41.   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  42.   sBreakDeadTimeConfig.DeadTime = 0;
  43.   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  44.   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  45.   sBreakDeadTimeConfig.BreakFilter = 0;
  46.   sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
  47.   sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
  48.   sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
  49.   sBreakDeadTimeConfig.Break2Filter = 0;
  50.   sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
  51.   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  52.   if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  53.   {
  54.     Error_Handler();
  55.   }
  56.   /* USER CODE BEGIN TIM1_Init 2 */

  57.   /* USER CODE END TIM1_Init 2 */
  58.   HAL_TIM_MspPostInit(&htim1);

  59. }


  60. static void MX_DMA_Init(void)
  61. {

  62.   /* DMA controller clock enable */
  63.   __HAL_RCC_DMA1_CLK_ENABLE();

  64.   /* DMA interrupt init */
  65.   /* DMA1_Channel1_IRQn interrupt configuration */
  66.   HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
  67.   HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  68.   /* DMA1_Channel2_3_IRQn interrupt configuration */
  69.   HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0);
  70.   HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);

  71. }


  72. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
  73. {
  74.   if(htim_pwm->Instance==TIM1)
  75.   {
  76.   /* USER CODE BEGIN TIM1_MspInit 0 */
  77. //GPIO_InitTypeDef GPIO_InitStruct = {0};
  78.   /* USER CODE END TIM1_MspInit 0 */
  79.     /* Peripheral clock enable */
  80.     __HAL_RCC_TIM1_CLK_ENABLE();

  81.     /* TIM1 DMA Init */
  82.     /* TIM1_CH1 Init */
  83.     hdma_tim1_ch1.Instance = DMA1_Channel2;
  84.     hdma_tim1_ch1.Init.Request = DMA_REQUEST_TIM1_CH1;                                       
  85.     hdma_tim1_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;                               
  86.     hdma_tim1_ch1.Init.PeriphInc = DMA_PINC_DISABLE;                                       
  87.     hdma_tim1_ch1.Init.MemInc = DMA_MINC_ENABLE;                                               
  88.     hdma_tim1_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;       
  89.     hdma_tim1_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;               
  90.     hdma_tim1_ch1.Init.Mode = DMA_NORMAL;                                                               
  91.     hdma_tim1_ch1.Init.Priority = DMA_PRIORITY_HIGH;                                       
  92.     if (HAL_DMA_Init(&hdma_tim1_ch1) != HAL_OK)
  93.     {
  94.       Error_Handler();
  95.     }
  96.        
  97.     __HAL_LINKDMA(htim_pwm,hdma[TIM_DMA_ID_CC1],hdma_tim1_ch1);

  98.   /* USER CODE BEGIN TIM1_MspInit 1 */

  99.   /* USER CODE END TIM1_MspInit 1 */
  100.   }

  101. }


  102. unsigned int timeDmaBuf[50];

  103. void pwm_dma_test(void){
  104. unsigned char i;
  105.                 TIM_PWM_DMA_SW = 0;
  106.                 for(i=0;i<10;i++){
  107.                         timeDmaBuf[i] = i*10+10;
  108.                 }
  109.                 HAL_TIM_PWM_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t*)timeDmaBuf,10);
  110. }


  111. int main(void)
  112. {
  113.   /* USER CODE BEGIN 1 */

  114.   /* USER CODE END 1 */

  115.   /* MCU Configuration--------------------------------------------------------*/

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

  118.   /* USER CODE BEGIN Init */

  119.   /* USER CODE END Init */

  120.   /* Configure the system clock */
  121.   SystemClock_Config();

  122.   /* USER CODE BEGIN SysInit */

  123.   /* USER CODE END SysInit */

  124.   /* Initialize all configured peripherals */
  125.   MX_GPIO_Init();
  126.   MX_DMA_Init();
  127.   MX_SPI1_Init();
  128.   MX_TIM14_Init();
  129.   MX_TIM1_Init();
  130.   /* USER CODE BEGIN 2 */

  131.   /* USER CODE END 2 */

  132.   /* Infinite loop */
  133.   /* USER CODE BEGIN WHILE */
  134.   while (1)
  135.   {
  136.     /* USER CODE END WHILE */
  137.        
  138.     /* USER CODE BEGIN 3 */
  139.           pwm_dma_test();
  140.           HAL_Delay(200);
  141.   }
  142.   /* USER CODE END 3 */
  143. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入53汤圆

 楼主| 发表于 2022-10-31 11:17:33 | 显示全部楼层
这个问题大家都没有遇到过,或者做过的,发一下代码我对比一下

出0入53汤圆

 楼主| 发表于 2022-11-18 15:14:54 | 显示全部楼层
问题找到了,DMA是用的DMA_PDATAALIGN_HALFWORD  16位

unsigned int timeDmaBuf[50];   这里int 是32位;

修改timeDmaBuf的类型 把int改成short 波形搞定了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-19 06:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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