NUCLEO-L053R8 TIM定时器 PWM输出
TIM2 PWM输出测试
今天给大伙分享一个TIM2 PWM输出小实验。
实验开发板:Nucleo-L053R8,即STM32L053R8T6。
开发环境:MDK5
图1 - 工程界面
本次实验测试的是通用定时器TIM2,PWM输出模式。
附上代码:
bsp_tim.h
/**
******************************************************************************
* File Name : bsp_tim.h
* Description : This file provides code for the configuration
* of the TIM instances.
******************************************************************************
*/
#ifndef __BSP_TIM_H
#define __BSP_TIM_H #include "stm32l0xx_hal.h" // 使用宏定义,代码易于移植 #define TIM_CH1_PORT GPIOA
#define TIM_CH1_PIN GPIO_PIN_0 #define TIM_x TIM2
#define TIM_CHANNEL_x TIM_CHANNEL_1
#define TIM_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE() // PWM信号的频率 F = TIM_CLK/((ARR+1)*(PSC+1))
#define TIM_PSC (1-1)
#define TIM_PERIOD (200-1)
#define TIM_PULSE 100 extern void _Error_Handler(void);
void HAL_TIM2_Init(void); #endif /* __BSP_TIM_H */
bsp_tim.c
/**
******************************************************************************
* File Name : bsp_tim.c
* Description : This file provides code for the configuration
* of the TIM instances.
******************************************************************************
*/ #include "bsp_tim.h" static void HAL_TIM2_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // TIM2_PWM输出GPIO初始化 PA0 ----> TIM2_CH1
GPIO_InitStruct.Pin = TIM_CH1_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;
HAL_GPIO_Init(TIM_CH1_PORT, &GPIO_InitStruct);
} static void HAL_TIM2_Mode_Config(void)
{
TIM_HandleTypeDef TIM_HandleStruct;
TIM_MasterConfigTypeDef TIM_MasterStruct;
TIM_OC_InitTypeDef TIM_OC_InitStruct; // 开启定时器时钟
TIM_CLK_ENABLE; TIM_HandleStruct.Instance = TIM_x;
TIM_HandleStruct.Init.Prescaler = TIM_PSC;
TIM_HandleStruct.Init.CounterMode = TIM_COUNTERMODE_UP;
TIM_HandleStruct.Init.Period = TIM_PERIOD;
TIM_HandleStruct.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_PWM_Init(&TIM_HandleStruct) != HAL_OK)
{
_Error_Handler();
} TIM_MasterStruct.MasterOutputTrigger = TIM_TRGO_RESET;
TIM_MasterStruct.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&TIM_HandleStruct, &TIM_MasterStruct) != HAL_OK)
{
_Error_Handler();
} TIM_OC_InitStruct.OCMode = TIM_OCMODE_PWM1;
TIM_OC_InitStruct.Pulse = TIM_PULSE;
TIM_OC_InitStruct.OCPolarity = TIM_OCPOLARITY_HIGH;
TIM_OC_InitStruct.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&TIM_HandleStruct, &TIM_OC_InitStruct, TIM_CHANNEL_x) != HAL_OK)
{
_Error_Handler();
} HAL_TIM_PWM_Start(&TIM_HandleStruct, TIM_CHANNEL_x);
} void HAL_TIM2_Init(void)
{
HAL_TIM2_GPIO_Config();
HAL_TIM2_Mode_Config();
}
main.c
/**
******************************************************************************
* @file main.c
* @author Tuple
* @brief Main program body
******************************************************************************
*/ #include "stm32l0xx_hal.h"
#include "bsp_tim.h" void _Error_Handler(void);
void SystemClock_Config(void); int main(void)
{
//重置所有外围设备,初始化Flash接口和Systick
HAL_Init(); //系统时钟配置
SystemClock_Config(); //TIM2 PWM输出配置
HAL_TIM2_Init(); } void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct; //Configure the main internal regulator output voltage
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); //Initializes the CPU, AHB and APB busses clocks
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = ;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
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_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
{
_Error_Handler();
} HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); //Configure the Systick interrupt time
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/); //Configure the Systick
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); //SysTick_IRQn interrupt configuration
HAL_NVIC_SetPriority(SysTick_IRQn, , );
} void _Error_Handler()
{
while()
{
}
}
如果你不清楚Nucleo板子上PA0在哪个引脚,请查阅RCC时钟配置实验的Figure 20 --> Figure 20.NUCLEO-L053R8
用两根杜邦线从Nucleo板子上引出PA0、GND,然后用数字示波器来监控PWM输出。实物连接如下:
图2 - 实物连接图
把编译好的程序下载到Nucleo开发板,PWM输出设置成不同的占空比,用示波器监控 PWM输出的波形。下面给大伙展示3组不同占空比的PWM输出波形:
图3 - 占空比25%的PWM波形
图4 - 占空比50%的PWM波形
图5 - 占空比75%的PWM波形
NUCLEO-L053R8 TIM定时器 PWM输出的更多相关文章
- (五)转载:通用定时器PWM输出
1. TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...
- STM32(7)——通用定时器PWM输出
1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种 ...
- STM32F103ZET6 PWM输出
1.通用定时器的PWM功能 STM32F103ZET6有4个通用定时器,分别是TIM2.TIM3.TIM4.TIM5. 通用定时器由一个可编程预分频器驱动的16位自动装载计数器构成. 通用定时器的很多 ...
- 定时器TIM,pwm
一.定时器 1. 定义 设置等待时间,到达后则执行指定操作的硬件. 2. STM32F407的定时器有以下特征 具有基本的定时功能,也有PWM输出(灯光控制.电机的转速).脉冲捕获功能( ...
- 合宙AIR105(三): 定时器, 定时器中断和PWM输出
目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 Ai ...
- 关于普通定时器与高级定时器的 PWM输出的初始化的区别
不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_ ...
- STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置
基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...
- 基于STM32F429和Cube的主从定时器多通道输出固定个数的PWM波形
主从定时器的原理已在上篇博文: 基于STM32F429+HAL库编写的定时器主从门控模式级联输出固定个数PWM脉冲的程序 讲解了,这篇重点就讲如何实现多通道的PWM级联输出. 1.软件环境 Keil5 ...
- STM32F0使用LL库实现PWM输出
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本文我们将说明如何通过LL库实现PWM信号 ...
随机推荐
- iotop使用详解
iotop是top和iostat程序的混合体,能够显示系统中所有运行进程并将进程根据I/O统计信息排序. 这个软件使用了Linux内核的一些新特性,所以需要2.6.20或者更新的内核. 一般默认情况下 ...
- [EffectiveC++]item33:避免遮掩继承而来的名称。
先看看: ZT C++ 重载.覆盖和隐藏的区别 http://www.cnblogs.com/jeanschen/p/3405987.html 隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下: ...
- 一个U盘黑掉你:TEENSY实战
从传统意义讲,当你在电脑中插入一张CD/DVD光盘,或者插入一个USB设备时,可以通过自动播放来运行一个包含恶意的文件,不过自动播放功能被关闭时,autorun.inf文件就无法自动执行你的文件了.然 ...
- 前端面试题总结(一)HTML篇
前端面试题总结(一)HTML篇 一.iframe的优缺点? 缺点: 1.会阻塞主页面的onload事件(iframe和主页面共享链接池,而浏览器对相同域的链接有限制,所以会影响页面的并行加载). 解决 ...
- python 时间和时间戳的转化
时间戳与时间之间的转换,需要一个中间过程,即将先将时间或时间戳先转为时间元组! 1.时间转时间戳: import datetime, time s = datetime.datetime(2016,6 ...
- 微信小程序的postMessage不实时?
最近在开发小程序的时候用到了wx.postMessage()这个API,在使用前我一直认为wx.postMessage()可以在小程序和H5中实时的传递信息,可以依靠这个API开发一个小程序的brid ...
- ICT测试点是干什么的, 怎么设置!
简单理解:ICT类似如万用表,只是把表笔换成了测试针.那么问题就简单了,一颗普通的RLC元件,都必须有两个测试点才能够测试,当然同一个网络共用的节点用一个测试点就可以了. 详细描述: PCB设计时要看 ...
- winform 里 如何实现文件上传
看了网上写的 用webclient类的uploadfile方法, 我在本地建立了个webform,winform窗体, 现在可以本地实现文件传递,可以选择文件传到d:\temp路径下,但怎们传到服务 ...
- oracle本地安装注意事项
这两天组员在本地windows上安装oracle数据库,安装完各种问题,pl/sql developer以及tns_admin配置以及tnsnames.ora和sqlnet.ora listener. ...
- 工具 | Axure基础操作 No.2
不废话了,直接如之前一样上操作图才是正道. 1.设置文本类型为密码或者文件类型 可以在属性中也选择最大长度制定长度. 如果设置类型为文件,在浏览器中就会自动变成选择本地文件的按钮. 2.文本框提示文字 ...