1.系统设计说明
本系统利用Proteus内的STM32F103C4作为微控制器,使用了7个按键和九个LED灯,根据不同按键的触发将会显示出不同颜色的流水灯。每完成一次流水灯循环都会对按键进行一次检测,进入下一次循环。
按键为普通开关K1-K7,LED1, LED4, LED7为红色LED,LED2, LED5, LED8为绿色LED,LED3, LED6 ,LED9为蓝色LED。原理图如下:
2.系统功能说明
按下不同的按键会显示不同颜色的流水灯,如下表:
模式 按键状态 效果
1 仅按下K1 红色LED流水灯
2 仅按下K2 绿色LED流水灯
3 仅按下K3 蓝色LED流水灯
4 仅按下K4 黄色LED流水灯
5 仅按下K5 紫色LED流水灯
6 仅按下K6 青色LED流水灯
7 仅按下K7 白色LED流水灯
8 开关均为按下 关闭流水灯,无LED亮起
9 任意按下两个及以上开关 红、绿、蓝色LED流水灯
注:红+绿=黄 ; 红+蓝=紫 ; 绿+蓝=青 。
3.软件设计说明
首先确定使用STM32F103C4,根据需要自行设计LED和KEY与引脚的连接(注意要避开PB2,PB3,PB4,PA13,PA14,PA15)。
然后对LED的GPIO进行配置。步骤依次为:定义LED连接的GPIO端口--定义控制LED打开关闭的--定义基本混色显示的宏—初始化LED的端口。
led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
/* 定义LED连接的GPIO端口*/
#define LED1_GPIO_PORT GPIOB /* GPIO端口 */
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED1_GPIO_PIN GPIO_Pin_0 /* 连接到SCL时钟线的GPIO */
#define LED2_GPIO_PORT GPIOB /* GPIO端口 */
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED2_GPIO_PIN GPIO_Pin_1 /* 连接到SCL时钟线的GPIO */
#define LED3_GPIO_PORT GPIOB /* GPIO端口 */
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED3_GPIO_PIN GPIO_Pin_5 /* 连接到SCL时钟线的GPIO */
#define LED4_GPIO_PORT GPIOB /* GPIO端口 */
#define LED4_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED4_GPIO_PIN GPIO_Pin_6 /* 连接到SCL时钟线的GPIO */
#define LED5_GPIO_PORT GPIOB /* GPIO端口 */
#define LED5_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED5_GPIO_PIN GPIO_Pin_7 /* 连接到SCL时钟线的GPIO */
#define LED6_GPIO_PORT GPIOB /* GPIO端口 */
#define LED6_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED6_GPIO_PIN GPIO_Pin_8 /* 连接到SCL时钟线的GPIO */
#define LED7_GPIO_PORT GPIOB /* GPIO端口 */
#define LED7_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED7_GPIO_PIN GPIO_Pin_9 /* 连接到SCL时钟线的GPIO */
#define LED8_GPIO_PORT GPIOB /* GPIO端口 */
#define LED8_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED8_GPIO_PIN GPIO_Pin_10 /* 连接到SCL时钟线的GPIO */
#define LED9_GPIO_PORT GPIOB /* GPIO端口 */
#define LED9_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED9_GPIO_PIN GPIO_Pin_11 /* 连接到SCL时钟线的GPIO */
/* 定义控制IO的宏 */
#define LED1_OFF GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
#define LED1_ON GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
#define LED2_OFF GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
#define LED2_ON GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
#define LED3_OFF GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
#define LED3_ON GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
#define LED4_OFF GPIO_SetBits(LED4_GPIO_PORT,LED4_GPIO_PIN);
#define LED4_ON GPIO_ResetBits(LED4_GPIO_PORT,LED4_GPIO_PIN);
#define LED5_OFF GPIO_SetBits(LED5_GPIO_PORT,LED5_GPIO_PIN);
#define LED5_ON GPIO_ResetBits(LED5_GPIO_PORT,LED5_GPIO_PIN);
#define LED6_OFF GPIO_SetBits(LED6_GPIO_PORT,LED6_GPIO_PIN);
#define LED6_ON GPIO_ResetBits(LED6_GPIO_PORT,LED6_GPIO_PIN);
#define LED7_OFF GPIO_SetBits(LED7_GPIO_PORT,LED7_GPIO_PIN);
#define LED7_ON GPIO_ResetBits(LED7_GPIO_PORT,LED7_GPIO_PIN);
#define LED8_OFF GPIO_SetBits(LED8_GPIO_PORT,LED8_GPIO_PIN);
#define LED8_ON GPIO_ResetBits(LED8_GPIO_PORT,LED8_GPIO_PIN);
#define LED9_OFF GPIO_SetBits(LED9_GPIO_PORT,LED9_GPIO_PIN);
#define LED9_ON GPIO_ResetBits(LED9_GPIO_PORT,LED9_GPIO_PIN);
/* 基本混色 */
//红
#define LED_RED1 \
LED1_ON;\
LED2_OFF\
LED3_OFF
#define LED_RED2 \
LED4_ON;\
LED5_OFF\
LED6_OFF
#define LED_RED3 \
LED7_ON;\
LED8_OFF\
LED9_OFF
//绿
#define LED_GREEN1 \
LED1_OFF;\
LED2_ON\
LED3_OFF
#define LED_GREEN2 \
LED4_OFF;\
LED5_ON\
LED6_OFF
#define LED_GREEN3 \
LED7_OFF;\
LED8_ON\
LED9_OFF
//蓝
#define LED_BLUE1 \
LED1_OFF;\
LED2_OFF\
LED3_ON
#define LED_BLUE2 \
LED4_OFF;\
LED5_OFF\
LED6_ON
#define LED_BLUE3 \
LED7_OFF;\
LED8_OFF\
LED9_ON
//黄(红+绿)
#define LED_YELLOW1 \
LED1_ON;\
LED2_ON\
LED3_OFF
#define LED_YELLOW2 \
LED4_ON;\
LED5_ON\
LED6_OFF
#define LED_YELLOW3 \
LED7_ON;\
LED8_ON\
LED9_OFF
//紫(红+蓝)
#define LED_PURPLE1 \
LED1_ON;\
LED2_OFF\
LED3_ON
#define LED_PURPLE2 \
LED4_ON;\
LED5_OFF\
LED6_ON
#define LED_PURPLE3 \
LED7_ON;\
LED8_OFF\
LED9_ON
//青(绿+蓝)
#define LED_CYAN1 \
LED1_OFF;\
LED2_ON\
LED3_ON
#define LED_CYAN2 \
LED4_OFF;\
LED5_ON\
LED6_ON
#define LED_CYAN3 \
LED7_OFF;\
LED8_ON\
LED9_ON
//白(红+绿+蓝)
#define LED_WHITE1 \
LED1_ON;\
LED2_ON\
LED3_ON
#define LED_WHITE2 \
LED4_ON;\
LED5_ON\
LED6_ON
#define LED_WHITE3 \
LED7_ON;\
LED8_ON\
LED9_ON
//黑(全部关闭)
#define LED_RGBOFF \
LED1_OFF;\
LED2_OFF;\
LED3_OFF;\
LED4_OFF;\
LED5_OFF;\
LED6_OFF;\
LED7_OFF;\
LED8_OFF;\
LED9_OFF
void LED_GPIO_Config(void);
#endif /* __LED_H */
led.c
#include "led.h"
/*初始化LED的IO*/
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK | LED4_GPIO_CLK | LED5_GPIO_CLK | LED6_GPIO_CLK | LED7_GPIO_CLK | LED8_GPIO_CLK | LED9_GPIO_CLK, ENABLE);
/*选择要控制的GPIO引脚1*/
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚2*/
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚3*/
GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚4*/
GPIO_InitStructure.GPIO_Pin = LED4_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚5*/
GPIO_InitStructure.GPIO_Pin = LED5_GPIO_PIN;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED5_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚6*/
GPIO_InitStructure.GPIO_Pin = LED6_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED6_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚7*/
GPIO_InitStructure.GPIO_Pin = LED7_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED7_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚8*/
GPIO_InitStructure.GPIO_Pin = LED8_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED8_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚9*/
GPIO_InitStructure.GPIO_Pin = LED9_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED9_GPIO_PORT, &GPIO_InitStructure);
/* 关闭所有led灯 */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED4_GPIO_PORT, LED4_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED5_GPIO_PORT, LED5_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED6_GPIO_PORT, LED6_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED7_GPIO_PORT, LED7_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED8_GPIO_PORT, LED8_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);
}
接着对K1-K7的GPIO进行配置。步骤依次为:定义K1-K7连接的GPIO端口--初始化KEY的端口—设计按键检测函数。
key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
// 引脚定义
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_PIN GPIO_Pin_1
#define KEY1 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_1 ) //读取按键
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY2_GPIO_PORT GPIOA
#define KEY2_GPIO_PIN GPIO_Pin_2
#define KEY2 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_2 ) //读取按键
#define KEY3_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY3_GPIO_PORT GPIOA
#define KEY3_GPIO_PIN GPIO_Pin_3
#define KEY3 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_3 ) //读取按键
#define KEY4_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY4_GPIO_PORT GPIOA
#define KEY4_GPIO_PIN GPIO_Pin_4
#define KEY4 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_4 ) //读取按键
#define KEY5_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY5_GPIO_PORT GPIOA
#define KEY5_GPIO_PIN GPIO_Pin_5
#define KEY5 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_5 ) //读取按键
#define KEY6_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY6_GPIO_PORT GPIOA
#define KEY6_GPIO_PIN GPIO_Pin_6
#define KEY6 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_6 ) //读取按键
#define KEY7_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY7_GPIO_PORT GPIOA
#define KEY7_GPIO_PIN GPIO_Pin_7
#define KEY7 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_7 ) //读取按键
void Key_GPIO_Config(void);
uint8_t Key_Scan( u8 );
#endif /* __KEY_H */
key.c
#include "stm32f10x.h"
#include "key.h"
/* 配置按键用到的I/O口 */
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键端口的时钟*/
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
// 设置按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
//设置按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN;
//设置按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY4_GPIO_PIN;
//设置按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY4_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY5_GPIO_PIN;
//设置按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY5_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY6_GPIO_PIN;
//设置按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY6_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY7_GPIO_PIN;
//设置按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY7_GPIO_PORT, &GPIO_InitStructure);
}
void delay(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--) ;
}
}
/* 按键检测 */
uint8_t Key_Scan( u8 mode )
{
u8 key;
/*检测按键,不同的按键对应不同的模式*/
if( KEY1==0 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )
{
delay(10); //去抖动
if( KEY1==0) key=1;
}
else if( KEY1==1 && KEY2==0 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )
{
delay(10); //去抖动
if( KEY2==0) key=2;
}
else if( KEY1==1 && KEY2==1 && KEY3==0 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )
{
delay(10); //去抖动
if( KEY3==0) key=3;
}
else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==0 && KEY5==1 && KEY6==1 && KEY7==1 )
{
delay(10); //去抖动
if( KEY4==0) key=4;
}
else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==0 && KEY6==1 && KEY7==1 )
{
delay(10); //去抖动
if( KEY5==0) key=5;
}
else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==0 && KEY7==1 )
{
delay(10); //去抖动
if( KEY6==0) key=6;
}
else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==0 )
{
delay(10); //去抖动
if( KEY7==0) key=7;
}
else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )
{
delay(10); //去抖动
if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 ) key=8;
}
else key=9;
return key;
}
Main函数的循环里,设置几种模式的选择,每完成一次流水灯循环都会对按键进行一次检测,确定下一次循环的模式。
main.c (其实这里的选择用switch看着会更有条理)
#include "stm32f10x.h" // 相当于51单片机中的 #include
#include "led.h"
#include "key.h"
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--) ;
}
}
int main(void)
{
u8 t;
LED_GPIO_Config();/* LED 端口初始化 */
Key_GPIO_Config(); /* KEY 端口初始化 */
while (1) /*进行流水灯的循环*/
{
//if( t == 9 ) GPIO_ResetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);//测试电路
t=Key_Scan(1);
//if( t == 2 ) GPIO_ResetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);//测试电路
if(t==1) {LED_RED1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_RED2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_RED3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
else if(t==2) {LED_GREEN1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_GREEN2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_GREEN3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
else if(t==3) {LED_BLUE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_BLUE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_BLUE3;delay_ms(30);LED_RGBOFF;delay_ms(10); }
else if(t==4) {LED_YELLOW1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_YELLOW2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_YELLOW3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
else if(t==5) {LED_PURPLE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_PURPLE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_PURPLE3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
else if(t==6) {LED_CYAN1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_CYAN2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_CYAN3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
else if(t==7) {LED_WHITE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_WHITE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_WHITE3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
else if(t==8) {LED_RGBOFF;delay_ms(10);}
else if(t==9) {LED1_ON;delay_ms(30);LED1_OFF;LED2_ON;delay_ms(30);LED2_OFF;LED3_ON;delay_ms(30);LED3_OFF;\
LED4_ON;delay_ms(30);LED4_OFF;LED5_ON;delay_ms(30);LED5_OFF;LED6_ON;delay_ms(30);LED6_OFF;\
LED7_ON;delay_ms(30);LED7_OFF;LED8_ON;delay_ms(30);LED8_OFF;LED9_ON;delay_ms(30);LED9_OFF;}
}
}
4.调试及运行结果
程序编译结果
红色流水灯显示
白色流水灯显示
红、绿、蓝色流水灯显示
万事开头难,这是我第一次对STM32F103进行编程及仿真使用,虽然只是做了一系列的流水灯,但是我对库函数的使用有了更熟练的应用和更清晰的理解。在编程和Debug的过程中,我也增长了一些处理错误和警告的能力。
刚开始的时候我对分模块编程以及对GPIO的初始化配置毫无头绪,跟着STM32F103的相关教学视频学习后,开始逐渐尝试着配置,发现使用库函数进行配置其实很简单,重要是的要下手去编写一些程序,分模块依次攻破,就比较好理清头绪了。
在Debug的过程,我犯了一些很低级的错误,例如写了一些中文的“(”怎么改程序都没发现,例如忘记在led.c函数内调用led.h,例如在设计按键检测函数是应为“与”逻辑我写成了“或”逻辑…其次经过排查,结合CSDN的帖子答疑,一些结构上的问题都能解决。
当然一定要注意要避开PB2,PB3,PB4,PA13,PA14,PA15,我最开始连接引脚的时候刚好GPIOB用的是前九个,GPIOA用的是后七个,刚刚好全部撞上了这些引脚导致仿真的时候电平一直不对劲,后来查阅了资料才知道它们都是有特殊作用的。