目录
一 实验目的
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灯闪烁。
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,再次编译下载后,示波器正确显示波形。
希望对正在努力的你有所帮助!