GPIO的使用-以点亮LED为例

使用GPIO一共需要两个步骤:

  • 1、需要打开GPIO的对应时钟,使用单片机的外设时,需要先打开对应的时钟后才能使用相应外设。 根据外设在系统总线上的分布,调用stm32f10x_rcc中的函数:RCC_APB2PeriphClockCmd让时钟使能
  • 2、调用GPIO库函数,初始化对应的GPIO端口,其中需要设置的有:GPIO的管脚号,GPIO的速度以及GPIO的运行模式。

根据中文参考手册可以查询到GPIOA在APB2这条时钟总线上:

GPIO的使用-以点亮LED为例-1

编写初始化函数,并调用库函数来开启时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

从GPIO库中调用GPIO初始化函数,完整代码如下:

void LED_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct;

    // 时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    // GPIO初始化
    GPIO_Init(GPIOC, &GPIO_InitStruct);
}

GPIO的使用:

GPIO库中提供多个函数

GPIO的使用-以点亮LED为例-2

以点亮LED为例,可以使用不同的函数来实现功能,代码如下:

void LED_Play(void) {
    u16 i = 0;
    // 方法一
    // 该方法控制GPIO指定位输出电平
    // GPIO_ResetBits(GPIOC, GPIO_Pin_13);

    // 方法二
    // 该方法控制GPIO指定位输出指定电平
    GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
    //SysTickDelayMs(100);
    delay_us(900);

    GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
    // SysTickDelayMs(100);
    delay_us(900);

    // 方法三
    // 对整个GPIO端口的所有位进行操作,因此写入的数值为16进制数
    // 同时对整个IO口进行写入
    // GPIO_Write(GPIOC, 0xEF);

    //实现呼吸灯
    //实现呼吸灯需要注意,延时函数需要用us级,ms级时间过慢
    //设置的延时参数最小不能小于1,否则不会产生呼吸效果并且无法实现呼吸的反转
    for(i = 0; i<1000; i++) {
        //由亮变暗
        GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
        //SysTickDelayMs(100);
        delay_us(1+i);

        GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
        // SysTickDelayMs(100);
        delay_us(1000-i);
        if(i == 999) {
            for(i = 0; i<1000; i++) {
                //由暗变亮
                GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
                //SysTickDelayMs(100);
                delay_us(1000-i);

                GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
                // SysTickDelayMs(100);
                delay_us(1+i);
            }
        }
    }
}