其次,本文不解释RCC和GPIO端口的设置和分析。 具体内容可以阅读我的文章:详细介绍如何阅读STM32开发板电路原理图、芯片文档和开发手册,并编写测试程序:点亮一个LED灯
好吧,让我们言归正传,首先打开你的电路原理图:
开发单片机时如果要实现任何功能,首先要查看电路原理图,找到这些元件的连接位置,然后按照开发手册进行开发。
这次我们想让蜂鸣器发出声音。 蜂鸣器在电路中的符号是BEEP,所以我们需要在电路原理图中找到BEEP。
我的就在这个位置,按照电路原理图就能找到。
让我们来看看:
找到之后,比看这个电路的设计图还要快。 在学习的过程中,你还应该知道这些符号和线条的含义。 下面我就给大家解释一下。
这条线路从这里开始
不是来自
请务必记住您在这里开始阅读的内容。 让我解释一下原因。
首先,PG属于电源电流检测模块。 当你的电流不符合标准时,PG就不会流动。 前面的VCC3.3意味着我们必须至少给出3.3v的电压才能让PG通过。
下面的Q2代表开关管。 当PG有效时,Q2驱动S8050放大电流。 S8050是晶体管,用于放大电频率。 如果被阻断,电流不会被放大,而是会转向GND。
最后可以看到下面连接了一个GND。
GND代表地。 这个地指的是你开发板的铜片,或者塑料,或者真实的地。 属于电源负极。 当供电电源不同时,PG模块会报告错误信号,Q2将使能。 下到负极地GND,这样这个电源就不能驱动后续的电路工作了。
这样做的方法是为了保证当电流没有达到标准时,电流不会流到后面,防止损坏器件。 当然,如果电流太大,就会直接烧毁。
首先,R37是什么意思?
电路中,R代表电阻,用于限制电流,防止电流过大烧毁器件。 37代表电阻,代表第37个电阻。 其他电路可能称其为37R,但这并不重要。 我们只需要记住它。 ,R代表电路中的电阻。
1k以下
它代表的是电流,单位是欧姆,1k=1千欧,这代表了电阻的阻值,也就是说至少有1千欧的电流可以流过电阻,符号是Ω。
R38和10K相信在这里就不用我多说了。 它们是第 38 个电阻,电阻值为 10,000 Ω(欧姆)。
终于来了
,这是导致 BEEP 蜂鸣器的电路。 一旦R37通过,蜂鸣器电路就会被驱动。
从上面我们可以知道,我们的电源需要提供至少3.3v的电压才能驱动设备工作。 如果电流不够,就会流到GND。 如果足够的话,就会引出BEEP电路。 在此过程中,电阻会吸收部分电流。 这个没关系,因为这是为了保护电路,只要保证达到3.3v就可以了。
然后我们从ttl电路知道我们需要向它发送一个高电平。 我们不必担心电压。 我们只要选择对应多少伏的数据线就可以了。 数据线将电脑输出的电流经过一些电压转换模块。 要将其转换成相应的电流,一般可以购买开发板自带的数据线。
那么我们再来看看CPU端,看看BEEP是和CPU连接在哪里的。
你可以在这里看到BEEP连接
CPU周围有很多端口,PB、PA等,我们的BEEP对应PB组引脚,引脚号为8。我们可以通过芯片手册查看PB组引脚连接到哪个端口。 的
可以看到我们的PB引脚连接到了GPIOB端口,GPIO端口连接到了AHB2总线。 我们先来看看AHB总线的介绍。
AHB 总线上有一个 RCC 时钟。 这篇文章其实和上一篇文章是一样的。
我们可以在芯片手册中找到内存映射,可以看到A口的内存映射,基本步骤和上一篇文章一样。
通用微控制器开发的基本步骤:
1、看电路原理图,找到你要开发功能的模块,了解其工作模式
2. 检查它连接到哪个引脚以及由哪个端口管理。
3.看看如何使用这个端口
4、找到映射地址,让我们的CPU通过地址总线找到PCB版的引脚路径,然后向不同的引脚发送电流,驱动器件工作。
那么目前我们知道的是BEEP连接的是PB8,而PB8属于GPIO B端口组,而GPIO B端口组挂在APB2地址总线上,APB2地址总线挂在AHB2系统总线上。 有了RCC时钟,如果要驱动总线,需要打开RCC时钟。
我们开始练习吧~
1.首先定义基地址
#define PERIPH_BASE 0x40000000
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIO_Pin_5 ((uint16_t)0x0020)
#define RCC 0x40021000
#define RCC_KZ *(unsigned int*)(RCC+0x18)
#define GPIOB_RR *(unsigned int*)(GPIOB_BASE+0x00)
#define GPIOB_CC *(unsigned int*)(GPIOB_BASE+0x10)
2.仍然需要像以前一样定义SystemInit函数
void SystemInit()
{
}
3.在main函数中启用rcc并设置GPIOB端口
int main(){
RCC_KZ |= 1 << 3;
GPIOB_RR |= (2 << 4 * 0);
}
然后GPIOB就可以正常驱动了。 我们可以通过向CC发送电平来使蜂鸣器发声。
while(1){
GPIOB_CC = (1 << (16 + 0));
}
完整代码:
#define PERIPH_BASE 0x40000000
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIO_Pin_5 ((uint16_t)0x0020)
#define RCC 0x40021000
#define RCC_KZ *(unsigned int*)(RCC+0x18)
#define GPIOB_RR *(unsigned int*)(GPIOB_BASE+0x00)
#define GPIOB_CC *(unsigned int*)(GPIOB_BASE+0x10)
void SystemInit()
{
}
int main(){
RCC_KZ |= 1 << 3;
GPIOB_RR |= (2 << 4 * 0);
while(1){
GPIOB_CC = (1 << (16 + 0));
}
}