【STM32】嵌入式实验二 GPIO 实验 (前三个设计)

项目源文件请看:https://download.csdn.net/download/qq_61814350/89222788?spm=1001.2014.3001.5501 

在这里做一个自己看了之后觉得可以推荐的课程的汇总:

【【STM32教程】入门教程(基于HAL库+CubeMX+MDK-ARM)-哔哩哔哩】 https://b23.tv/C2BwM3H

【【6.2】手把手带你编写GPIO按键与LED驱动程序——Kevin带你读《STM32Cube高效开发教程基础篇》-哔哩哔哩】 https://b23.tv/FmQgg7l

【【正点原子】手把手教你学STM32CubeIDE开发-哔哩哔哩】 https://b23.tv/TeeUPbG

 

1. 按键亮灯

设计 GPIO 实验项目 1,功能:当按键 KB1 按下时,实验板上全彩发光二极管周边 的发光二极管全亮,当按键 KB2 按下时跑马灯 D0 闪亮。

实验要求基于寄存器的GPIO配置,所以需要手动操作寄存器来配置时钟和输入输出模式(如果不要求,在cubemx里可以直接配置)。

跑马灯和按键KB1,KB2的端口模式为推挽输出和输入,因此需要编程将它们设置为对应的模式:

df56b65ba17144b59a2906495f92c292.png

ac25266fa34743abafd6f029816f082c.png

 参考下面的端口位配置表,

一个端口占用配置寄存器的四位来设置工作模式,可以知道CRL(0-7(低八位)的引脚对应CRL配置寄存器)里输出跑马灯和输入按键KB1,KB2的每个端口应配置为:0011(16进制0x3)和0100(16进制0x4)

afb8555b49fb465c885433c0d7c800c2.png

7a67e291f15c45d0af0e9944da90a602.png 那么,使用 CubeMX 创建工程,只设置芯片选型、 系统时钟、调试端口; GPIO 配置在程序中通过寄存器配置完成。

按键按下为低电平,所以检测 数据输入寄存器(GPIOx_IDR)与(&)上对应位为1的数的 结果,比如PE0就是与 0x01。

if((GPIOE->IDR&0X01)==0){
			flag=1;
		}
		else if((GPIOE->IDR&0X02)==0){
			flag=2;
		}

功能是 当按键 KB1 按下时,实验板上全彩发光二极管周边 的发光二极管全亮,当按键 KB2 按下时跑马灯 D0 闪亮,因为跑马灯是高电平点亮,就是数据输出寄存器 GPIOF_ODR 对应位 置为1,D0闪亮的话就是对这一位不断取反,这一位异或1其他位异或0即可。

if(flag==1){
		    GPIOF->ODR|=0XFF;
		}
		else if(flag==2){
		  GPIOF->ODR^=0X01;
			HAL_Delay(50);
		}

 

主要代码如下:

#flag设为全局变量,方便调试查看
int flag=0;
int main(void)
{

  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();


  /* Initialize all configured peripherals */
  MX_GPIO_Init();

	
	RCC->APB2ENR|=1<<7;//使能PORTF时钟
	GPIOF->CRL&=0X00000000;
	GPIOF->CRL|=0X33333333;//PF.0-PF.7推挽输出
	GPIOF->ODR=0X00;//清除显示
	
	RCC->APB2ENR|=1<<6;//使能PORTE时钟
	GPIOE->CRL&=0X00;
	GPIOE->CRL|=0X44;//PE.0-PE.1开漏输入
  while (1)
  {
   
		if((GPIOE->IDR&0X01)==0){
			flag=1;
		}
		else if((GPIOE->IDR&0X02)==0){
			flag=2;
		}
		else flag=0;
		
		
		if(flag==1){
		    GPIOF->ODR|=0XFF;
		}
		else if(flag==2){
		  GPIOF->ODR^=0X01;
			HAL_Delay(50);
		}else{
			GPIOF->ODR=0X00;
		}
		
  }
}

2.顺时针方向旋转的跑马灯

实现顺时针方向旋转的跑马灯,跑马灯延时 0.2 秒。按照灯的顺序,将GPIOF_ODR 对应位 置为1。

