STM32(F103ZET6)第一课:按键控制LED灯和蜂鸣器

目录

功能要求

设备上电,4个灯灭

按键1按下,4个灯灭

按键2按下,4个灯亮

按键3按下,蜂鸣器响

按键4按下,蜂鸣器关闭

一、开发思路

1.打开原理图找到对应模块的引脚,分析电路工作的原理。

2.顺着引脚找到连接芯片的对应位置,看看到底是PX几。

3.打开参考手册找到GPIOX的位置,并顺着GPIOX的位置找到该部分的时钟总线。

4.在参考手册中找到该总线的寄存器,查看如何配置能够开启对应的时钟。

5.配置引脚模式。低八位(0-7)配置GPIOx_CRL,高八位(8-15)配置GPIOx_CRH。

6.通过ODR/IDR,配置默认输出/输入数据。

7.根据以上编写好对应模块的.c和.h文件。

8.在main函数中进行综合编程,以满足功能要求。

二、详细过程

1.查看原理图


由图分析可知灯低电平亮,高电平灯灭。

由图可知按键1默认低电平,按下是高电平。
按键2,3,4默认高电平,按下低电平。


有图可知蜂鸣器高电平响,低电平不响


在芯片上找到对应的引脚。

2.各模块编写

LED灯

首先进行开时钟。

由寄存器图可知

bash 复制代码
	RCC->APB2ENR |= 0X01 << 6;

此时我们还要配置引脚模式,引脚为低八位查看数据手册的GPIOx_CRL,引脚为低八位查看数据手册的GPIOx_CRH。

该LED灯为低八位,所以我们查看数据手册的GPIOx_CRL:

先对该寄存器有一下了解:

配置模式前我们要简单了解一下各个模式的意思:

输入模式

00:模拟输入模式

在这种模式下,引脚的输入缓冲器被禁用,通常用于模拟信号输入,例如 ADC。

01:浮空输入模式

这是复位后的默认状态。在这种模式下,没有内部上拉或下拉电阻,适用于需要外部电路提供信号驱动的情况。

10:上拉/下拉输入模式

这种模式下,可以使用内部上拉或下拉电阻。具体是上拉还是下拉通过 ODR(输出数据寄存器)来决定:

ODR 为 1 时,上拉。

ODR 为 0 时,下拉。

11:保留

这种模式在输入模式下是保留的,通常不使用。

输出模式

00:通用推挽输出模式(最常用)

在这种模式下,GPIO 引脚可以输出高电平和低电平,适用于大多数需要输出固定电平的场景。

01:通用开漏输出模式

在这种模式下,GPIO 引脚只能拉低电平或者处于高阻状态,适用于需要连接到多路总线的场景,如 I2C。

10:复用功能推挽输出模式

在这种模式下,GPIO 引脚被配置为外围设备的推挽输出,例如 USART 的 TX 引脚。如果外设需要推挽输出,这种模式非常合适。

11:复用功能开漏输出模式

在这种模式下,GPIO 引脚被配置为外围设备的开漏输出,例如 I2C 的 SDA 和 SCL 引脚。这种模式适用于需要外设驱动的开漏输出。

了解以上各种模式之后,就可以得知LED灯引脚只需要配置为0011。(4位配置一个引脚)

下面了解一下八种模式:

模拟输入,接片上外设ADC使用模拟输入,输入进来是个模拟量

浮空输入:之间外部电压转换成逻辑电平1/0

上拉:内部接上拉电阻,默认就是高电平

下拉:内部接下拉电阻,默认就是低电平

输出:

通用推挽

通用开漏

复用推挽

复用开漏

复用和通用区别:

通用:是IO口的基本功能,IO口自己的寄存器控制输出

复用:由片上外设控制IO口输出

推挽:能够正常输出1/0

开漏:输出1处于高阻态,相当于断开,输出0正常(特点:可以读取输入电平)

灯配置:推挽输出

bash 复制代码
void Led_Init()
{
	//配置好模式,然后全灭
	//开APB2时钟
	RCC->APB2ENR |= 0X01 << 6;
  //配置PE2--PE5为通用推挽输出
	GPIOE->CRL &=~(0X0F << 20);//PE5
	GPIOE->CRL |= 0X03 << 20;
	GPIOE->CRL &=~(0X0F << 16);//PE4
	GPIOE->CRL |= 0X03 << 16;
    GPIOE->CRL &=~(0X0F << 12);//PE3
	GPIOE->CRL |= 0X03 << 12;
	GPIOE->CRL &=~(0X0F << 8);//PE2
	GPIOE->CRL |= 0X03 << 8;
	//4个引脚均输出高电平
	GPIOE->ODR |= (0x0F << 2);
	
}
按键使用
bash 复制代码
void key_Init()
{
	//开时钟
	RCC->APB2ENR |= 0x01<<4;//PC
	RCC->APB2ENR |= 0x01<<2;//PA
	//配置模式
	GPIOC->CRL &=~(0X0F << 24);//PC6   key4
	GPIOC->CRL |= 0X04 << 24;
  GPIOC->CRL &=~(0X0F << 20);//PC5   key3
	GPIOC->CRL |= 0X04 << 20;
	GPIOC->CRL &=~(0X0F << 16);//PC4   key2
	GPIOC->CRL |= 0X04 << 16;
	GPIOA->CRL &=~0X0F;//PA0   key1
	GPIOA->CRL |= 0X04;
	
}

需要注意的是:KEY1按下时发出的是一个高平信号,与其他三个不同。

bash 复制代码
int Get_Key_Val(void)
{
	int key_val = 0;
	if(!!(GPIOA->IDR &(0X01 << 0))==1)
		key_val = 1;
	if(!!(GPIOC->IDR &(0X01 << 4))==0)
		key_val = 2;
	if(!!(GPIOC->IDR &(0X01 << 5))==0)
		key_val = 3;
	if(!!(GPIOC->IDR &(0X01 << 6))==0)
		key_val = 4;
	
	return key_val;
}

此处是为了确定那个按键按下的,按下后返回按键值。

蜂鸣器

引脚配置为推挽输出

bash 复制代码
void Beep_Init()
{
	//开时钟
	RCC->APB2ENR |= 0x01<<4;//PC
	//配置模式
	GPIOC->CRL &=~(0X0F << 0);//PC0
	GPIOC->CRL |= 0X03 << 0;
	GPIOC->ODR &= ~0x01;//默认低电平,关闭
}

开始给一个低电平,默认是关闭的。

以上均为寄存器编写。编写时重点是能看懂说名书。

在配引脚前都要进行开时钟。

相关推荐
hairenjing11235 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
模拟IC攻城狮7 小时前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片
IT B业生7 小时前
51单片机教程(六)- LED流水灯
单片机·嵌入式硬件·51单片机
一枝小雨7 小时前
51单片机学习心得2(基于STC89C52):串口通信(UART)
单片机·嵌入式硬件·51单片机
IT B业生8 小时前
51单片机教程(一)- 开发环境搭建
单片机·嵌入式硬件·51单片机
u0101526589 小时前
STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器
笔记·stm32·学习
海绵波波10710 小时前
Webserver(4.8)UDP、广播、组播
单片机·网络协议·udp
好想有猫猫10 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
云卓科技11 小时前
无人车之路径规划篇
人工智能·嵌入式硬件·算法·自动驾驶
stm 学习ing12 小时前
C语言 循环高级
c语言·开发语言·单片机·嵌入式硬件·算法·嵌入式实时数据库