ARM-LED灯--蜂鸣器

本文详细介绍了如何通过CPU控制硬件,特别是以点亮LED灯为例,讲解了SOC(S5P6818)的内存映射、GPIO控制寄存器的使用,包括设置GPIO为输出模式、功能选择以及高低电平控制。同时,阐述了本地开发与交叉开发的区别,并提供了使用汇编和C语言编写程序的示例,最后还涉及了蜂鸣器的控制方法。
摘要由CSDN通过智能技术生成

点亮LED灯

1.开发板介绍

2.cpu控制硬件原理

六大指令里边,只有内存访问指令能访问cpu之外的内容。那cpu如何控制硬件?

*load/store指令-->操作4G内存

任何一个芯片都有一个地址映射表。告诉地址空间是如何映射的,便于我们找到对应的硬件地址。

我们的SOC(片上系统、系统芯片)型号是S5P6818(三星),对应的芯片用户手册为:S5P6818X 用户手册V0.00,其中一章是:Memory map或Memory Controller 中的一张表中可以看地址隐射关系。

硬件控制原理:

 CPU不能直接控制硬件,硬件是由其对应的控制器(寄存器)来控制的,

 每个控制器(寄存器)都会映射到CPU寻址范围内的一段空间,

CPU通过对控制器(寄存器)的读和写实现对硬件间接的控制, CPU间接控制硬件。

3.本地开发和交叉开发

本地开发:本地编写代码,本地编译代码,本地运行代码

交叉开发:本地编写代码,本地编译代码,开发板运行代码

PC中Linux下,程序也能执行,但不是仿真。他是真正的运行。但移植到ARM平台就不一定能执行,需要转化代码的指令。这个转换过程可以当成是交叉编译。

4.点灯实验

分析电路图

  1、分析电路图的思路:从外设(地板)---》SOC(核心板)分析 

  2、 分析LED

  3、 在电路板上找到led灯的位置

     LED灯旁边会有白色的字,此白字为丝印,LED灯旁边的字,是led灯的编号

    打开底板的原理图,在原理图上搜索led灯编号(RGB)

  4、分析led的电路图

   共阳三色二极管:三个二极管的,正极接到一起

   RGB_R/RGB_G/RGB_B 表示网络标号 5、网络标号名字相同表示具有相同的,电气连接属性,反应到电路板上,他们通过导线连接到一起 

  6、根据网络标号到核心板原理图,找到soc哪个引脚驱动着LED灯

 底板原理图:

1)电路原理图,LED的控制方式->高电平亮,低电平灭

核心板原理图:

2)LED与SOC的连接关系->GPIOA28

控制思想

 工作寄存器:R0-R15,CSPR,SPSR,由ARM公司提供,没有地址

 控制寄存器:就是内存的一块空间,具有地址,由芯片厂家提供。寄存器是在GPIO章节被使用,所以看芯片手册的时候看GPIO章节,里面一定有相关寄存器的使用和功能实现。

我们只需要向控制寄存器中写值或者读值,就可以让我们处理器完成一定的功能。这也就是我们软件编程控制硬件的思想。

读懂芯片手册

概述:简介->特点->框图

机械尺寸->IO功能描述表

系统引导:概述->功能描述->内部引导->外部引导

 1、GPIOxOUT:控制引脚输出高低电平

 2、RED_LED--->GPIOA28

 3、GPIOAOUT ---> 0xC001A000

 4、GPIOA28输出高电平:GPIOAOUT[28] <--写-- 1

 5、GPIOA28输出低电平: GPIOAOUT[28] <--写-- 0

 6、GPIOxOUTENB:控制引脚的输入输出模式  GPIOAOUTENB ---> 0xC001A004

7、 设置GPIOA28引脚为输出模式: GPIOAOUTENB[28] <--写-- 1

