由于 STM32F103C8T6 共有 72 个引脚,其中包括多个复用功能,在本题中我们只使用 GPIO 引脚控制 LED 灯的亮灭,以下是一个使用全部 GPIO 引脚控制 LED 流水灯的程序:

#include "stm32f10x.h"

void delay(uint32_t time);

int main(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  // 打开 GPIO 时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);

  // 配置 PA0-PA7 引脚为输出状态
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // 配置 PB0-PB15 引脚为输出状态
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // 配置 PC0-PC15 引脚为输出状态
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  // 配置 PD0-PD15 引脚为输出状态
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  // 配置 PE0-PE15 引脚为输出状态
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  while (1)
  {
    // 循环左移
    for (int i = 0; i < 16; i++)
    {
      GPIO_SetBits(GPIOA, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOB, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOC, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOD, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOE, GPIO_Pin_0 << i);
      delay(100000);
      GPIO_ResetBits(GPIOA, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOB, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOC, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOD, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOE, GPIO_Pin_0 << i);
    }

    // 循环右移
    for (int i = 15; i >= 0; i--)
    {
      GPIO_SetBits(GPIOA, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOB, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOC, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOD, GPIO_Pin_0 << i);
      GPIO_SetBits(GPIOE, GPIO_Pin_0 << i);
      delay(100000);
      GPIO_ResetBits(GPIOA, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOB, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOC, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOD, GPIO_Pin_0 << i);
      GPIO_ResetBits(GPIOE, GPIO_Pin_0 << i);
    }
  }

  return 0;
}

// 延时函数
void delay(uint32_t time)
{
  while(time--);
}

该程序通过循环左移和循环右移的方式控制 LED 的亮灭,同时使用了 STM32F103C8T6 的全部 GPIO 引脚。需要注意的是,在使用 STM32F103C8T6 的 GPIO 引脚时,需要先打开相应的 GPIO 时钟,并设置引脚的模式和速度。同时,在进行 GPIO 的高低电平控制时,需要使用 'GPIO_SetBits()' 和 'GPIO_ResetBits()' 这两个函数。

STM32F103C8T6 全部 GPIO 引脚控制 LED 流水灯程序

原文地址: https://www.cveoy.top/t/topic/oSW4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录