void GPIO_Toggle_INIT(void)
{
? ? GPIO_InitTypeDef GPIO_InitStructure = {0};
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_0;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
? ? //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
? ? GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/*********************************************************************
?* @fn? ? ? main
?*
?* @brief? ?Main program.
?*
?* @return? none
?*/
int main(void)
{
? ? u8 i = 0;
? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
? ? SystemCoreClockUpdate();
? ? Delay_Init();
#if (SDI_PRINT == SDI_PR_OPEN)
? ? SDI_Printf_Enable();
#else
? ? USART_Printf_Init(115200);
#endif
? ? printf("SystemClk:%d\r\n", SystemCoreClock);
? ? printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
? ? printf("GPIO Toggle TEST\r\n");
? ??
? ? GPIO_Toggle_INIT();
? ? while(1)
? ? {
? ? ? ? Delay_Ms(250);
? ? ? ? (i == 0) ? (i = Bit_SET) : (i = Bit_RESET);
? ? ? ? //GPIO_WriteBit(GPIOD, GPIO_Pin_0, i);
? ? ? ? //GPIO_WriteBit(GPIOD, GPIO_Pin_1, i);
? ? ? ? GPIO_WriteBit(GPIOD, GPIO_Pin_2, i);
? ? }
}
嗯,一般的单片机点灯,配置相关GPIO脚之后,然后写高低电平就可以了,我测试了一下点灯,点一个还好,同时点两个就有问题了
代码如上,两个LED分别接在PD0,PD2脚,
如果只是注释掉“?GPIO_WriteBit(GPIOD, GPIO_Pin_2, i);”两个LED交替亮灭,
如果只是注释掉“?GPIO_WriteBit(GPIOD, GPIO_Pin_0, i);”,PD0上LED长亮。
如果在GPIO_Toggle_INIT();之后插入:GPIO_WriteBit(GPIOD, GPIO_Pin_2, 1);
while 里面?GPIO_WriteBit(GPIOD, GPIO_Pin_0, i); PD0上LED闪烁
如果在GPIO_Toggle_INIT();之后插入:GPIO_WriteBit(GPIOD, GPIO_Pin_0, 1);
while 里面?GPIO_WriteBit(GPIOD, GPIO_Pin_2, i); PD2上LED闪烁
问题来了,同时要两个LED同时亮,同时灭,怎么实现?
我反复试了以上代码,只能把一个写高电平让LED不亮,另一个才能正常控制亮灭