8、GPIOxALTFN:控制引脚功能的选择  GPIOAALTFN1 ---> 0xC001A024

 9、设置GPIOA28引脚为GPIO功能: GPIOAALTFN1[25:24] <--写-- 0b00

 00 = ALT Function0 

 01 = ALT Function1 

 10 = ALT Function2 

 11 = ALT Function3 

  GPIO引脚功能的选择:每两位控制一个GPIO引脚,

 S5P6818X用户芯片手册:   

 

    

 3)分析芯片手册,找到对应的寄存器将GPIOA28设置输出高低电平->GPIOAOUT(0XC001A000)

 4)分析芯片手册,找到对应的寄存器将GPIOA28设置成OUTPUT功能->GPIOAOUTEN(0XC001A004)  

5)找到对应的寄存器将GPIOA28设置成GPIO功能->GPIOAALTFN1(0XC001A024)   

编写程序

汇编

.text  @代码段
.global _start @将_start声明成一个全局的符号,其他.s文件也可以引用
_start: @汇编的入口   
 /*
	实验步骤:
	  1)分析电路原理图,得出LED的控制方式->高电平亮,低电平灭
	  2)分析电路原理图,得出LED与SOC的连接关系->GPIOA28
	  3)分析芯片手册,找到对应的寄存器将GPIOA28设置成GPIO功能->GPIOAALTFN1(0XC001A024)
	  4)分析芯片手册,找到对应的寄存器将GPIOA28设置成OUTPUT功能->GPIOAOUTENB(0XC001A004)
	  5)分析芯片手册,找到对应的寄存器将GPIOA28设置输出高低电平->GPIOAOUT(0XC001A000)
 */
/*
   地址:0xc001A024 数据:0x00000000  
   地址:0xc001A004 数据:0x10000000  输入输出
   地址:0xc001a000 数据:0x10000000/0x00000000    高低电平
*/
@设置GPIOA28为GPIO功能
 LDR R1,=0x00000000
 lDR R2,=0XC001A024
 STR R1,[R2]

@设置GPIOA28为OUTPUT功能
 LDR R1,=0x10000000
 lDR R2,=0XC001A004
 STR R1,[R2]
@设置GPIOA28为高电平
 LDR R1,=0x00000000
 lDR R2,=0XC001A000
 STR R1,[R2]
stop:
    B stop
.end @汇编的结束

下载调试程序

 1、拷贝.bin文件到windows中

 2、开发板和电脑进行硬件连接

    串口线的USB端插到电脑的USB口,串口线的串口端插到开发板的UART0端口上

     开发板插上电源

 3、配置windows超级终端

    可以查看配置超级终端的使用说明文档资料中有, 如果串口线第一次使用需要安装串口驱动,串口驱动文件在资料中

4、配置超级终端:

    在设备管理器中,查看串口线使用的那个端口号

    配置端口属性:波特率:115200、 数据位:8、 停止位:1

5、开发板上电,超级终端会有打印信息

 在倒计时减到0之前按任意键,进入到FS6818#界面----交互模式

 执行命令 loadb 0x43c00000 -->下载二进制文件到内存的0x43c00000

 传送-->发送文件-->选择要下载.bin文件,选择Kermit协议 --> 确定下载

 执行命令:go 0x43c00000 -->到0x43c00000位置运行代码

 如果需要重新下载代码,重复步骤4

闪灯

用汇编写C逻辑

.text
.global _start
_start:
MAIN:
 BL LED_CONFIG
LOOP:
 BL LED_ON
 BL DELAY   
 BL LED_OFF
 BL DELAY
 BL LOOP
LED_CONFIG:
 LDR R1,=0X00000000
 LDR R2,=0XC001A024
 STR R1,[R2]
 LDR R1,=0X10000000
 LDR R2,=0XC001A004
 STR R1,[R2]
 MOV PC,LR
LED_OFF:
 LDR R1,=0X00000000
 LDR R2,=0XC001A000
 STR R1,[R2]
 MOV PC,LR
LED_ON:
 LDR R1,=0X10000000
 LDR R2,=0XC001A000
 STR R1,[R2]
 MOV PC,LR
DELAY:
 LDR R1,=100000000
