关于STM32的IO口IN/OUT控制

来源:互联网 发布:linux缺少iso 9660图像 编辑:程序博客网 时间:2024/05/20 23:03

今天我们来讲解一下io口输入输出的控制,其实其差别仅仅在于IO口模式不同而已。

先来看看硬件电路图,已在图中表明IO管脚。

打开模板文件template,首先建立LED灯的初始化,其次建立按键初始化,当初始化完成后,我们便能按照自己的意图通过按键控制LED灯了。

LED初始化。

void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);//´ò¿ªGPIOB¡¢DµÄʱÖÓ


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//ʹÓÃÁËPB5
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//Ëٶȣº50M£¬ËٶȲ»¿ÉËæÒâ¸ü¸Ä£¬µã»÷50MÓÒ¼ü¿É¿´µ½Óм¸Öֿɸü¸ÄµÄËٶȡ£
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIOģʽ£ºÍÆÍìÊä³öģʽ¡£Í¬ÑùÓÒ¼ü¿É¿´µ½¼¸ÖÖģʽ¡£

GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯º¯Êý   
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//ʹÓÃÁËPD12
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//Ëٶȣº50M£¬ËٶȲ»¿ÉËæÒâ¸ü¸Ä£¬µã»÷50MÓÒ¼ü¿É¿´µ½Óм¸Öֿɸü¸ÄµÄËٶȡ£
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIOģʽ£ºÍÆÍìÊä³öģʽ¡£Í¬ÑùÓÒ¼ü¿É¿´µ½¼¸ÖÖģʽ¡£
  

GPIO_Init(GPIOD, &GPIO_InitStructure);//³õʼ»¯º¯Êý   

//GPIOB->BRR = 0x0020;//д¼Ä´æÆ÷£¬°Ñ¶ÔӦΪÀ­³ÉµÍµçƽ.
GPIOB->BSRR |= (1<<5) ;//д1   ´Ë³õʼ»¯¿ØÖÆ×ÅGPIOB¡¢DµÄÃð¡£
GPIOD->BSRR |= (1<<12) ;//д1
//GPIOB->BRR &= ~(1<<5); //д0


}

按键初始化

void key_init(void)//½«IO¿ÚÉèÖÃΪÊäÈëģʽʱ£¬²»ÐèÒªÌí¼ÓIOËٶȡ£
{
GPIO_InitTypeDef GPIO_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
//´ò¿ªGPIOBµÄʱÖÓ£¬´Ë´¦Ôٴγõʼ»¯GPIODʱÒòΪÈç¹û½«led_init()×¢ÊÍ£¬ÄÇôkey2½«²»¿ÉÓá£
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//ʹÓÃÁËPB5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIOģʽ£ºÉÏÀ­
GPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯º¯Êý   
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//ʹÓÃÁËPD12
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIOģʽ£ºÉÏÀ­
GPIO_Init(GPIOD, &GPIO_InitStructure);//³õʼ»¯º¯Êý   
}

最后在控制。

int main(void)
{
led_init();
key_init();
while (1)
{
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0)
{
GPIOB->BRR |= (1<<5) ;//BRRÓÐЧʱΪµÍ£   LEDÁÁ
while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0);//µÈ´ý°´¼üÊÍ·Å¡£
GPIOB->BSRR |= (1<<5) ;//BSRRÓÐЧʱΪ¸ß¡£LEDÃð
}
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3)==0)
{
GPIOD->BRR |= (1<<12) ;//BRRÓÐЧʱΪµÍ£   LEDÁÁ
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3)==0);//µÈ´ý°´¼üÊÍ·Å¡£
GPIOD->BSRR |= (1<<12) ;//BSRRÓÐЧʱΪ¸ß¡£LEDÃð
}
}
}

以上代码用的是查询法,实现led灯的点动控制。中断法下次介绍。

0 0
原创粉丝点击