寄存器级别的编程方式之蜂鸣器
因为多次用到,所以设置为头文件
// APB2的寄存器
#define MY_APB2_REGISTER (*(volatile int *)(0x40021000 + Ox18))
// 端口GPIOC配置寄存器
#define MY_CRL (*(volatile int *)(0x40011000 + 0x00))
// 端口数据寄存器
#define MY_ORD (*(volatile int *) (0x40011000 + Ox0c))
APB2寄存器地址
需要使能总线APB2,因此,定义APB2的宏,并且给APB2寄存器地址赋值。
需要找到APB2的基址和偏移地址。
APB2基址: 0x40021000
偏移地址: 0x18
//使能APB2将GPIOC赋值为1,表示开启,因此要左移4位
MY_APB2_REGISTER |= 1 << 4;
GPIOC端口寄存器地址
蜂鸣器BEEP 位于PC7,所在端口是GPIOC,查找对应端口的基址 0x40011000
查找偏移地址为0x00
//将pc7位置都置为0,其他位置不变
MY_CRL &= ~((uint32 t)0xf << (4 * 7));
//0011,将PC7设置为推挽输出模式,最大速度50MHz
MY_CRL |=0x3 << (4 * 7);
端口数据寄存器地址
端口数据寄存器基址 0x40011000 偏移地址 0x0c
void beepl_ on (void)
{
//将ODR7位置置为1,表示开启
MY ODR |= 0x1 << 7;
}
void beepl_off(void)
{
//将ODR7位置置为0,表示开关闭
MY ODR &= ~(0x1 << 7);
}
完整代码:
//beep1.h
#ifndef __BEEP1_H__
#define __BEEPl_H__
// APB2的寄存器
#define MY_APB2_REGISTER (*(volatlile int *) (0x40021000 + 0x18))
// 端口GPIOC配置寄存器
#define MY_CRL (*(volatile int *)(0x40011000 + 0x00))
// 端口数据寄存器
#define MY_ODR (*(volatile int *)(0x40011000 + 0x0c))
void beepl_init (void);
void beepl_on(void);
void beepl_off(void);
#endif
//beep1.c
#include "beep1.h"
#include "stdint.h"
void beep1_init(void)
{
//使能APB2将gpioc赋值为1,表示开启,因此要左移4位
MY_APB2_REGISTER |= 1 << 4;
//将pc7位置都置为0,其他位置不变
MY_CRL &= ~((uint32_t)0xf << (4 * 7));
//0011,将PC7设置为推挽输出模式,最大速度50MHz
MY_CRL |= 0x3 << (4 * 7);
//数据寄存器全部写成0
//默认蜂鸣器不响
MY_ODR &= ~(0x1 << 7);
}
void beep1_on(void)
{
//将ODR7位置置为1,表示开启
MY_ODR |= 0x1 << 7;
}
void beep1_off(void)
{
//将ODR7位置置为0,表示开关闭
MY_ODR &= ~(0x1 << 7);
}
//main.c
#include "beep1.h"
int main(void)
{
beep1_init();
beep1_on();
//等待一段时间,约1s
for(i = 0; i < 10000000; i ++)
;
beep1_off();
return 0;
}