【STM32】CubeMX+HAL 输出PWM

发布者:骄阳少年最新更新时间:2021-12-10 来源: eefocus关键字:STM32  CubeMX  HAL  输出PWM 手机看文章 扫描二维码
随时随地手机看文章

1. 配置STM32CubeMX

前面的一些基础步骤可参见:【STM32】CubeMX+HAL 点亮LED 的【1.1】~【1.6】步骤。


核心配置:


这里我使用的是 TIM2 定时器,当然使用其他的也可以,但要注意相关配置。



1.1 TIM2 的 Mode 配置

在这里插入图片描述

1.2 TIM2 的 Configuration 配置

1.3 其余 GPIO 配置

PA2 的 PWM 输出作为 PA6 的输入,PA6 连接的是一个 LED ,观察是否出现呼吸灯现象。

余下步骤可参见:【STM32】CubeMX+HAL 点亮LED 的【1.10】~【1.13】步骤。


2. 添加代码

在这里插入图片描述

在这里插入图片描述

下面贴出主要代码:


2.1 gpio.c

/**

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

  * File Name          : gpio.c

  * Description        : This file provides code for the configuration

  *                      of all used GPIO pins.

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

  * @attention

  *

  *

© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

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

  */


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

#include "gpio.h"

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/*----------------------------------------------------------------------------*/

/* Configure GPIO                                                             */

/*----------------------------------------------------------------------------*/

/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


/** Configure pins as 

        * Analog 

        * Input 

        * Output

        * EVENT_OUT

        * EXTI

*/

void MX_GPIO_Init(void)

{


  GPIO_InitTypeDef GPIO_InitStruct = {0};


  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOH_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();


  /*Configure GPIO pin : PA6 */

  GPIO_InitStruct.Pin = GPIO_PIN_6;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


}


/* USER CODE BEGIN 2 */


/* USER CODE END 2 */


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


2.2 time.c

/**

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

  * File Name          : TIM.c

  * Description        : This file provides code for the configuration

  *                      of the TIM instances.

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

  * @attention

  *

  *

© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

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

  */


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

#include "tim.h"


/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


TIM_HandleTypeDef htim2;


/* TIM2 init function */

void MX_TIM2_Init(void)

{

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  TIM_OC_InitTypeDef sConfigOC = {0};


  htim2.Instance = TIM2;

  htim2.Init.Prescaler = 80-1;

  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim2.Init.Period = 100;

  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)

  {

    Error_Handler();

  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

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

  {

    Error_Handler();

  }

  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)

  {

    Error_Handler();

  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &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(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)

  {

    Error_Handler();

  }

  HAL_TIM_MspPostInit(&htim2);


}


void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)

{


  if(tim_baseHandle->Instance==TIM2)

  {

  /* USER CODE BEGIN TIM2_MspInit 0 */


  /* USER CODE END TIM2_MspInit 0 */

    /* TIM2 clock enable */

    __HAL_RCC_TIM2_CLK_ENABLE();

  /* USER CODE BEGIN TIM2_MspInit 1 */


  /* USER CODE END TIM2_MspInit 1 */

  }

}

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)

{


  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(timHandle->Instance==TIM2)

  {

  /* USER CODE BEGIN TIM2_MspPostInit 0 */


  /* USER CODE END TIM2_MspPostInit 0 */

  

    __HAL_RCC_GPIOA_CLK_ENABLE();

    /**TIM2 GPIO Configuration    

    PA2     ------> TIM2_CH3 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_2;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


  /* USER CODE BEGIN TIM2_MspPostInit 1 */


  /* USER CODE END TIM2_MspPostInit 1 */

  }


}


void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)

