STM32F103C8T6 全部 GPIO 引脚控制 LED 流水灯程序
由于 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()' 这两个函数。
原文地址: https://www.cveoy.top/t/topic/oSW4 著作权归作者所有。请勿转载和采集!