问题描述:写了一个定时器一的初始化函数,CH1(PA8)引脚可以正常点亮LED,但是CH1N(PB13)引脚没有反应,程序在下面,希望有高手能解答疑问
1、IO口初始化
void Tim1_Init(void)//定时器1初始化函数
{
GPIO_InitTypeDef GPIOInitStructure;
//开启CH1(PA8)时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIOInitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽
GPIOInitStructure.GPIO_Pin=GPIO_Pin_8;
GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIOInitStructure);
//开启CH1N(PB13)时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIOInitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽
GPIOInitStructure.GPIO_Pin=GPIO_Pin_13;
GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIOInitStructure);
//开启刹车(PB12)时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIOInitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽
GPIOInitStructure.GPIO_Pin=GPIO_Pin_12;
GPIOInitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIOInitStructure);
//刹车默认输出低电平
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
2、定时器初始化
//定时器1配置
void TIM_Mode_Config(void)//TMD没开TIM1的时钟
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
// TIM_DeInit(TIM1);
//时基单元初始化
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式//向上
TIM_TimeBaseInitStructure.TIM_Period=2000-1;//ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=72-1;//PSC//CK_CNT=fCK_PSC / (PSC+ 1)
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器(8位)
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
//输出比较初始化(OC)
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //比较模式(PWM1)
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_Pulse=1000;//比较输出脉冲宽度(CCR)
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; // 比较输出极性(高)
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCPolarity_Low; // 比较输出极性(低)
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;//空闲状态输出电平设置(置0)
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;//空闲状态时互补输出电平设置(置1)
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
/*-------------------刹车和死区结构体初始化-------------------*/
// 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
// 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述
// 这里配置的死区时间为152ns
TIM_BDTRInitStructure.TIM_DeadTime = 11;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
// 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);
// 使能计数器
TIM_Cmd(TIM1, ENABLE);
// 主输出使能,当使用的是通用定时器时,这句不需要
TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
}
3、main函数
int main(void)
{
/*模块初始化*/
Tim1_Init();
TIM_Mode_Config();
while (1)
{
}
}