本篇文章依旧是按照之前的stm32f10x系列单片机进行开发,但博主会教大家如何去看电路原理图以及如何去看开发手册,并且本系列文章不使用stm32提供的库函数,完全从0开始编写,这样能带大家更好的认识底层知识。
其次本篇文章不在解释关于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千欧姆,这个代表电阻阻值,也就是说至少一千欧姆以上的电流才能流过电阻,符号为Ω。
这里的R38和10K相信就不用我多说了吧,就是第38个电阻,阻值为1万Ω(欧姆)
最后这里,就是通向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));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35509.html