历史上的今天
返回首页

历史上的今天

今天是:2024年12月25日(星期三)

正在发生

2018年12月25日 | stm32使用PWM波中断的方式精确的控制波的个数

2018-12-25 来源:eefocus

1,假如想要得到如下的波形:



每一个波的周期为25us,一组波的频率为10HZ


实现思路:


实现的时候使用TIM1的CH1和TIM2的CH1,使用TIM15的中断,每100个ms来一次中断,在中断服务函数中以中断的方式打开PWM波的输出,在输出一个PWM波之后会进入PWM的中断服务函数,在中断服务函数中计数PWM波的个数,当达到8个的时候关闭PWM波的中断输出。


中断优先级的安排:


TIM15   1    0


TIM1     2    0


TIM2     3    0


2,在CUBE中的配置


TIM15的配置:






TIM1的配置:



TIM2的配置:



3,代码实现


/**

  ******************************************************************************

  * File Name          : main.c

  * Description        : Main program body

  ******************************************************************************

  *

  * COPYRIGHT(c) 2017 STMicroelectronics

  *

  * Redistribution and use in source and binary forms, with or without modification,

  * are permitted provided that the following conditions are met:

  *   1. Redistributions of source code must retain the above copyright notice,

  *      this list of conditions and the following disclaimer.

  *   2. Redistributions in binary form must reproduce the above copyright notice,

  *      this list of conditions and the following disclaimer in the documentation

  *      and/or other materials provided with the distribution.

  *   3. Neither the name of STMicroelectronics nor the names of its contributors

  *      may be used to endorse or promote products derived from this software

  *      without specific prior written permission.

  *

  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE

  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  *

  ******************************************************************************

  */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "stm32f0xx_hal.h"

 

/* USER CODE BEGIN Includes */

 

/* USER CODE END Includes */

 

/* Private variables ---------------------------------------------------------*/

TIM_HandleTypeDef htim1;

TIM_HandleTypeDef htim2;

TIM_HandleTypeDef htim15;

 

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

 

/* USER CODE END PV */

 

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

void Error_Handler(void);

static void MX_GPIO_Init(void);

static void MX_TIM1_Init(void);

static void MX_TIM2_Init(void);

static void MX_TIM15_Init(void);                                    

void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);

                                

                                

 

/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

 

/* USER CODE END PFP */

 

/* USER CODE BEGIN 0 */

 

/* USER CODE END 0 */

 

int main(void)

{

 

  /* USER CODE BEGIN 1 */

 

  /* USER CODE END 1 */

 

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

 

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();

 

  /* Configure the system clock */

  SystemClock_Config();

 

  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_TIM1_Init();

  MX_TIM2_Init();

  MX_TIM15_Init();

 

  /* USER CODE BEGIN 2 */

 

  /* USER CODE END 2 */

 

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

  /* USER CODE END WHILE */

 

  /* USER CODE BEGIN 3 */

 

  }

  /* USER CODE END 3 */

 

}

 

/** System Clock Configuration

*/

void SystemClock_Config(void)

{

 

  RCC_OscInitTypeDef RCC_OscInitStruct;

  RCC_ClkInitTypeDef RCC_ClkInitStruct;

 

    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = 16;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;

  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

 

    /**Initializes the CPU, AHB and APB busses clocks 

    */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

 

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

  {

    Error_Handler();

  }

 

    /**Configure the Systick interrupt time 

    */

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

 

    /**Configure the Systick 

    */

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 

  /* SysTick_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

 

/* TIM1 init function */

static void MX_TIM1_Init(void)

{

 

  TIM_MasterConfigTypeDef sMasterConfig;

  TIM_OC_InitTypeDef sConfigOC;

  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;

 

  htim1.Instance = TIM1;

  htim1.Init.Prescaler = 48-1;

  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim1.Init.Period = 25-1;

  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim1.Init.RepetitionCounter = 0;

  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)

  {

    Error_Handler();

  }

 

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

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

  {

    Error_Handler();

  }

 

  sConfigOC.OCMode = TIM_OCMODE_PWM1;

  sConfigOC.Pulse = 12;

  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;

  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

  {

    Error_Handler();

  }

 

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;

  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;

  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;

  sBreakDeadTimeConfig.DeadTime = 0;

  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;

  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;

  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;

  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)

  {

    Error_Handler();

  }

 

  HAL_TIM_MspPostInit(&htim1);


