硬汉嵌入式论坛

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

[TIMER] STM32H7的通过COM event事件周期性更新PWM输出配置,实现了一个所谓的6step功能

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2018-8-23 01:07:22 | 显示全部楼层 |阅读模式
说明:

功能效果,一目了然
QQ截图20180823010513.png




代码,6step的切换是在函数HAL_TIMEx_CommutationCallback里面:

  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. /* Private macro -------------------------------------------------------------*/
  4. /* Private variables ---------------------------------------------------------*/
  5. /* Step Index */
  6. __IO uint32_t uwStep = 0;

  7. /* Timer handler declaration */
  8. TIM_HandleTypeDef    TimHandle;

  9. /* Timer Output Compare Configuration Structure declaration */
  10. TIM_OC_InitTypeDef              sPWMConfig1, sPWMConfig2, sPWMConfig3;
  11. /* Timer Break Configuration Structure declaration */
  12. TIM_BreakDeadTimeConfigTypeDef sBreakConfig;

  13. /* Authorize TIM COM event generation */
  14. __IO uint32_t uwAuthorizeTimComEvent = 0;

  15. /* Private function prototypes -----------------------------------------------*/
  16. static void SystemClock_Config(void);
  17. static void Error_Handler(void);
  18. static void CPU_CACHE_Enable(void);

  19. /* Private functions ---------------------------------------------------------*/

  20. /**
  21.   * @brief  Main program
  22.   * @param  None
  23.   * @retval None
  24.   */
  25. int main(void)
  26. {
  27.   
  28.   /* Enable the CPU Cache */
  29.   CPU_CACHE_Enable();

  30.   /* STM32H7xx HAL library initialization:
  31.        - Systick timer is configured by default as source of time base, but user
  32.          can eventually implement his proper time base source (a general purpose
  33.          timer for example or other time source), keeping in mind that Time base
  34.          duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
  35.          handled in milliseconds basis.
  36.        - Set NVIC Group Priority to 4
  37.        - Low Level Initialization
  38.      */
  39.   HAL_Init();

  40.   /* Configure the system clock to 400 MHz */
  41.   SystemClock_Config();

  42.   /* Configure LED2 */
  43.   BSP_LED_Init(LED2);

  44.   /*##-1- Configure the TIM peripheral #######################################*/
  45.   /* ---------------------------------------------------------------------------
  46.   TIM1 input clock (TIM1CLK) is set to 2 * APB2 clock (PCLK2), since APB2
  47.     prescaler is different from 1.
  48.     TIM1CLK = 2 * PCLK2
  49.     PCLK1 = HCLK / 2
  50.     => TIM1CLK = HCLK = SystemCoreClock
  51.   --------------------------------------------------------------------------- */

  52.   /* Initialize TIMx peripheral as follow:
  53.        + Prescaler = 0
  54.        + Period = 4095
  55.        + ClockDivision = 0
  56.        + Counter direction = Up
  57.   */
  58.   TimHandle.Instance = TIM1;
  59.   
  60.   TimHandle.Init.Period            = 4095;
  61.   TimHandle.Init.Prescaler         = 0;
  62.   TimHandle.Init.ClockDivision     = 0;
  63.   TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  64.   TimHandle.Init.RepetitionCounter = 0;

  65.   if(HAL_TIM_OC_Init(&TimHandle) != HAL_OK)
  66.   {
  67.     /* Initialization Error */
  68.     Error_Handler();
  69.   }

  70.   /*##-2- Configure the output channels ######################################*/
  71.   /* Common configuration for all channels */
  72.   sPWMConfig1.OCMode       = TIM_OCMODE_TIMING;
  73.   sPWMConfig1.OCPolarity   = TIM_OCPOLARITY_HIGH;
  74.   sPWMConfig1.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  75.   sPWMConfig1.OCIdleState  = TIM_OCIDLESTATE_SET;
  76.   sPWMConfig1.OCNIdleState = TIM_OCNIDLESTATE_SET;
  77.   sPWMConfig1.OCFastMode   = TIM_OCFAST_DISABLE;

  78.   /* Set the pulse value for channel 1 */
  79.   sPWMConfig1.Pulse = 2047;
  80.   if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1) != HAL_OK)
  81.   {
  82.     /* Configuration Error */
  83.     Error_Handler();
  84.   }
  85.   
  86.   /* Set the pulse value for channel 2 */
  87.   sPWMConfig2 = sPWMConfig1;
  88.   sPWMConfig2.Pulse = 1023;
  89.   if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig2, TIM_CHANNEL_2) != HAL_OK)
  90.   {
  91.     /* Configuration Error */
  92.     Error_Handler();
  93.   }
  94.   
  95.   /* Set the pulse value for channel 3 */
  96.   sPWMConfig3 = sPWMConfig1;
  97.   sPWMConfig3.Pulse = 511;
  98.   if(HAL_TIM_OC_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3) != HAL_OK)
  99.   {
  100.     /* Configuration Error */
  101.     Error_Handler();
  102.   }

  103.   /*##-3- Configure the Break stage ##########################################*/
  104.   sBreakConfig.OffStateRunMode  = TIM_OSSR_ENABLE;
  105.   sBreakConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
  106.   sBreakConfig.LockLevel        = TIM_LOCKLEVEL_OFF;
  107.   sBreakConfig.BreakState       = TIM_BREAK_ENABLE;
  108.   sBreakConfig.BreakPolarity    = TIM_BREAKPOLARITY_HIGH;
  109.   sBreakConfig.AutomaticOutput  = TIM_AUTOMATICOUTPUT_ENABLE;
  110.   sBreakConfig.DeadTime         = 1;
  111.   
  112.   if(HAL_TIMEx_ConfigBreakDeadTime(&TimHandle, &sBreakConfig) != HAL_OK)
  113.   {
  114.     /* Configuration Error */
  115.     Error_Handler();
  116.   }

  117.   /*##-4- Configure the commutation event: software event ####################*/
  118.   HAL_TIMEx_ConfigCommutationEvent_IT(&TimHandle, TIM_TS_NONE, TIM_COMMUTATION_SOFTWARE);

  119.   /*##-5- Start signals generation ###########################################*/
  120.   /*--------------------------------------------------------------------------*/
  121.   /* Start channel 1 */
  122.   if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
  123.   {
  124.     /* Starting Error */
  125.     Error_Handler();
  126.   }
  127.   /* Start channel 1N */
  128.   if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
  129.   {
  130.     /* Starting Error */
  131.     Error_Handler();
  132.   }
  133.   /*--------------------------------------------------------------------------*/

  134.   
  135.   /*--------------------------------------------------------------------------*/
  136.   /* Start channel 2 */
  137.   if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
  138.   {
  139.     /* Starting Error */
  140.     Error_Handler();
  141.   }
  142.   /* Start channel 2N */
  143.   if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
  144.   {
  145.     /* Starting Error */
  146.     Error_Handler();
  147.   }
  148.   /*--------------------------------------------------------------------------*/

  149.   
  150.   /*--------------------------------------------------------------------------*/
  151.   /* Start channel 3 */
  152.   if(HAL_TIM_OC_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK)
  153.   {
  154.     /* Starting Error */
  155.     Error_Handler();
  156.   }
  157.   /* Start channel 3N */
  158.   if(HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3) != HAL_OK)
  159.   {
  160.     /* Starting Error */
  161.     Error_Handler();
  162.   }

  163.   /* Authorize TIM COM event generation */
  164.   uwAuthorizeTimComEvent = 1;

  165.   while (1)
  166.   {
  167.   }
  168. }

  169. /**
  170.   * @brief  Commutation event callback in non blocking mode
  171.   * @param  htim : Timer handle
  172.   * @retval None
  173.   */
  174. void HAL_TIMEx_CommutationCallback(TIM_HandleTypeDef *htim)
  175. {
  176.   /* Entry state */
  177.   if (uwStep == 0)
  178.   {
  179.     /* Next step: Step 1 Configuration -------------------------------------- */
  180.     sPWMConfig1.OCMode     = TIM_OCMODE_PWM1;
  181.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1);
  182.     HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);
  183.     HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_1);

  184.     /*  Channel3 configuration */
  185.     sPWMConfig3.OCMode     = TIM_OCMODE_PWM1;
  186.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3);
  187.     HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3);
  188.     HAL_TIM_PWM_Stop(&TimHandle, TIM_CHANNEL_3);

  189.     /*  Channel2 configuration */
  190.     HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_2);
  191.     HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_2);
  192.     uwStep = 1;
  193.   }

  194.   if (uwStep == 1)
  195.   {
  196.     /* Next step: Step 2 Configuration -------------------------------------- */
  197.     /*  Channel1 configuration */
  198.     /* Same configuration as the previous step */

  199.     /*  Channel2 configuration */
  200.     sPWMConfig2.OCMode     = TIM_OCMODE_PWM1;
  201.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig2, TIM_CHANNEL_2);
  202.     HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_2);

  203.     /*  Channel3 configuration */
  204.     HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_3);

  205.     uwStep++;
  206.   }

  207.   else if (uwStep == 2)
  208.   {
  209.     /* Next step: Step 3 Configuration -------------------------------------- */
  210.     /*  Channel2 configuration */
  211.     /* Same configuration as the previous step */

  212.     /*  Channel3 configuration */
  213.     sPWMConfig3.OCMode     = TIM_OCMODE_PWM1;
  214.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3);
  215.     HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_3);

  216.     /*  Channel1 configuration */
  217.     HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_1);

  218.     uwStep++;
  219.   }

  220.   else if (uwStep == 3)
  221.   {
  222.     /* Next step: Step 4 Configuration -------------------------------------- */
  223.     /*  Channel3 configuration */
  224.     /* Same configuration as the previous step */

  225.     /*  Channel2 configuration */
  226.     HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_2);

  227.     /*  Channel1 configuration */
  228.     sPWMConfig1.OCMode     = TIM_OCMODE_PWM1;
  229.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1);
  230.     HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_1);

  231.     uwStep++;
  232.   }
  233.   else if (uwStep == 4)
  234.   {
  235.     /* Next step: Step 5 Configuration -------------------------------------- */
  236.     /*  Channel3 configuration */
  237.     HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_3);

  238.     /*  Channel1 configuration */
  239.     /* Same configuration as the previous step */

  240.     /*  Channel2 configuration */
  241.     sPWMConfig2.OCMode     = TIM_OCMODE_PWM1;
  242.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig2, TIM_CHANNEL_2);
  243.     HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2);

  244.     uwStep++;
  245.   }

  246.   else if (uwStep == 5)
  247.   {
  248.     /* Next step: Step 6 Configuration -------------------------------------- */
  249.     /*  Channel3 configuration */
  250.     sPWMConfig3.OCMode     = TIM_OCMODE_PWM1;
  251.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig3, TIM_CHANNEL_3);
  252.     HAL_TIMEx_OCN_Start(&TimHandle, TIM_CHANNEL_3);

  253.     /*  Channel1 configuration */
  254.     HAL_TIMEx_OCN_Stop(&TimHandle, TIM_CHANNEL_1);

  255.     /*  Channel2 configuration */
  256.     /* Same configuration as the previous step */

  257.     uwStep++;
  258.   }

  259.   else
  260.   {
  261.     /* Next step: Step 1 Configuration -------------------------------------- */
  262.     /*  Channel1 configuration */
  263.     sPWMConfig1.OCMode     = TIM_OCMODE_PWM1;
  264.     HAL_TIM_PWM_ConfigChannel(&TimHandle, &sPWMConfig1, TIM_CHANNEL_1);
  265.     HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);

  266.     /*  Channel3 configuration */
  267.     /* Same configuration as the previous step */

  268.     /*  Channel2 configuration */
  269.     HAL_TIM_OC_Stop(&TimHandle, TIM_CHANNEL_2);

  270.     uwStep = 1;
  271.   }
  272. }
