实验准备
软件 protuse8.9 keil5
硬件 STM32F103C8T6最小系统版 面包板 led*3 stlink 跳线若干
实验目的
了解寄存器的配置和输出流程,完成实际的硬件操作
实验任务
一. 了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
最小系统板的引脚原理图如下所示,电路原理图请网上查找。
二. 以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)用C语言寄存器方式编程实现,代码须有详细注解。
3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。
实验内容
实验内容
实验要求1
用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
步骤1
了解STM32最小系统核心板(STM32F103C8T6的电路原理图
步骤2
由电路原理图,创建工程并设计电路图
步骤3
Keil5下生成hex文件在proteus仿真
代码如下
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
void delay_ms(uint32_t ms)
{
uint32_t i_cnt,j_cnt;
for(i_cnt=0;i_cnt<3000;i_cnt++);
for(j_cnt=0;j_cnt<ms;j_cnt++);
}
uint32_t i;
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
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_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC->BSRR=0xff;
while (1)
{
for(i=0;i<8;i++)
{
delay_ms(99000);
GPIOC->BRR=(1<<i);
delay_ms(99000);
GPIOC->BSRR=(1<<i);
}
}
}
步骤4
仿真结果
实验要求2
二. 以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)用C语言寄存器方式编程实现,代码须有详细注解。
3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。
步骤1
写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
关闭GPIOB的Pin9和GPIOC的Pin15灯
延时1秒
点亮GPIOB的Pin9灯
关闭GPIOA的Pin7和GPIOC的Pin15灯
延时1秒
点亮GPIOC的Pin15灯
关闭GPIOA的Pin7和GPIOB的Pin9灯
延时1秒
GPIOx端口的各寄存器地址和详细参数:
GPIOA_BASE:0x40010800
GPIOB_BASE:0x40010C00
GPIOC_BASE:0x40011000
GPIOx_CRL/CRH:GPIO配置寄存器,用于配置各引脚的模式、速度和推挽/开漏等属性。
步骤2
用C语言寄存器方式编程实现,代码须有详细注解
代码如下
#include <stdint.h>
#include <stm32f10x.h>
void delay(uint32_t count) {
for (volatile uint32_t i = 0; i < count; ++i) {
for (volatile uint32_t j = 0; j < 7200; ++j) {}
}
}
int main(void) {
// 1. 初始化GPIOA、GPIOB和GPIOC的相关寄存器,配置为输出模式
// 使能GPIOA、GPIOB和GPIOC的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
// 配置GPIOA的Pin7为推挽输出模式
GPIOA->CRL &= ~(GPIO_CRL_CNF7 | GPIO_CRL_MODE7);
GPIOA->CRL |= GPIO_CRL_MODE7;
// 配置GPIOB的Pin9为推挽输出模式
GPIOB->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9);
GPIOB->CRH |= GPIO_CRH_MODE9;
// 配置GPIOC的Pin15为推挽输出模式
GPIOC->CRH &= ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13);
GPIOC->CRH |= GPIO_CRH_MODE13;
// 2. 循环中轮流点亮其中一个LED灯,并延时1秒
while (1) {
// 点亮GPIOA的Pin7灯
GPIOA->BSRR = GPIO_BSRR_BS7;
// 关闭GPIOB的Pin9和GPIOC的Pin15灯
GPIOB->BRR = GPIO_BRR_BR9;
GPIOC->BRR = GPIO_BRR_BR13;
delay(1000); // 延时1秒
// 点亮GPIOB的Pin9灯
GPIOB->BSRR = GPIO_BSRR_BS9;
// 关闭GPIOA的Pin7和GPIOC的Pin15灯
GPIOA->BRR = GPIO_BRR_BR7;
GPIOC->BRR = GPIO_BRR_BR13;
delay(1000); // 延时1秒
// 点亮GPIOC的Pin15灯
GPIOC->BSRR = GPIO_BSRR_BS13;
// 关闭GPIOA的Pin7和GPIOB的Pin9灯
GPIOA->BRR = GPIO_BRR_BR7;
GPIOB->BRR = GPIO_BRR_BR9;
delay(1000); // 延时1秒
}
return 0;
}
步骤3
3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。
代码如下
#include <stdint.h>
#include <stm32f10x.h>
#include <Delay.h>
int main(void) {
// 1. 初始化GPIOA、GPIOB和GPIOC的相关寄存器,配置为输出模式
// 使能GPIOA、GPIOB和GPIOC的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
// 配置GPIOA的Pin7为推挽输出模式
GPIOA->CRL &= ~(GPIO_CRL_CNF7 | GPIO_CRL_MODE7);
GPIOA->CRL |= GPIO_CRL_MODE7;
// 配置GPIOB的Pin9为推挽输出模式
GPIOB->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9);
GPIOB->CRH |= GPIO_CRH_MODE9;
// 配置GPIOC的Pin13为推挽输出模式
GPIOC->CRH &= ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13);
GPIOC->CRH |= GPIO_CRH_MODE13;
// 2. 循环中轮流点亮其中一个LED灯,并延时1秒
while (1) {
// 点亮GPIOA的Pin7灯
GPIOA->BSRR = GPIO_BSRR_BS7;
// 关闭GPIOB的Pin9和GPIOC的Pin13灯
GPIOB->BRR = GPIO_BRR_BR9;
GPIOC->BRR = GPIO_BRR_BR13;
Delay_ms(1000); // 延时1秒
// 点亮GPIOB的Pin9灯
GPIOB->BSRR = GPIO_BSRR_BS9;
// 关闭GPIOA的Pin7和GPIOC的Pin13灯
GPIOA->BRR = GPIO_BRR_BR7;
GPIOC->BRR = GPIO_BRR_BR13;
Delay_ms(1000); // 延时1秒
// 点亮GPIOC的Pin13灯
GPIOC->BSRR = GPIO_BSRR_BS13;
// 关闭GPIOA的Pin7和GPIOB的Pin9灯
GPIOA->BRR = GPIO_BRR_BR7;
GPIOB->BRR = GPIO_BRR_BR9;
Delay_ms(1000); // 延时1秒
}
return 0;
}
实验总结
通过本次实验我掌握通过STM32最小系统核心板搭建电路的方法,通过GPIOA、GPIOB、GPIOC三个端口控制三只LED灯的闪烁,闪烁间隔为1秒。
并熟悉了配置GPIO端口的工作模式和输出模式。在本实验中,使用的是推挽输出模式。
然后,需要设置GPIO端口的输出速度。在本实验中,使用的是中速输出模式。
接下来,需要设置GPIO端口的输出状态。通过设置GPIO端口的寄存器来实现LED灯的亮灭控制。
最后,为了实现轮流闪烁,可以使用延时函数来控制LED灯的亮灭状态切换。