T: 
 SUB R1,R1,#1
 CMP R1,#0
 BNE T
 MOV PC,LR
.end
  1. C语言

纯地址方式

/*
 *    地址:0xc001A024 数据:0x00000000
 *    地址:0xc001A004 数据:0x10000000
 *    地址:0xc001a000 数据:0x10000000/0x00000000
 *    地址:0xc001a000 数据:0x10000000/0x00000000
 *                */
int main()
{   
  *(unsigned int *)0xc001A024=0x00000000;
  *(unsigned int *)0xc001A004=0x10000000;
 while(1)
 {
  *(unsigned int *)0xc001A000=0x00000000;
  delay_ms(1000);
  *(unsigned int *)0xc001A000=0x10000000;
  delay_ms(1000);
 }
}                                                       

宏定义

#define GPIOAALTFN1 (*(unsigned int *)0xc001A024)
#define GPIOAOUTENB (*(unsigned int *)0xc001A004)
#define GPIOAOUT    (*(unsigned int *)0xc001A000)
int main()
{
  GPIOAALTFN1=0x00000000;
  GPIOAOUTENB=0x10000000;
 while(1)
 { 
  GPIOAOUT=0x00000000;
  delay_ms(1000);
  GPIOAOUT=0x10000000;
  delay_ms(1000);
 }
}                                                      


结构体

这时候去数据手册看地址规律,发现每一类比如A的地址是连续的

问C语言里什么的地址是联续的? 结构体

这里GPIOAPAD之后有一个没有连续 18 之后1C

typedef struct
{
 unsigned int OUT;
 unsigned int OUTENB;
 unsigned int DETMODE0;
 unsigned int DETMODE1;
 unsigned int INTENB;
 unsigned int DET;
 unsigned int PAD;
 unsigned int Gsssss;
 unsigned int ALTFN0;
 unsigned int ALTFN1;
}gpio;
#define GPIOA (*(gpio *)0xc001A000)
int main()                         
{
  GPIOA.ALTFN1=0x00000000;
  GPIOA.OUTENB=0x10000000;
 while(1)
 {
  GPIOA.OUT=0x00000000;
  delay_ms(1000);
  GPIOA.OUT=0x10000000;
  delay_ms(1000);
 }
}

蜂鸣器

实验步骤:

1)分析电路原理图,得出蜂鸣器的控制方式->高电平响

2)分析电路原理图,得出蜂鸣器与SOC的连接方式->GPIOC14

3)分析芯片手册,找到对应的寄存器将GPIO14设置成GPIO功能->GPIOCALTFN0

      (0X01C001C020)

 

4)分析芯片手册,找到对应的寄存器将GPIOC14设置成OUTPUT功能->GPIOCOUTENB

     (0XC001C004)

5)分析芯片手册,找到对应的寄存器将GPIOC14设置输出高低电平->GPIOCOUT(0XC001C000)

 编写程序

.text   @ 代码段

.global _start @将_start声明成一个全局的符号,其他.s文件也可以引用

_start: @汇编的入口   

/*

   地址:0xC001C024   数据:0x10000000

   地址:0xC001C004   数据:0x10000000

   地址:0xC001C000   数据:0x10000000/0x00000000

*/

@设置GPIOC14为GPIO功能

 LDR R1,=0x10000000

 lDR R2,=0XC001C024

 STR R1,[R2]

@设置GPIOC14为OUTPUT功能

 LDR R1,=0x10000000

 lDR R2=0XC001C004

 STR R1,[R2]

@设置GPIOC14为高电平

 LDR R1,=0x00000000

 lDR R=0XC001C000

 STR R1,[R2]

stop:

    B stop

.end @汇编的结束

上电测试

1.从"设备管理器"中查看自己的端口号,打开SecureCRT,配置对应的端口号,进行上电连接。

 2.在倒计时结束之前按回车键,进入交互模式,执行loadb 地址(例如:loadb 0x43c00000)命令烧录程序。

3.下载成功后,执行go 地址(例如:go 0x43c00000)命令。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值