嵌入式-STM32f103r8t6-day01学习

寄存器级别的编程方式之蜂鸣器

因为多次用到,所以设置为头文件

// 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值