基于寄存器:

RCC->APB2ENR|=1<<6;
	GPIOE->CRL&=0X00000000;
	GPIOE->CRL|=0X44;

//while里

for(int i=0;i<8;i++){
		GPIOF->ODR=0X01<<i;
//这里的延时不是0.2s,自行调整
		for(int k=0;k<100000;k++);
		}

HAL库:

uint16_t x=0x0001;
for(int i=0;i<8;i++){
		//GPIOF->ODR=0X01<<i;
		//for(int k=0;k<100000;k++);
			HAL_GPIO_WritePin(GPIOF,x<<i,1);
			HAL_Delay(200);
			HAL_GPIO_WritePin(GPIOF,x<<i,0);
		}

 3.按键控制跑马灯方向

编写程序,当按键 KB1 按下时,跑马灯按顺时针方向旋转,按下 KB2 时,跑马灯 按逆时针方向旋转。

结合前两者代码,为了方便,逆时针用新的变量y=0x0080 右移 来选择八个灯的引脚。

RCC->APB2ENR|=1<<6;
	GPIOE->CRL&=0X00000000;
	GPIOE->CRL|=0X44;
	uint16_t x=0x0001;
	uint16_t y=0x0080;
  while (1)
  {
		if((GPIOE->IDR&0X01)==0){
			flag=1;
		}
		else if((GPIOE->IDR&0X02)==0){
			flag=2;
		}
		else if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_6)==0){
		    flag=3;
		}
		//else flag=0;
		
		
		
		
		if(flag==1){

			for(int i=0;i<8;i++){
			HAL_GPIO_WritePin(GPIOF,x<<i,1);
			HAL_Delay(200);
			HAL_GPIO_WritePin(GPIOF,x<<i,0);
		}
			
		}
		else if(flag==2){
			for(int i=0;i<8;i++){
			HAL_GPIO_WritePin(GPIOF,y>>i,1);
			HAL_Delay(200);
			HAL_GPIO_WritePin(GPIOF,y>>i,0);}
			
		}else if(flag==3){

		}else{
		GPIOF->ODR=0X00;
		}
		
  }

}

 

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来回答您的问题。首先,您需要准备以下材料: 1. 一块STM32板 2. 两个共阳式两位数码管 3. 杜邦线若干 接下来,按照以下步骤进行实验: 1. 将两位数码管的VCC引脚连接到STM32板的5V引脚上,将GND引脚连接到开板的GND引脚上。 2. 将数码管的A、B、C、D、E、F、G引脚分别连接到开板的PB0、PB1、PB2、PB3、PB4、PB5、PB6引脚上。 3. 在Keil MDK中新建工程,并将编译选项设置为STM32F103C8T6芯片。 4. 在main函数中初始化GPIO口,将PB0~PB6引脚设置为输出模式。 5. 编写函数`void Display(unsigned char a, unsigned char b)`,该函数用于将a、b两个数字分别显示在两个数码管上。具体实现可以参考下面的代码: ``` void Display(unsigned char a, unsigned char b) { unsigned char seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //数码管段码表 unsigned char high, low; high = a / 10; //分离出高位数字 low = a % 10; //分离出低位数字 GPIOB->ODR = (GPIOB->ODR & 0xff80) | seg[high]; //显示高位数字 Delay(5); //延5ms GPIOB->ODR = (GPIOB->ODR & 0xff80) | seg[low]; //显示低位数字 Delay(5); //延5ms high = b / 10; //分离出高位数字 low = b % 10; //分离出低位数字 GPIOB->ODR = (GPIOB->ODR & 0xff80) | seg[high] | 0x80; //显示高位数字,并点亮另一个数码管的小数点 Delay(5); //延5ms GPIOB->ODR = (GPIOB->ODR & 0xff80) | seg[low]; //显示低位数字 Delay(5); //延5ms } ``` 6. 在main函数中循环调用`Display`函数,将需要显示的两位数字作为参数传递进去即可。 至此,您就完成了STM32嵌入式仿真静态两位数码管显示实验。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guts350

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值