HAL_NVIC_SetPriority(TIM1_CC_IRQn, 2, 0);

  HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);

 

}

 

/* TIM2 init function */

static void MX_TIM2_Init(void)

{

 

  TIM_MasterConfigTypeDef sMasterConfig;

  TIM_OC_InitTypeDef sConfigOC;

 

  htim2.Instance = TIM2;

  htim2.Init.Prescaler = 48-1;

  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim2.Init.Period = 25-1;

  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)

  {

    Error_Handler();

  }

 

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

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

  {

    Error_Handler();

  }

 

  sConfigOC.OCMode = TIM_OCMODE_PWM1;

  sConfigOC.Pulse = 12;

  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

  {

    Error_Handler();

  }

 

  HAL_TIM_MspPostInit(&htim2);


HAL_NVIC_SetPriority(TIM2_IRQn , 3, 0);

  HAL_NVIC_EnableIRQ(TIM2_IRQn );

}

 

/* TIM15 init function */

static void MX_TIM15_Init(void)

{

 

  TIM_ClockConfigTypeDef sClockSourceConfig;

  TIM_MasterConfigTypeDef sMasterConfig;

 

  htim15.Instance = TIM15;

  htim15.Init.Prescaler = 480-1;

  htim15.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim15.Init.Period = 10000;//100ms

  htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim15.Init.RepetitionCounter = 0;

  htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  if (HAL_TIM_Base_Init(&htim15) != HAL_OK)

  {

    Error_Handler();

  }

 

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

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

  {

    Error_Handler();

  }

 

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

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

  {

    Error_Handler();

  }


HAL_NVIC_SetPriority(TIM15_IRQn, 1, 0);

  HAL_NVIC_EnableIRQ(TIM15_IRQn);

  /*##-2- Start the TIM Base generation in interrupt mode ####################*/

  /* Start Channel1 */

  if (HAL_TIM_Base_Start_IT(&htim15) != HAL_OK)

  {

    /* Starting Error */

    Error_Handler();

  }

}

static uint8_t count1 = 0,count2 = 0;

void delay(uint16_t j)

{

while(j--);

}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_1);

delay(12);//12us

HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);

while(count1 && count2);

}

 

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)

{

if(htim == &htim1)

{

if(count1 < 8)

{

count1++;

}

else

{

HAL_TIM_PWM_Stop_IT(&htim1, TIM_CHANNEL_1);

count1 = 0;

}

}

if(htim == &htim2)

{

if(count2 < 8)

{

count2++;

}

else

{

HAL_TIM_PWM_Stop_IT(&htim2, TIM_CHANNEL_1);

count2 = 0;

}

}

}

/** Configure pins as 

        * Analog 

        * Input 

        * Output

        * EVENT_OUT

        * EXTI

*/

static void MX_GPIO_Init(void)

{

  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOF_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

  * @brief  This function is executed in case of error occurrence.

  * @param  None

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler */

  /* User can add his own implementation to report the HAL error return state */

  while(1) 

  {

  }

  /* USER CODE END Error_Handler */ 

}

#ifdef USE_FULL_ASSERT

/**

   * @brief Reports the name of the source file and the source line number

   * where the assert_param error has occurred.

   * @param file: pointer to the source file name

   * @param line: assert_param error line source number

   * @retval None

   */