{


  if(tim_baseHandle->Instance==TIM2)

  {

  /* USER CODE BEGIN TIM2_MspDeInit 0 */


  /* USER CODE END TIM2_MspDeInit 0 */

    /* Peripheral clock disable */

    __HAL_RCC_TIM2_CLK_DISABLE();

  /* USER CODE BEGIN TIM2_MspDeInit 1 */


  /* USER CODE END TIM2_MspDeInit 1 */

  }


/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


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


2.3 main.c

/* USER CODE BEGIN Header */

/**

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

  * @file           : main.c

  * @brief          : Main program body

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

  * @attention

  *

  *

© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.

  *

  * This software component is licensed by ST under BSD 3-Clause license,

  * the "License"; You may not use this file except in compliance with the

  * License. You may obtain a copy of the License at:

  *                        opensource.org/licenses/BSD-3-Clause

  *

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

  */

/* USER CODE END Header */


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

#include "main.h"

#include "tim.h"

#include "gpio.h"


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */


/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


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

static unsigned char counter=0;

static unsigned char flag=0;

/* USER CODE BEGIN PV */


/* USER CODE END PV */


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

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/**

  * @brief  The application entry point.

  * @retval int

  */

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();


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

  /* USER CODE BEGIN 2 */

HAL_TIM_Base_Start(&htim2);

[1] [2]
关键字:STM32  CubeMX  HAL  输出PWM 引用地址:【STM32】CubeMX+HAL 输出PWM

上一篇:【STM32】串口通信---用代码与芯片对话
下一篇:【STM32】CubeMX+HAL 点亮LED

推荐阅读最新更新时间:2024-11-07 11:34

基于STM32单片机的电源设计
1. STM32 数据手册电源部分研读 RTC电源管脚为V BAT, 电源范围为1.8~3.6V,主要用于RTC时钟的供电, RTC在大部分场合用于保存一些重要的参数,比如在电脑主板上用于保存boss的信息, 如果这个电源丢了将导致无法重启,在单片机中低功耗设备常常也会使用这个RTC进行定时的唤醒功能,在普通的MCU中常用于做实时时钟。 VDD为数字电源,电源范围也是1.8~3.6V,在芯片内部集成了电压转化器,一般芯片内核供电为1.2V,图示的Regulator为转换器,将VDD电源稳压至1.2V。数据手册建议加入11个100nF和4.7uF的电容,不过实际应用中,只需要每个VDD加入一个100nF的去耦电容。 下图为模
[单片机]
基于<font color='red'>STM32</font>单片机的电源设计
玩转STM32(16)理解复位函数
前面搞定了栈顶的问题,接着下来,可以从复位矢量表里,看到如下: __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler 从向量表里看到第二项,就是复位函数的入口地址,Reset_Handler是复位向量的过程函数,它被编译之后,可以看到它表示的值是: Reset_Handler 0x0800019d Thumb Code 8 startu
[单片机]
玩转<font color='red'>STM32</font>(16)理解复位函数
意法半导体的芯片获HTEC穿戴式心脏记录仪采用
横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)拥有性能强大的STM32微控制器,可保证HTEC穿戴式心电图记录仪(ECG recorder, electrocardiogram recorder)能够长时间持续运行,远程监测心脏健康状况。 全球有数百万名不同年龄段的患者受到心律不齐或心跳异常等不同类型心脏疾病的困扰。通过及时准确的诊断,多数心律失常症状均能够被有效治疗,并能将死亡率降至最低。标准Holter动态心律监视器必须在记录后第二天早晨交给医生,以检查病患过去24小时的心率状况,而基于STM32的3导(3-lead)心电图记录
[医疗电子]
一个技术老总真实故事,从月工资300元到至今身家千万
从一台收录机到电子工程师之路 我叫李家庆,七十年代未出生于粤西的一个小山村。上小学的时候,家里先是有了一台收录机。我感觉非常神奇,特别是对收音广播功能,一直想不明白为什么拉上一杆天线,打开收音机,就会传来人声…每晚6点,就和小伙伴们守在收音机跟前,伴随着“前文再续,书接上一回”开始沉迷于”讲古” 的世界,直到“欲知后事如何,请听下回分解”,还舍不得散去…… 后来家里又有了一台二手的14寸黑白电视机。每晚又伴随着“人间大炮,一级准备”……,挤满屋的小伙伴。山里信号经常不好,我就经常跑到屋顶,为了找到一个清晰的图像的位置,不断调整天线。那时候,尽管还没有听过无线电这些东西,但是这个神奇的东西就埋伏在心里。 再后来,随
[嵌入式]
STM32 按键EXTI方式 使用ST3.0.0库
把IO配置为 EXTI中断的步骤: 1:使能EXTI Line时钟和第二功能时钟。 2:配置EXTI Line中断优先级(NVIC) 3:配置EXTI Line IO (哪个引脚,输入模式,初始化) 4:把引脚配置为EXTI Line的中断源(GPIO操作),配置IO口的工作模式 5:配置EXTI Line的工作模式。 ============================================================================== 例如: GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStruc
[单片机]
STM32芯片UID话题
绝大多数STM32系列的芯片都在固定的地方放置了长度为96位的唯一身份识别码,简称UID,只有极少数STM32系列芯片内部没有该UID,比方超值型STM32F0x0系列,STM32F100系列。具体到哪颗芯片到底有没有UID,在芯片数据手册的首页都有明确的说明,无需猜测。如下图所以: 芯片所对应的参考手册里,有对该UID存放地址的详细介绍。地址因不同系列或子序列而不同。 关于这个UID常有人有些疑问,有几个问题在这里稍微总结下: 1、有无问题。上面说了绝大部分STM32都内置UID,具体以查看数据手册为准。 2、唯一性问题。该UID的唯一性是靠96位这个整体来保证其唯一性,你若截取部分就不保证了。 3、内容问题。有人对这个
[单片机]
<font color='red'>STM32</font>芯片UID话题
stm32之assert_param 函数
我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。 4 断言机制函数assert_param 我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型 #define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH))
[单片机]
<font color='red'>stm32</font>之assert_param 函数
STM32最小系统硬件组成详解
STM32最小系统硬件组成详解 0组成: 电源 复位 时钟 调试接口 启动 1、电源 : 一般3.3V LDO供电 加多个0.01uf去耦电容 2、复位:有三种复位方式:上电复位、手动复位、程序自动复位 通常低电平复位:(51单片机高电平复位,电容电阻位置调换) 上电复位,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,计算方式如下:t = 1.1RC(固定计算公式) 1.1*10K*0.0.1uF=1.1S 需求的复位信号持续时间约在1ms左右。 手动复位:按键按下时,RESET和地导通,从而产生一个低电平,实现复位。 3、时钟 : 晶振+
[单片机]
<font color='red'>STM32</font>最小系统硬件组成详解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved