#include "sys.h"
#include "beep.h"
//tim5 定时器
/*
tim4 定时器 定时10分钟 控制LED1
*/
void my_tim5_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1.打开时钟
RCC_APB1Peri phClockCmd(RCC_APB1Periph_TIM5, ENABLE);
//2.TIM_TimeBaseInit
// 配置定时器
/*
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
TIM_TypeDef 控制器基地址 TIM1~14
TIM_TimeBaseInitTypeDef
uint16_t TIM_Prescaler; 分频系数
功能:用于分频
范围:数字
寄存器:PSC
uint16_t TIM_CounterMode; 计数模式
范围:TIM_CounterMode_Up TIM_CounterMode_Down
寄存器:CR1 4 5 6 三位
uint32_t TIM_Period; 自动重载寄存器
范围:
寄存器:ARR
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter;
2s 42MHz *2 = 84MHz
*/
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
//16位 防止溢出
TIM_TimeBaseStruct.TIM_Period = 20000 -1;
TIM_TimeBaseStruct.TIM_Prescaler= 8400-1;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStruct);
//打开中断
/*
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
TIM_IT 中断的标志
TIM_IT_Update 更新中断
NewState 状态
ENABLE DISABLE
*/
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x2;
NVIC_Init(&NVIC_InitStruct);
}
extern u32 jfees;
//2S 一次 如何产生10分钟的定时
void TIM5_IRQHandler(void)
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) {
// BEEP = !BEEP;
jfees++;
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}
}
//占空比:一个时钟周期高电平所占的比例
//PWM 外设 需要一个特定的波形
//外设需要不同的电压来控制
//BEEP PF8 通过production_data.pdf TIM13_CH1
//PF8 可以 TIM13 的第一个通道
//tim13 控制器
void timer13_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
GPIO_InitTypeDef GPIO_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
//PF8 配置成复用模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOF, &GPIO_InitStruct);
//把PF8 复用为TIM13功能,就可以把PF8作为 TIM13的一个通道
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13 );
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
//16位 防止 溢出
TIM_TimeBaseStruct.TIM_Period = 300 -1;
TIM_TimeBaseStruct.TIM_Prescaler= 84-1;
TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStruct);
//PWM的配置
//CCMR1 OC1M 4~6
//111 PWM2 CNT > CCR1 输出有效电平
//110 PWM1 CNT < CCR1 输出有效电平
//CCER 1位 配置有效电平
/*
void TIM_OCnInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
使用不同的通道需要调用不同的函数
通道1 TIM_OC1Init
uint16_t TIM_OCMode;
功能:配置PWM的模式
范围:TIM_OCMode_PWM1 TIM_OCMode_PWM2
uint16_t TIM_OutputState;
功能:PWM通道使能 开关
范围:TIM_OutputState_Disable TIM_OutputState_Enable
寄存器:CCER 0位
uint16_t TIM_OCPolarity;
功能:有效电平
范围:TIM_OCPolarity_High TIM_OCPolarity_Low
寄存器:CCER 1位
*/
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM13, &TIM_OCInitStruct);
/*
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
x 1~4
只有调用该函数 那么才能修改CCR1的值
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
*/
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM13, ENABLE);
TIM_Cmd(TIM13, ENABLE);
}
//tim14 控制器
void timer14_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
GPIO_InitTypeDef GPIO_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
//PF9 配置成复用模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOF, &GPIO_InitStruct);
//把PF9 复用为TIM14功能,就可以把PF9 作为TIM14的一个通道
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14 );
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
//16位 防止 溢出
TIM_TimeBaseStruct.TIM_Period = 300 -1;
TIM_TimeBaseStruct.TIM_Prescaler= 84-1;
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStruct);
//PWM的配置
//CCMR1 OC1M 4~6
//111 PWM2 CNT > CCR1 输出有效电平
//110 PWM1 CNT < CCR1 输出有效电平
//CCER 1位 有效电平
/*
void TIM_OCnInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
使用不同的通道需要调用不同的函数
通道1 TIM_OC1Init
uint16_t TIM_OCMode;
功能:配置 PWM的模式
范围TIM_OCMode_PWM1 TIM_OCMode_PWM2
uint16_t TIM_OutputState;
功能:PWM通道使能 开关
范围:TIM_OutputState_Disable TIM_OutputState_Enable
寄存器:CCER 0位
uint16_t TIM_OCPolarity;
功能:有效电平
范围:TIM_OCPolarity_High TIM_OCPolarity_Low
寄存器:CCER 1位
*/
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OC1Init(TIM14, &TIM_OCInitStruct);
/*
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
x 1~4
只有调用该函数 那么才能修改CCR1的值
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
*/
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM14, ENABLE);
TIM_Cmd(TIM14, ENABLE);
}
while(1)
{
// if(jfees >= time + 5)
// {
// BEEP = !BEEP;
// time = jfees;
// }
if(dir==0) val++;
else if(dir==1) val--;
if(val==300) dir=1;
else if(val==0)dir=0;
//TIM_SetComparen
//设置 CCR1 比较寄存器的值
TIM_SetCompare1(TIM14, val);
delay_ms(10);
}