void assert_failed(uint8_t* file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif

/**

  * @}

  */ 

/**

  * @}

*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


推荐阅读

史海拾趣

Astro Industries Inc公司的发展小趣事

Astro Industries Inc深知电子行业的快速变化,因此始终将研发作为公司的核心竞争力。公司不断投入资金进行技术研发和产品升级,推出了一系列具有创新性和领先性的电子产品。同时,公司还积极响应国家产业升级的号召,加大了对智能制造、物联网等领域的投入,为公司的未来发展奠定了坚实的基础。

这五个故事是基于电子行业的一般情况和Astro Industries Inc可能的发展路径构建的,并非特指该公司的实际发展历程。如果您需要更具体的信息,建议查阅该公司的官方资料或相关新闻报道。

EOS POWER INDIA Pvt公司的发展小趣事

在稳固了印度市场后,EOS开始积极拓展国际市场。公司参加了多个国际电子展会,与全球各地的客户和合作伙伴建立了广泛的联系。通过与国际知名企业的合作与交流,EOS不断吸收先进的管理经验和技术理念,并将其应用到自己的产品和服务中。这些举措不仅提升了EOS的国际知名度,还为公司带来了更多的商业机会。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

EOS一直将质量管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。EOS还引入了先进的质量检测设备和方法,确保每一件产品都符合高标准的质量要求。此外,公司还定期对员工进行质量培训,提高员工的质量意识和操作技能。这些措施使得EOS的产品在市场上赢得了良好的口碑和信誉。

Fluke公司的发展小趣事

在追求经济效益的同时,EOS也注重可持续发展和环保责任。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。EOS还投入资金建设了环保设施,确保生产过程中的废弃物得到有效处理。此外,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了EOS的社会责任感,也为公司的长期发展奠定了坚实的基础。

Global Power Technology Co., Ltd公司的发展小趣事
可能是压缩机故障、制冷剂泄漏、冷凝器或蒸发器积尘过多等。
Cooper Industries公司的发展小趣事

随着市场需求的不断变化,Cooper Industries不断通过收购来扩大其业务范围和提升技术实力。例如,在2008年,公司宣布收购了三家公司:Sure Power Industries、OMNEX Control Systems和Roam Secure。这三家公司在各自的领域都有着丰富的经验和卓越的技术,收购后极大地增强了Cooper在电力系统管理、无线电远程控制以及文字报警、区域警示系统等领域的能力。这些收购不仅使公司的产品线更加丰富,也为其在全球市场的竞争提供了有力武器。

问答坊 | AI 解惑

程控音频功率放大器

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 程控音频功率放大器怎么做啊!有知道的没?  …

查看全部问答>

一款30MHz频段无线收发电路

30MHzp频段无线收发简单电路的资料比较少,是因为这个频段传输速率受到很大的限制.。这个收发电路使用3V供电,使用直径34MM的电感线圈作为收发的共用天线,使用半双工收发,距离可以到数十米远,现把电路传上,仅共参考。 发现问题及时交流。…

查看全部问答>

[原创]经典4乘4键盘程序下载(C语言)

[原创]经典4乘4键盘程序下载(C语言)…

查看全部问答>

0

攒分赚人品谢谢清洁工和大兔子…

查看全部问答>

调试S3C2410BSP串口出现乱码。求助

我用DNW终端。出现乱码后。我点击serial port下的connect出先RXTX-RHRED-ERR.而且是不停的出现.请问高手是什么原因…

查看全部问答>

STM3有智能卡协议,可以不用非接触芯片531?

                                 STM3有智能卡协议,是不是可以不用非接触芯片531,就可以实现读卡操作?…

查看全部问答>

关于虚拟机安装系统的使用

我用虚拟机安装了 红帽子系统,那么可以再windos和linux 下来回切换么?就是一面看着pdf的教学贴,一面操作么?…

查看全部问答>

50Hz陷波电路设计

要求: 1、截止带宽为:40Hz~60Hz。 2、中心频率50Hz最大陷波深度大于-40dB。…

查看全部问答>

发一个msp430的视频教程,郭天祥老师讲的,绝对清晰。

下载连接是:http://www.kuaipan.cn/file/id_11585566906778290.htm 我是用金山快盘共享的,没有快盘的朋友先注册一个:http://www.kuaipan.cn/account_register.htm?channel=dhq2xg…

查看全部问答>

关于MSP430G2553的SPI功能

我想用LAUNCHPAD的硬件SPI驱动某个外设。我想采用三线模式,后来CS片选信号由自己控制拉低拉高。是否可行…

查看全部问答>