实践5 TIMER

发布于:2022-10-15 ⋅ 阅读:(326) ⋅ 点赞:(0)

目录

一 实验目的

二 实验原理

三.实验仪器

四.实验内容

五.实验结果及改进

六.实验结论


一 实验目的

1.LED灯闪烁

使用定时器TIMI,用中断实现1秒定时, 并控制LED灯闪烁。

2.PWM波形

使用TIM3产生四路PWM波形。

二 实验原理

1 LED灯闪烁

(1)要实现1秒定时,即在系统频率为72MHZ时, 72000 000次发生一次中断。

(2)定时器TIMI预分频器和计数器都为16位,最大计数6535。

(3)通过TIMI预分频器与计数器配合达到72000 0次计数。

(4)编写TIM1中断服务函数,检测TIM1是否溢出,并根据状态控制LED灯闪烁。

t=n\times T=n\times \frac{1}{f}
n=t\times f=1 \times 72\times 1000 000=72000 000

2. PWM波

(1)配置TIM3时基初始化结构体。

(2)配置TIM3各通道输出初始化结构体。

(3)每个通道都有单独的输出初始化函数、

三.实验仪器

电脑、开发板、UV5软件、共享文件Template。

四.实验内容

1.用UV5软件打开共享文件Template。

2.(1)LED灯闪烁

添加libraries \src文件夹下的misc.c、stm32fl0x_ time.c、stm32fl0x_ rcc.c到工程中的libraries文件中并在stm32fl0x- conf.h中去掉相应的注释。

(2) PWM波

添加libraries \src文件夹下的stm32fl0x_ time.c、stm32fl0x_ rcc.c到工程中的libraries文件中并在stm32fl0x- conf.h中去掉相应的注释。

3.编写程序

(1)LED灯闪烁

在main.c文件下编写以下程序:

#include<stm32f10x.h>

void GPIO_Config(void);
void TIM1_Config(void);
void NVIC_Config(void);

int main (void)
{
	GPIO_Config();
	TIM1_Config();
	NVIC_Config();
	while(1)
	{}	
	}

void GPIO_Config()
{
  GPIO_InitTypeDef   	GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOC,GPIO_Pin_All);
}

void TIM1_Config(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_Period = (10000-1);//ARR
	TIM_TimeBaseStructure.TIM_Prescaler = (7200-1);//PSC
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;	
	TIM_TimeBaseInit(TIM1, & TIM_TimeBaseStructure);
	
	TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
	
	TIM_ITConfig(TIM1, TIM_IT_Update,ENABLE);
	
	TIM_Cmd(TIM1,ENABLE);
}

void NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

在stm32fl0x_ it.h文件下编写以下程序:

uint32_t led=1;

/*在STM32F10x Peripherals Interrupt Handlers 注释下面编写: */
void TIM1_UP_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM1,TIM_IT_Update)!=RESET)
	{
		led=~led;
		if(led==1)
			GPIO_SetBits(GPIOC,GPIO_Pin_9);
		else
			GPIO_ResetBits(GPIOC,GPIO_Pin_9);
	  	TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
	}
}

(2)PWM波

在main.c文件下编写以下程序:

#include<stm32f10x.h>

void GPIO_Config(void);
void TIM3_Config(void);

uint16_t PrescalerValue=0;

uint16_t CCR1_Val=333;
uint16_t CCR2_Val=249;
uint16_t CCR3_Val=166;
uint16_t CCR4_Val=83;

int main (void)
{
	GPIO_Config();
	TIM3_Config();
	TIM_ARRPreloadConfig(TIM3,ENABLE);
	TIM_Cmd(TIM3,ENABLE);
	
	while(1)
	{}
	}

void GPIO_Config()
{
  GPIO_InitTypeDef   	GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOC,GPIO_Pin_All);
}

void TIM3_Config(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
	
	PrescalerValue=(uint16_t)(SystemCoreClock/2400000)-1;
	
	TIM_TimeBaseStructure.TIM_Period = 665;//ARR
	TIM_TimeBaseStructure.TIM_Prescaler =PrescalerValue;//PSC
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse=CCR1_Val;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	
	TIM_OC1Init(TIM3, & TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
	
	TIM_OCInitStructure.TIM_Pulse=CCR2_Val;
	TIM_OC2Init(TIM3, & TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

	TIM_OCInitStructure.TIM_Pulse=CCR3_Val;
	TIM_OC3Init(TIM3, & TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);

	TIM_OCInitStructure.TIM_Pulse=CCR4_Val;
	TIM_OC4Init(TIM3, & TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);

}



4.编译——>配置ST-Link——>下载——>复位——>观察。

五.实验结果及改进

1.LED灯闪烁

按下复位建后,LED4每间隔1s中闪烁一次。

2.输出PWM波形

按下复位键后,示波器屏幕上显示从母PC6~PC9管脚产生的占空比逐渐变小的PWM波形。

六.实验结论

1. LED灯闪烁

在编写LED灯闪烁程序时,需要编写中断服务函数,在老师未讲课时我就已经编写了程序,第一次是将外部中断服务函数void  TIMI_UP_ IRQHandler(void).写在上主函数min.c里,编译后没有错误,但当我看课本时,该函数是需要写在stm32f10x_it.c.函数中,并且要将中断服务函数void  TIMI_UP_ IRQHandler(void)放在外部中断特定的位置中,将该函数放在特定位置后,编译下载后现象正确。

2. PWM波形

按照课本上编写程序后,编译器显示0 Error(s). 0 Warning(s) ,但是在示波器上测不出波形,这令我很头疼,无错误、无警告错误在哪儿找呀!我将所有程序一字一句的对了遍都没有错误,那么可能是void GPIO Config (void)里出了问题,因为课本上没有该函数,我是在LED灯闪烁的程序中复制的,询问老师之后,需要设置为推挽输出,即GPIO_ InitStructure . GPIO_ Mode = GPIO_ Mode _AF_ PP,再次编译下载后,示波器正确显示波形。

希望对正在努力的你有所帮助!
 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到