基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)

Exynos 4412简介:

Exynos 4412又称为Exynos 4 Quad,Exynos 4412采用了三星32nm HKMG工艺,是三星的第一款四核处理器。

【1】led灯试验

1.查看原理图,分析LED灯的工作条件(亮/灭),以LED2为例:
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第1张图片
由原理图可知:GPX2_7输出高电平时LED亮;GPX2_7输出低电平时LED灭。

2根据底板PDF原理图找到外设和SOC之间的物理连接引脚:GPX2_7
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第2张图片
在这里插入图片描述
3.打开芯片用户手册,找到对应的章节(GPIO章节),先看下概述了解硬件引脚情况,根据需要(控制LED灯)选择引脚的功能为I/O功能,设置相应寄存器(CON控制,DAT输入/输出数值。)
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第3张图片
找到GPX2相关内容:
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第4张图片

//设置引脚功能为output
	GPX2.CON &= ~(0xf<<28);//将CON寄存器高四位清零
	GPX2.CON |= (1<<28);//将CON寄存器设置为output功能

基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第5张图片
当您将端口配置为输入端口时相应的位是引脚状态。 配置为时输出端口然后引脚状态应该相同相应的位。 端口配置为功能引脚时,将读取未定义的值。
配置寄存器DAT,来封装LED开关函数:

void led_on(void)
{
//	IO_DAT |= (1<<7);
	GPX2.DAT |= (1<<7);
}

void led_off(void)
{
//	IO_DAT &= ~(1<<7);
	GPX2.DAT &= ~(1<<7);
}

4.写代码
具体寄存器从exynos_4412.h头文件中查找,查找方法是根据寄存器名在文件中检索.。

#include "exynos_4412.h"

//#define IO_CON	(*((unsigned int *)0x11000c40))
//#define IO_DAT	(*((unsigned int *)0x11000c44))

//封装延时函数
void delay(unsigned int time)
{
	int i;
	for(; time>0; time--)
	{
		for(i=2000; i>0; i--)
		{
			;
		}
	}
}

void led_init(void)
{
	//1、设置引脚功能为output
//	IO_CON &= ~(0xf<<28);
//	IO_CON |= (1<<28);
	GPX2.CON &= ~(0xf<<28);
	GPX2.CON |= (1<<28);

	//2、默认关闭led
//	IO_DAT &= ~(1<<7);
	GPX2.DAT &= ~(1<<7);
}

void led_on(void)
{
//	IO_DAT |= (1<<7);
	GPX2.DAT |= (1<<7);
}

void led_off(void)
{
//	IO_DAT &= ~(1<<7);
	GPX2.DAT &= ~(1<<7);
}

int main(void)
{
	led_init();

	while(1)
	{
		led_on();
		delay(500);

		led_off();
		delay(500);

	}


	return 0;
}

实验现象:led闪烁。

【2】pwm控制蜂鸣器实验

PWM是Pulse Width Modulation脉冲宽度调制的缩写,简称脉宽调制。他是利用微控制器的数字输出来对模拟电路进行控制的一种非常有效的技术。

1.PWM实质就是按我们的需求输出的一定规则波形的信号,PWM实验的实质就是控制定时器输出PWM

2.查找原理图找到buzzer和SOC之间连接的物理引脚是GPD0_0
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第6张图片
3.打开用户手册,找到第6章GPIO,设置对应的CON寄存器选择TOUT功能
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第7张图片

//CON寄存器选择TOUT功能
	GPD0.CON &= ~(0xf<<0);
	GPD0.CON |= (2<<0);

4.找到第24章PWM章节,先看下章节概述,了解下本章节基本信息
5.在24.1概述章节中,从概述描述结合Figure 24-2图,可以知道定时器需要有个时钟信号输入, 并经过2次分频后才到达定时器。
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第8张图片
6.从Figure 24-1图和步骤描述,可以知道产生PWM的具体操作步骤
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第9张图片

7.从24.3.5章节中了解到如何初始化寄存器的步骤
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第10张图片
8.阅读24.5.1章节,了解相关寄存器功能
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第11张图片
9.根据上述过程获取的信息写代码控制相关寄存器
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第12张图片

// 一级分频:249
	PWM.TCFG0 &= ~(0xff<<0);
	PWM.TCFG0 |= (249<<0);

基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第13张图片

	二级分频:4
	PWM.TCFG1 &= ~(0xf<<0);
	PWM.TCFG1 |= (2<<0);

基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第14张图片
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第15张图片

	//设置周期:1000Hz,占空比50%
	PWM.TCNTB0 = 100;
	PWM.TCMPB0 = PWM.TCNTB0 / 2

基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第16张图片
基于三星 ARM Cortex-A9 Exynos4412处理器的底层实验(led跑马灯、pwm蜂鸣器)_第17张图片

	//手动更新TCNT和TCMP
	PWM.TCON |= (1<<1);
	PWM.TCON &= ~(1<<1);
	//开启自动重装载
	PWM.TCON |= (1<<3);
	//启动定时器
	PWM.TCON |= (1<<0);

10、代码
寄存器从exynos_4412.h头文件中查找,查找方法是根据寄存器名在文件中检索.。

#include "exynos_4412.h"

void pwm_init(void)
{
	//1、选择引脚功能pwmTOU0输出功能
	GPD0.CON &= ~(0xf<<0);
	GPD0.CON |= (2<<0);

	//2、一级分频:249
	PWM.TCFG0 &= ~(0xff<<0);
	PWM.TCFG0 |= (249<<0);

	//3、二级分频:4
	PWM.TCFG1 &= ~(0xf<<0);
	PWM.TCFG1 |= (2<<0);

	//4、设置周期:1000Hz,占空比50%
	PWM.TCNTB0 = 100;
	PWM.TCMPB0 = PWM.TCNTB0 / 2;

	//5、手动更新TCNT和TCMP
	PWM.TCON |= (1<<1);
	PWM.TCON &= ~(1<<1);

	//6、开启自动重装载
	PWM.TCON |= (1<<3);

	//7、启动定时器
	PWM.TCON |= (1<<0);

}


int main(void)
{
	pwm_init();

	while(1)
	{
		;
	}


	return 0;
}


实验现象:蜂鸣器响。

你可能感兴趣的:(ARM)