首页 > 其他分享 >S5PV210 | 裸机蜂鸣器实验

S5PV210 | 裸机蜂鸣器实验

时间:2023-05-11 20:37:53浏览次数:50  
标签:Control r0 r1 S5PV210 Address 裸机 GPD0 2.2 蜂鸣器

S5PV210 | 裸机蜂鸣器实验


目录

  • 电路原理

HW-BEEP

电路中通过一个NPN的三级管控制蜂鸣器的停止与蜂鸣。

GPIOGPD0_2输出高电平,蜂鸣器鸣叫;反之,停止鸣叫。

  • DATASHEET(相关寄存器设置详解)

2.2.7 GPD0控制寄存器组

GPD0控制寄存器组包含六组控制寄存器,分别叫做:GPD0CON, GPD0DAT, GPD0PUD, GPD0DRV, GPD0CONPDN
GPD0PUDPDN

2.2.7.1 Port Group GPD0 Control Register (GPD0CON, R/W, Address = 0xE020_00A0)

GPD0CON

2.2.7.2 Port Group GPD0 Control Register (GPD0DAT, R/W, Address = 0xE020_00A4)

GPD0DAT

2.2.7.3 Port Group GPD0 Control Register (GPD0PUD, R/W, Address = 0xE020_00A8)

GPD0PUD

2.2.7.4 Port Group GPD0 Control Register (GPD0DRV, R/W, Address = 0xE020_00AC)

GPD0DRV

2.2.7.5 Port Group GPD0 Control Register (GPD0CONPDN, R/W, Address = 0xE020_00B0)

GPD0PUDPDN

2.2.7.6 Port Group GPD0 Control Register (GPD0PUDPDN, R/W, Address = 0xE020_00B4)

GPD0PUDPDN

  • 代码编写

  • 启动代码


/**********************************************************
 *   > File Name: start.S
 *   > Author: fly
 *   > Create Time: 2020年07月17日 星期五 07时56分19秒
 *********************************************************/
#define PS_HOLD_CONTORL 0xE010E81C
#define WTCON           0xE2700000
#define SVC_STACK       0xD0037D80

//#define CONFIG_SYS_ICACHE_OFF   1

.global _start
_start:
    // 给5v电源置锁
    // LDR指令:从内存中将1个32位的字读取到目标寄存器中
    // STR指令:将1个32位的字数据写入到指令中指定的内存单元中
    // ORR指令:逻辑或
	// BIC指令:位清零
    ldr r0,=PS_HOLD_CONTORL     // r0 = 0xE010E81C
    ldr r1,[r0]                 // 将r0地址处的数据读出,保存到r1中(零偏移)
    orr r1,r1,#0x300            // 设置r1的第8、9位,其他位保持不变
    orr r1,r1,#0x1              // 设置r1的第1位,其他位保持不变
    str r1,[r0]                 // 将r1中的内容传输到r0中数指定的地址内存中去

    // 关看门狗
    ldr r0, =WTCON			// r0 = 0xE2700000
    mov r1, #0				// r1 = 0
    str r1, [r0]			// 将r1中的内容传输到r0中数指定的地址内存中去

    // 开/关iCache
    // MRC指令:从协处理器寄存器传数据到ARM寄存器
    // MCR指令:从ARM寄存器传数据到协处理器寄存器
    mrc p15, 0, r0, c1, c0, 0
    #ifdef CONFIG_SYS_ICACHE_OFF
    bic r0, r0, #0x00001000     @ clear bit 12 (I) I-Cache
    #else
    orr r0, r0, #0x00001000     @ set bit 12 (I) I-Cache
    #endif
    mcr p15, 0, r0, c1, c0, 0

    //设置栈,以便调用c函数
    ldr sp, =SVC_STACK

    bl main /* 跳转到main函数 */

    b . /* 死循环 */

  • BEEP控制代码

/******************************************************
 *   > File Name: beep.c
 *   > Author: fly
 *   > Create Time: 2021-07-01  4/26  14:52:31 +0800
 *==================================================*/

typedef struct{
    unsigned int GPD0CON;
    unsigned int GPD0DAT;
    unsigned int GPD0PUD;
    unsigned int GPD0DRV;
    unsigned int GPD0CONPDN;
    unsigned int GPD0PUDPDN;
}gpd0;
#define GPD0 (*(volatile gpd0*)0xE02000A0) 

void delay(volatile unsigned int i)
{
    while(i--);
}

void beep_init(void)
{
    GPD0.GPD0CON = (GPD0.GPD0CON & ~(0xf<<8)) | (0x1<<8);
    GPD0.GPD0DAT = (GPD0.GPD0DAT & ~(0x1<<2)) | (0x0<<2);
}

void beep_set(unsigned int value)
{
    if (value){  
        GPD0.GPD0DAT = (GPD0.GPD0DAT & ~(0x1<<2)) | (0x1<<2);//ON
    }else{
        GPD0.GPD0DAT = (GPD0.GPD0DAT & ~(0x1<<2)) | (0x0<<2);//OFF  
    }
}

void tester_beep(void)
{
    beep_init();

    for(;;){
        beep_set(1);
        delay(900000);
        beep_set(0);
        delay(900000);   
    }
}

int main(int argc, char* argv[])
{
    tester_beep();
    return 0;
}

  • Makefile文件

# 将所有的.o文件链接成.elf文件,“-Ttext 0x0”
# 表示程序的运行地址是0x0,由于目前编写的是位置
# 无关码,可以在任一地址运行
# 将elf文件抽取为可在开发板上运行的bin文件
# 将elf文件反汇编保存在dis文件中,调试程序会用
# 添加文件头
.PHONY: all clean tools

