一. 实验目的:
1、了解stm32f103c8t6最小核心板的主要引脚接口;
2、掌握Keil 开发stm32程序的环境搭建和设置;
3、使用GPIO引脚,外接LED灯,编写程序让LED灯周期性亮灭。
二. 具体实验过程:
1. 了解STM32最小系统核心板(STM32F103C8T6,国际上称为 STM32 Blue Bill开发板) 的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
在Proteus上画出原理图如下
最小系统板的引脚原理图如下所示。
2. 以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;用C语言寄存器方式编程实现
#include "stm32f1xx.h"
// 定义延时函数
void delay(uint32_t count) {
for (uint32_t i = 0; i < count; ++i) {
for (volatile uint32_t j = 0; j < 1000; ++j);
}
}
int main(void) {
// 初始化HAL库
HAL_Init();
// 使能GPIOA、GPIOB和GPIOC时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置GPIOA引脚5为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置GPIOB引脚0为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_0;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 配置GPIOC引脚13为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_13;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
while (1) {
// 点亮GPIOA引脚5,熄灭其他引脚
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
delay(1000); // 延时1秒
// 点亮GPIOB引脚0,熄灭其他引脚
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
delay(1000); // 延时1秒
// 点亮GPIOC引脚13,熄灭其他引脚
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
delay(1000); // 延时1秒
}
}
以上代码通过HAL库对GPIO引脚进行初始化和控制,从而实现不同的LED灯以一秒的间隔轮流点亮和熄灭的效果。主要逻辑包括初始化HAL库,设置GPIO引脚为推挽输出,并在主循环中控制不同的GPIO引脚以实现预期的点亮/熄灭效果。
包含`stm32f1xx.h`头文件,该头文件提供了HAL库的核心功能和对STM32F1xx系列微控制器的支持。
定义了一个简单的延时函数`delay(uint32_t count)`,通过嵌套的空循环来实现。该函数用于在主循环中为LED闪烁效果提供时间间隔。
初始化HAL库
调用`HAL_Init()`函数来初始化HAL库。这是确保HAL库能够正常工作的重要步骤。
初始化GPIO引脚
创建一个`GPIO_InitTypeDef`结构,用于配置GPIO引脚。
将`Mode`设置为`GPIO_MODE_OUTPUT_PP`,表示引脚作为推挽输出。
将`Speed`设置为`GPIO_SPEED_FREQ_LOW`,表示引脚的输出速度较低。
配置GPIOA的引脚5为推挽输出,GPIOB的引脚0为推挽输出,GPIOC的引脚13为推挽输出。主循环中的逻辑
在`while(1)`循环中,控制LED的点亮和熄灭,以实现轮流点亮效果。
首先点亮GPIOA的引脚5,并熄灭其他引脚,然后调用`delay(1000)`延时1秒。
然后,点亮GPIOB的引脚0,并熄灭其他引脚,延时1秒。
接着,点亮GPIOC的引脚13,并熄灭其他引脚,延时1秒。
如此重复,实现三组LED灯以1秒的间隔轮流闪烁的效果。
STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。
#include "stm32f1xx.h"
// 定义延时函数
void delay(uint32_t count) {
for (uint32_t i = 0; i < count; ++i) {
for (volatile uint32_t j = 0; j < 1000; ++j);
}
}
int main(void) {
// 初始化HAL库
HAL_Init();
// 使能GPIOC时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置GPIOC引脚13为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
while (1) {
// 点亮PC13引脚
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
delay(1000); // 延时1秒
// 熄灭PC13引脚
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
delay(1000); // 延时1秒
}
}
作者水平有限,不足之处欢迎指正。