错误原因:将PA3复用为TIM5_Ch4,然后又将PA3初始化普通IO管脚,导致PA3管脚复用失败。
何为管脚复用:复用就是一个引脚有几个功能,1.做普通IO输入输出2.其他外设的输入输出(比如I2C,TIM,SPI等等),这就是复用。
注:管脚功能只能使用一种。
上代码:
#####################################################################
//LED.c
void LedColor_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 错误原因,RCC_APB1,用RCC_APB2PeriphClockCmd,导致错误
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_TIM5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //GPIOA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //ËÙ¶È100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //ÉÏÀ
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_DeInit(TIM5);
TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷5
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1????????,PWM2??????
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //????
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //High???????,??????20%;Low?????,????80%
TIM_OC4Init(TIM5, &TIM_OCInitStructure);
TIM_OCStructInit(&TIM_OCInitStructure); //在程序中这行代码放在了初始化前面。导致初始化异常。
TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPEʹÄÜ
TIM_Cmd(TIM5, ENABLE); //ʹÄÜTIM5
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //KEY0 KEY1 KEY2¶ÔÓ¦Òý½Å
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ
GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOE2,3,4
}
void LedColor(void)
{
static u16 LED_CNT=0;
if(1)
{
if(Flag)
{
LED_CNT++;
if(LED_CNT>=1800)
{
Flag = false;
}
}
else
{
LED_CNT--;
if(LED_CNT<=0)
{
Flag = true;
}
}
TIM_SetCompare4(TIM5,LED_CNT);
delay_ms(1);
// printf("LED_CNT=%d\r\n",LED_CNT);
}
else
{
TIM_SetCompare4(TIM5,0);
}
}
#####################################################################
//mian.c
int main(void)
{
delay_init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
LedColor_Init(1799,800-1);
// -->LED_Init(); //因为将PA3重新初始化为普通IO将PA3重映射覆盖,所以导致定时器功能无法使用。
while(1)
{
LedColor();
}
}
//一直在路上,加油