复制代码



回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
发表于 2021-4-22 11:38:33 | 显示全部楼层
跑官方例子没有波形,硬件上需要什么触发吗?GPIO TIM1_BKIN PB12
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
 楼主| 发表于 2021-4-23 08:29:13 | 显示全部楼层
lindahnu 发表于 2021-4-22 11:38
跑官方例子没有波形,硬件上需要什么触发吗?GPIO TIM1_BKIN PB12

例子里面有个readme的说明文件,看下
回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
发表于 2021-4-23 10:08:21 | 显示全部楼层
波形终于有了,但是通道TIM1_CH1N上的波形不对,结束后仍然输出,其他通道上都没有,这是什么原因呢?
无标题.png
回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
发表于 2021-4-23 15:01:48 | 显示全部楼层
eric2013 发表于 2021-4-23 08:29
例子里面有个readme的说明文件,看下

波形不对,会是什么原因?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
 楼主| 发表于 2021-4-23 17:20:47 | 显示全部楼层
lindahnu 发表于 2021-4-23 15:01
波形不对,会是什么原因?

没停止成功
HAL_TIMEx_OCN_Stop再调用一次试试
回复

使用道具 举报

56

主题

131

回帖

299

积分

高级会员

积分
299
发表于 2021-4-25 13:27:23 | 显示全部楼层
eric2013 发表于 2021-4-23 17:20
没停止成功
HAL_TIMEx_OCN_Stop再调用一次试试

换了一个TIM_CH1N对应的IO就没有问题了,这个也很奇怪,原来的IO也没有用其他功能
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
 楼主| 发表于 2021-4-26 11:29:47 | 显示全部楼层
lindahnu 发表于 2021-4-25 13:27
换了一个TIM_CH1N对应的IO就没有问题了,这个也很奇怪,原来的IO也没有用其他功能

这确实有点诡异,回头我也测测。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 14:18 , Processed in 0.188496 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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