硬汉嵌入式论坛

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

[NUCLEO-H743ZI] 【STM32H743实验例程】实验19:STM32H743实现定时器PWM输出

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-4-30 00:45:02 | 显示全部楼层 |阅读模式
实验介绍
开发平台:官方STM32H743 NUCLEO板子
开发环境:MDK5.25正式版
软件版本:
(1)CMSIS软件包 V5.3.0
(2)H7的HAL库版本 V1.2.0

例程下载: 实验19:STM32H743实现定时器PWM.7z (1.1 MB, 下载次数: 213)



输出的1MHz PWM,后面拍个示波器的测试效果传上来,使用的TIM1,CH1,引脚PE9


  1. /*
  2. *********************************************************************************************************
  3. *                                                                        配置一个TIM1
  4. *********************************************************************************************************
  5. */
  6. TIM_HandleTypeDef htim1;

  7. /*
  8. *********************************************************************************************************
  9. *        函 数 名: bsp_Tim1Init
  10. *        功能说明: 配置定时器1,周期中断。
  11. *        形    参: 无
  12. *        返 回 值: 无
  13. *********************************************************************************************************
  14. */
  15. void bsp_Tim1Init(void)
  16. {
  17.     /* --------------------------------------------------------
  18.     时钟的配置如下:

  19.         System Clock source            = PLL (HSE BYPASS)
  20.         SYSCLK(Hz)                     = 400000000 (CPU Clock)
  21.         HCLK(Hz)                       = 200000000 (AXI and AHBs Clock)
  22.         AHB Prescaler                  = 2
  23.         D1 APB3 Prescaler              = 2 (APB3 Clock  100MHz)
  24.         D2 APB1 Prescaler              = 2 (APB1 Clock  100MHz)
  25.         D2 APB2 Prescaler              = 2 (APB2 Clock  100MHz)
  26.         D3 APB4 Prescaler              = 2 (APB4 Clock  100MHz)

  27.     因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = APB1 x 2 = 200MHz;
  28.     因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = APB2 x 2  =  200MHz;
  29.     APB4上面的TIMxCLK没有分频,所以就是100MHz;

  30.     APB1 定时器有 TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14,LPTIM1
  31.     APB2 定时器有 TIM1, TIM8 ,TIM9, TIM15, TIM16,TIM17

  32.     APB4 定时器有 LPTIM2,LPTIM3,LPTIM4,LPTIM5
  33.    
  34.     TIM6 更新周期是 = TIM1CLK / (Period + 1)/(Prescaler + 1)
  35.         根据如下的配置,更新周期是:
  36.         TIM6CLK /(Period + 1)/(Prescaler + 1)
  37.         = 200MHz /199+1)/0+1)
  38.         = 10Hz
  39.     ----------------------------------------------------------- */
  40.         
  41.         GPIO_InitTypeDef GPIO_InitStruct;
  42.         TIM_OC_InitTypeDef sConfigOC;

  43.         /* 使用引脚PE9 */
  44.         __HAL_RCC_GPIOE_CLK_ENABLE();
  45.          
  46.         GPIO_InitStruct.Pin = GPIO_PIN_9;
  47.         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  48.         GPIO_InitStruct.Pull = GPIO_NOPULL;
  49.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  50.         GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
  51.         HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  52.         
  53.         /* 使能定时器的时钟 */
  54.         __HAL_RCC_TIM1_CLK_ENABLE();
  55.         
  56.         
  57.         /*##-1- 配置定时器外设 #######################################*/
  58.         htim1.Instance = TIM1;
  59.         htim1.Init.Prescaler = 0;
  60.         htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  61.         htim1.Init.Period = 199;
  62.         htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  63.         htim1.Init.RepetitionCounter = 0;
  64.         htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  65.         
  66.         /*##-2- 使能定时器 ##########################################*/
  67.         if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  68.         {
  69.                 Error_Handler(__FILE__, __LINE__);
  70.         }
  71.         
  72.         /* 配置模式 */
  73.         sConfigOC.OCMode = TIM_OCMODE_PWM1;
  74.         sConfigOC.Pulse = htim1.Init.Period /2;
  75.         sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  76.         sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  77.         sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  78.         sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  79.         sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  80.         if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  81.         {
  82.                 Error_Handler(__FILE__, __LINE__);
  83.         }
  84.         
  85.          /* 配置PWM 通道 */
  86.         sConfigOC.Pulse = htim1.Init.Period /2;
  87.         if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  88.         {
  89.                 Error_Handler(__FILE__, __LINE__);
  90.         }
  91.         
  92.         /* 开启PWM输出 */
  93.         if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1) != HAL_OK)
  94.         {
  95.                 Error_Handler(__FILE__, __LINE__);
  96.         }
  97. }

  98. /*
  99. *********************************************************************************************************
  100. *        函 数 名: TIM1_UP_IRQHandler
  101. *        功能说明: 定时器1中断服务程序
  102. *        形    参: 无
  103. *        返 回 值: 无
  104. *********************************************************************************************************
  105. */
  106. void TIM1_UP_IRQHandler(void)
  107. {
  108.         HAL_TIM_IRQHandler(&htim1);
  109. }
复制代码


回复

使用道具 举报

5

主题

54

回帖

69

积分

初级会员

积分
69
发表于 2020-8-7 16:17:30 | 显示全部楼层
大神   定时功能和PWM功能可以同时使用吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2020-8-7 17:57:50 | 显示全部楼层
fengxiaoyu 发表于 2020-8-7 16:17
大神   定时功能和PWM功能可以同时使用吗?

可以,
教程第77章学习下

【安富莱】STM32H7用户手册发布,重在BSP驱动包设计方法,HAL库的框架学习,授人以渔
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980
回复

使用道具 举报

5

主题

54

回帖

69

积分

初级会员

积分
69
发表于 2020-8-8 09:57:47 | 显示全部楼层
eric2013 发表于 2020-8-7 17:57
可以,
教程第77章学习下

谢谢,
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 05:53 , Processed in 0.174889 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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