stm32定时器
STM32是一系列基于ARM Cortex-M内核的32位微控制器,由STMicroelectronics公司生产。STM32微控制器内置了一组丰富的定时器功能,这些功能在嵌入式应用中被广泛使用,如产生精确的时间间隔、脉冲测量、脉宽调制(PWM)等。
STM32定时器大致可以分为以下几种类型:
基本定时器 (Basic Timers):基本定时器主要用于产生固定周期的中断或触发事件。它们通常只具备计数、溢出和中断功能。STM32F103系列中,TIM6和TIM7属于基本定时器。
通用定时器 (General-purpose Timers):通用定时器具有基本定时器的功能外,还支持输入捕获(用于测量外部信号频率、占空比等)、输出比较(产生PWM波形等)和更高的计数模式。STM32F103系列中,TIM2、TIM3和TIM4属于通用定时器。
高级定时器 (Advanced Timers):高级定时器拥有通用定时器的功能,还具备更高级的控制功能,如互补PWM输出、死区控制、断电控制、控制PWM输出的切换频率和同步功能。在 STM32F103 系列中,TIM1 和 TIM8 属于高级定时器。
专用定时器:此类定时器针对某些特定应用进行优化,例如系统滴答定时器(SysTick Timer, 用于操作系统任务调度)、实时时钟(RTC, 用于实时时钟和日历功能)等。
我们使用keil5进行相关环境配置
在keil5上选择相关芯片以及进行库文件添加
然后进行相关环境配置。
int a=0;
static void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
}
void LED_Toggle(void)
{
GPIOB->ODR ^= GPIO_Pin_0;
}
void TIM3_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_Config();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitStruct.TIM_Period=71;
TIM_TimeBaseInitStruct.TIM_Prescaler=1000;//1ms
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update)) a++;
if(a == 1000)
{
LED_Toggle();
a = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
在main函数里面进行配置。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIOB->ODR ^= GPIO_Pin_0;
TIM3_Config();
while (1)
{
}
然后编译拷贝,进入硬件可以得到结果。
PWM
脉宽调制(Pulse Width Modulation,简称PWM)是一种在数字系统中常用的方式来控制模拟电路。基本思想是使用数字输出(通常是微控制器的一种功能)生成一串脉冲,然后修改这些脉冲的宽度(也就是持续时间)来编码一个特定的模拟信号级别。
我们使用cubemx的hal库来进行环境配置。
打开cubemx选择芯片
配置sys
继续配置RCC
配置定时器
配置NVIC
代码配置里面勾上select
配置USART1串口。
进行定时器的不同配置。
然后生成代码,直接进入keil5
写入main函数代码
while (1)
{
HAL_Delay(50);
duty_num = duty_num + 10;
if(duty_num > 500)
{
duty_num = 0;
}
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,duty_num);
}
然后我们使用keil的逻辑分析仪
以及之前一样的硬件结果。
文献参考:
- https://blog.csdn.net/m0_63185906/article/details/134209635