CROSS	?= arm-linux-
NAME	:= BEEP
LD		:= $(CROSS)ld
OC		:= $(CROSS)objcopy
OD		:= $(CROSS)objdump
CC		:= $(CROSS)gcc
MK		:= ../../tools/mk_image/mkv210_image
CFLAGS	:= -nostdlib -Wall

all:$(NAME).bin

$(NAME).bin : start.o beep.o
	$(LD) -Ttext 0x0 -o $(NAME).elf $^
	$(OC) -O binary $(NAME).elf $(NAME).bin
	$(OD) -D $(NAME).elf > $(NAME)_elf.dis
	$(MK) $(NAME).bin

# 将当前目录下存在的汇编文件及C文件编译成.o文件
%.o : %.S
	$(CC) -o $@ $< -c $(CFLAGS)
%.o : %.c
	$(CC) -o $@ $< -c $(CFLAGS)

clean:
	$(RM) *.o *.elf *.bin *.dis *.sd

tools:
	make -C ../../tools/mk_image/

标签:Control,r0,r1,S5PV210,Address,裸机,GPD0,2.2,蜂鸣器
From: https://www.cnblogs.com/feige1314/p/17392146.html

相关文章

  • S5PV210 | 裸机汇编LED闪烁实验
    S5PV210|裸机汇编LED闪烁实验目录S5PV210|裸机汇编LED闪烁实验原理图DATASHEET2.2.7PORTGROUPGPD0CONTROLREGISTER2.2.7.1PortGroupGPD0ControlRegister(GPD0CON,R/W,Address=0xE020_00A0)2.2.7.2PortGroupGPD0ControlRegister(GPD0DAT,R/W,Address......
  • S5PV210 | 裸机汇编LED流水灯实验
    S5PV210|裸机汇编LED流水灯实验目录S5PV210|裸机汇编LED流水灯实验开发板:1.原理图2.Datasheet相关3.代码3-1.代码实现(流水灯,仅作演示)3-2.工具mkv210_image代码4.运行SD卡启动5.参考开发板:1.原理图上图中,当按下POWER键后,VDD_5V和VDD_IO会产生5V和3.3V的电压,其中D26无......
  • S5PV210 | S5PV210 概述
    目录1.S5PV210概述1.1架构概述1.2S5PV210框图1.3S5PV210的主要特性1.3.1微处理器1.3.2内存子系统1.3.3多媒体1.3.4音频子系统1.3.5安全子系统1.3.6连通性1.3.7系统外设1.4惯例1.4.1寄存器R/W约定1.4.2寄存器值约定2.内存映射2.1内存地址映射2.1.1设备特定地址......
  • S5PV210 | 微处理器启动流程
    S5PV210|微处理器启动流程目录S5PV210|微处理器启动流程S5PV210启动概述S5PV210的启动顺序iROM(BL0)的启动顺序V210启动流程图第一次启动失败时的iROM第二次启动顺序用于引导代码描述的标题信息数据编写校验和示例代码S5PV210启动概述S5PV210支持从多种设备启动,如OneNAN......
  • STM32裸机移植RT-Thread(标准版)
    前言,因为我嫌正点原子stm32l475vet6(潘多拉)给的rt-thread太过臃肿,决定自己移植一遍(RT-Thread包来自正点原子中潘多拉例程)参考了野火rt-thread的手册1、建立工程文件夹,如下      CoreCore/IncCore/src用于存放用户自己的.c和.h文件 Dri......
  • 51单片机(普中板)蜂鸣器控制
    蜂鸣器通过震荡脉冲控制1,尝试发声#include<REGX52.H>#include"Delay.h"sbitbuzzer=P2^5;//蜂鸣器端口unsignedinti;//演奏时长voidmain(){while(1){for(i=0;i<500;i++){buzzer=!buzzer;Delay......
  • 51单片机学习笔记 STC89CRC (03)蜂鸣器和三级管
    蜂鸣器根据工作原理的不同可分为"电磁式蜂鸣器"和"压电式蜂鸣器"蜂鸣器根据驱动方式可分为"有源蜂鸣器"和"无源蜂鸣器"有源蜂鸣器:一通电就会叫无源蜂鸣器:必须用2k~5k的方波去驱动它 三极管直插式封装TO-92:面向三极管平的一面,从左往右数1.发射极2.基极3.集电极......
  • 按键控制蜂鸣器实验
    sourcecodemodulekey_beep(inputsys_clk,inputsys_rst_n,inputkey,outputregbeep);reg[19:0]cnt;regkey_delay_20ms;regkey_delay_20ms_last;regkey_last;always@(posedgesys_clkornegedgesys_rst_n)beginif(!sys_rst_n)......
  • 光敏传感器控制蜂鸣器
    【原理图】  光敏二极管LS1:一端接地,一端由电阻接高电平。周围环境越亮,自身阻值越小,通过电流越大。 ......
  • S5PV210开发 -- 串口驱动开发
    上篇文章讲的UART,更多的是硬件相关的知识。接下来进入正题了,串口驱动开发。一、阅读原理图我们用的是UART2串口,则接收管脚XuRXD2复用GPA1_0,发送管脚XuTXD2复用GPA1_1二、S5PV210UART (1)通用异步接收器和发送器的概述 (p-853)S5PV210中的通用异步接收器和发送器(UART)提供四......