延续上一篇 ”STM32F103RB 实作笔记(一)- 跑马灯(正点原子 STM32F103 nano开发板)程式解析“,我们今天进行第二个程式解析。
和上一篇一样,进入找到 USER 的档案夹,直接点开 BEEP 项目档,并且进行编译和执行。
硬件配置
先看一下 线路图,可以知道
- 选择 PB8 来控制这个蜂鸣器。
- BEEP 要用低电平 来驱动。
- 从原厂附上的资源配置图片,表明左下角的 BEEP 是”有源“型式的。
有源型式的 BEEP 在百度查得的说明如下图,就是”给他电力就会直接叫“。
主程式 Main.c
主程式 Main.c 的内容如下:
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
/************************************************
************************************************/
int main(void)
{
Stm32_Clock_Init(9); //
delay_init(72); //
LED_Init(); //
BEEP_Init(); //
while(1)
{
LED0=0;
BEEP=0;
delay_ms(300);//
LED0=1;
BEEP=1;
delay_ms(300);//
}
}
程式很单纯,就是 LED0、BEEP 开 300ms, 然后 关 300ms。比较需要的是了解 LED_Init()、BEEP_Init() 这两个副程式;
先看看 LED_Init(),是在 LED.c 里面
#include "led.h"
//
//
void LED_Init(void)
{
RCC->APB2ENR|=1<<4; //
GPIOC->CRL&=0X00000000; //清除PC0~7设定
GPIOC->CRL|=0X33333333;//设定 PC0~7 的 CNFy=00,MODEy=11·
GPIOC->ODR|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7);//PC.0~7
}
上一篇文章没有对 LED_Init() 做解析,这一次就追以下是怎么写的。 第一个是 APB2ENR,把第四 bit 设成 ”1“,就是把 GPIOC 打开。 再过来是把GPIO 的 CRL/CHL 做个设定。 GPIO是用 16 bits脚位 做资料的输出入,CRL/CHL 是控制这些脚位的设定,每个脚位用 4 个 bit 就要 16 * 2 * 2个 bit 来控制,CRL 是低 8 个脚位的控制, CRH 是高 8 个脚位的控制。 CRL/CHL 的设定又分 两种 CNFy[1:0] 和MODEy[1:0] 从程式里面可以看到 GPIOC的输出被设定为:
MODE=11:输出模式,最大速度50MHz
CNF=00:通用推挽输出模式-- ”在输出模式(MODE[1:0]>00)“
然后输出在高电平’1‘。
再看看 BEEP_Init(),是在 BEEP.c 里面
#include "beep.h"
//
//
void BEEP_Init(void)
{
RCC->APB2ENR|=1<<3; // 选择 GPIOB
GPIOB->CRH&=0XFFFFFFF0; //清除 bit 0~3.其他 bit 不变
GPIOB->CRH|=0X00000003;//PB8 设定成 ’0011‘
GPIOB->ODR|=1<<8;//PB8 再设定在高电平输出
}
前面解释完 LED.c 后 再看 BEEP.c 就简单多了。 OK ! 这个程式说明完了!
|