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信号 ...
随机推荐
- nodepad++通过正则表达式,删除带有特殊字符的某一行
我是VS项目不小心生成了x64平台的sln文件,想把sln文件中带有x64的给删除,一共搜索到500多行,怎么办呢,一个一个删除太费劲儿了. 通过nodepad++ 的正则表达式替换: 我是想删除带X ...
- wget 模拟 get post请求
wget命令 默认采用GET请求, 如果使用POST请求, wget --post-data '' url // 这样 POST 请求没有请求体.
- myeclipse 复制项目不包含svn或CVS目录
目前只记录到2个方法:(SVN和CVS都适用) 方法一:导出法 1.右击需要cp的目录,点击export,General/File System 2.next 3.确认你选择的目录,并勾选:Creat ...
- easyui学习笔记8—在手风琴中加载其他的页面
在手风琴中加载其他页面和在表格中加载其他的页面有写类似的,就是请求另外一个页面显示数据. 1.先看看引用的资源文件 <link rel="stylesheet" href=& ...
- zt 李鸿章听过《彩云追月》?
ZT 李鸿章听过<彩云追月>? 2013-05-11 09:35:52 编辑 删除 归档在 观世上之音 | 浏览 1041 次 | 评论 1 条 尝试在网上找一点有关<彩云追月> ...
- python UI自动化实战记录七:页面2用例编写
使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...
- C#图解教程读书笔记(第9章 语句)
文件头的Using是Using指令,不是using语句 using (TextWriter tw = File.CreateText("xixi.txt")) { tw.Write ...
- SG函数&&SG定理
必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的 ...
- CF587F Duff is Mad
题目 有趣的思想 首先暴力的话,自然是对每一个询问在\(AC\)自动机上跑一遍\(k\),看看跑出来的节点在\(fail\)树到根的路径上有多少个\(l\)到\(r\)之间的结束标记就好了 我们发现无 ...
- CF#538(div2) B. Yet Another Array Partitioning Task 【YY】
任意门:http://codeforces.com/contest/1114/problem/B B. Yet Another Array Partitioning Task time limit p ...