JZ2440 голые доски развития Упражнение № 3 - LED улучшение программы (сторожевой таймер, кнопки, часы)

Это упражнение улучшит программу LED

1. Модульный

Во- первых, программа будет модульное разделение, регистрирует соответствующую информацию в s3c2440.h  , последующее использование в реестр будет продолжать добавлять другие функции, и , таким образом , постепенно улучшать файл заголовка. Существующая светодиодный модуль то время как модуль, который предоставляется независимо от документа, и основной файл , чтобы назвать эти модули обеспечивают механизм для достижения желаемого функциональных возможностей . (Запуск файла нет никакой разницы, его нет в списке.)

s3c2440.h
---------------------------------------
#ifndef __S3C2440_H
#define __S3C2440_H

#include <stdint.h>

/* GPIO */
#define GPFCON	(*((volatile uint32_t*)0x56000050))
#define GPFDAT	(*((volatile uint32_t*)0x56000054))

#endif

 

led.h
----------------------------------
#ifndef __LED_H
#define __LED_H

#include <stdint.h>

#define kLed1  4
#define kLed2  5
#define kLed3  6


void LedInitAll(void);
void SingleLedInit(const uint8_t ledn);
void SingleLedON(const uint8_t ledn);
void SingleLedOFF(const uint8_t ledn);

#endif
led.c
--------------------------------------
#include "led.h"

#include "s3c2440.h"

void LedInitAll(void)
{
	SingleLedInit(kLed1);
	SingleLedInit(kLed2);
	SingleLedInit(kLed3);
	SingleLedOFF(kLed1);
	SingleLedOFF(kLed2);
	SingleLedOFF(kLed3);
}


/* init the led gpio as a output pin */
void SingleLedInit(const uint8_t ledn)
{
	GPFCON &= ~(3 << ledn * 2);
	GPFCON |= (1 << ledn * 2);
}

void SingleLedON(const uint8_t ledn)
{
	GPFDAT &=~(1 << ledn);
}

void SingleLedOFF(const uint8_t ledn)
{
	GPFDAT |= 1 << ledn;
}


main.c
------------------------------------
#include <stdint.h>

#include "s3c2440.h"
#include "led.h"


void Delay(uint32_t time)
{
	while(time--);
}

int main()
{
	uint8_t led_now=kLed1;
	LedInitAll();
	while(1)
	{
		SingleLedOFF(led_now++);
		if(led_now > kLed3) { led_now =kLed1; }
		SingleLedON(led_now);
		Delay(100000);
	}

	
	
	return 0;
}

Эта функция легкой воды завершается, эффект трех светодиодных ламп выключить. Когда (проблема встречается здесь не определены глобальные переменные или статические переменные, разбирайте файлы появляются ДСС сегментов и сегментов данных за пределы или rodata ошибок, потому что нет никакой связи или скрипт для компиляции соответствующих руководящих принципов, будет проблема, поэтому здесь первым, вместо того, чтобы использовать макрос определения глобальных переменных завершения).

 

2. Watchdog

При запуске программы с использованием вышеуказанных воды огни обнаружили, что в течение долгого времени, программа будет автоматически рестарт запуска, это происходит потому, что сторожевой механизм S3C2440, и включен по умолчанию, нужно время «кормить собаку» для того, чтобы избежать повторного запуска программы, эта программа является способом предотвращения оборудования тупик, где мы можем превратить его прочь.

Она может быть получена с помощью руководств чипа для настройки регистра сторожевого 0, чтобы достичь цели, сторожевого таймера. Язык С, который заключен в основном вызове функции, чтобы облегчить последующее расширение и использование.

s3c2440.h
------------------------------
#ifndef __S3C2440_H
#define __S3C2440_H

#include <stdint.h>


/* WATCH DOG */
#define WTCON	(*((volatile uint32_t*)0x53000000))

/* GPIO */
#define GPFCON	(*((volatile uint32_t*)0x56000050))
#define GPFDAT	(*((volatile uint32_t*)0x56000054))




void WatchDogDisable(void);

#endif

s3c2440.c
-------------------------
#include "s3c2440.h"

void WatchDogDisable(void)
{
	WTCON = 0x0;
}

3. Ключ

Анализ же LED, сначала найти ключевые контакты на принципиальную схему, а затем найти соответствующие регистры GPIO, предусмотренные на руководстве чипа, разность должны быть ключевым моментом GPIO штифта сконфигурирован как вход.

Фигуры можно видеть, что контактный нагрузочный резистор, то есть, когда кнопка не нажата, штифт проходит высокий, низкий пресса.

И соответствующие штифты

EINT0 EINT2 EINT11 EINT19
GPF0 GPF2 GPG3 GPG11

Направьте модульные ключи пакета, как требуется, следующим образом:

key.h
--------------------------------
#ifndef __KEY_H
#define __KEY_H

#include <stdint.h>

#define KEY_1 0
#define KEY_2 2
#define KEY_3 3
#define KEY_4 11


void AllKeyInit(void);
void SingleKeyInit(uint8_t keyn);
uint8_t Key1CheckDown(void);
uint8_t Key2CheckDown(void);
uint8_t Key3CheckDown(void);
uint8_t Key4CheckDown(void);

#endif
key.c
----------------------------------------

#include "key.h"

#include "s3c2440.h"

void AllKeyInit(void)
{
	SingleKeyInit(KEY_1);
	SingleKeyInit(KEY_2);
	SingleKeyInit(KEY_3);
	SingleKeyInit(KEY_4);
}

//config key as a input io
void SingleKeyInit(uint8_t keyn)
{
	switch(keyn)
	{
		case KEY_1:
		case KEY_2:
			GPFCON &= ~(3 << keyn*2);
			break;
		case KEY_3:
		case KEY_4:
			GPGCON &= ~(3 << keyn*2);
			break;
		default:
			break;
	}
}

uint8_t Key1CheckDown(void)
{
	return !(GPFDAT & (1 << KEY_1)); 
}

uint8_t Key2CheckDown(void)
{
	return !(GPFDAT & (1 << KEY_2));
}

uint8_t Key3CheckDown(void)
{
	return !(GPGDAT & (1 << KEY_3));
}

uint8_t Key4CheckDown(void)
{
	return !(GPGDAT & (1 << KEY_4));
}

Соответственно, обновленное содержимое регистра s3c2440.h

#ifndef __S3C2440_H
#define __S3C2440_H

#include <stdint.h>


/* WATCH DOG */
#define WTCON	(*((volatile uint32_t*)0x53000000))

/* GPIO */
#define GPGCON	(*((volatile uint32_t*)0x56000060))
#define GPGDAT	(*((volatile uint32_t*)0x56000064))
#define GPGUP	(*((volatile uint32_t*)0x56000068))

#define GPFCON	(*((volatile uint32_t*)0x56000050))
#define GPFDAT	(*((volatile uint32_t*)0x56000054))
#define GPFUP	(*((volatile uint32_t*)0x56000058))


void WatchDogDisable(void);
void Delay(uint32_t time);

#endif

Комбинированный модуль водить, добавить код логики main.c, эффект нажатия кнопки, соответствующие увел.

#include <stdint.h>

#include "s3c2440.h"
#include "led.h"
#include "key.h"


int main()
{
	WatchDogDisable();
	LedInitAll();
	AllKeyInit();

	while(1)
	{
		if(Key1CheckDown()){ SingleLedON(kLed1); }
		else { SingleLedOFF(kLed1); }
		
		if(Key2CheckDown()){ SingleLedON(kLed2); }
		else { SingleLedOFF(kLed2); }
		
		if(Key3CheckDown()){ SingleLedON(kLed3); }
		else { SingleLedOFF(kLed3); }
	}
}

Здесь с очень грубым способом для достижения этой функции, потому что это переход программы так компромисса.

4. Часы

S3C2440 в первую очередь необходимо смотреть на функциональные блок-схемы, может быть видно из рисунка, в основном за счет основного процессора S3C2440 ARM920T, устройства шины AHB, который присоединен к шине, в APB шины и подключенных к нему периферийных устройств в композиции. В то время как со ссылкой на фиг часы, часы можно видеть из устройств AHB шины предоставляемых HCLK, АПБ тактовая частота шины устройства обеспечивается PCLK, FCLK при условии, чтобы ядро ​​и процессор ARM920T в качестве тактового генератора.

 Глядя вперед, был найден PCLK и HCLK FCLK деления полученного, и внешнего входного тактового FCLK, полученного ФАПЧ через умножитель частоты. Вход синхронизации может быть генератором или внешние часы. Прочитайте руководство чипа, вы можете найти соответствующую информацию следующим образом:

тактовый вход ОМ выбираются источником входного сигнала, где плата 00 тянут вниз к ОМАМ непосредственно, то есть с помощью кварцевого генератора в качестве источника входного сигнала синхронизации, и мастер синхронизация используется источник синхронизации USB-часы, встроенный кварцевый генератор 12 МГц.

Ниже описан случай, когда требуется нота MPLLCON После установки регистра, выход MPLL будет работать наши системные часы, так что наш предыдущий код не указан, система часы 12MHz, очень медленно, поэтому нам нужно установить этот регистр улучшить систему скорость.

 После включения питания платы, потребность сигнала nRESET сброса системы, то система начнет работать, в то время как мощность сигнала nRESET 2 к 1 в течение некоторого времени, потому что нужно ждать стабильного источника питания, время задержки накопительного конденсатора или его чип гарантия. После 2 сброса системы, начать работать в это время , если ФАПЧ модифицировать программное обеспечение , которое мы имеем его настроить, это вызовет clockdisable, часы остановились, то система останавливается, когда система устойчива, блокировка время прошло, то система будет мы устанавливаем начинается отсчет времени, что FCLK новая частотная диаграмма после 4. Этот шаг необходим для установки MPLL ПМС, решил числа MPLL умножения.

Второй шаг требует FCLK при условии , к разделению факторов PCLK и HCLK. См отличается от фактора с частотным разделением на конечном числе с частотным разделением каналов, программа должна быть установлена в соответствии с этой таблицей, можно отметить остальные пункты исходного документа. Для того, чтобы отметить , что существует верхний предел PCLK и HCLK, потребности коэффициент деления должна быть тщательно определена после определения FCLK. Между тем, когда HDIVN не равен 0, в соответствии с требованиями варианта осуществления режима ассемблера процессора фиг к асинхронном режиме, в противном случае процессор будет использоваться в качестве операции системного тактового сигнала HCLK.

 MRC и MCR инструкцию по обработке сопроцессора, в ORR, R1_nF: ИЛИ: R1_iA Reference «ARM920T (Rev 1) Технические справочное Руководство» можно видеть, необходимость контролировать два управления регистром, так что ARM920T находится в асинхронном режиме. В  https://blog.csdn.net/shaodongju/article/details/51584576?locationNum=14&fps=1  подробном описании, также могут быть получены непосредственно Теперь ссылки вручную вывод, полученный код сборки сегмент должен быть

mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0

Регистрация операции MPLL

 Здесь нам нужно только направлять дела значения в ручной (собственное подтверждение трудным и неточным),

 Же коэффициент деления

 

 Таким образом, при условии, что система ввода MPLL 12 МГц тактовой частотой 400 МГц, делит FCLK: HCLK: PCLK = 1: 4: 8, то есть, выходной сигнал HCLK 100MHz, выход PCLK 50МГц. Процедуры заключаются в следующем:

s3c2440.h
---------------------------------------------
#ifndef __S3C2440_H
#define __S3C2440_H

#include <stdint.h>

/* CLOCK */
#define MPLLCON	 (*((volatile uint32_t*)0x4C000004))
#define UPLLCON	 (*((volatile uint32_t*)0x4C000008))

#define CLKDIVN	(*((volatile uint32_t*)0x4C000014))

/* WATCH DOG */
#define WTCON	(*((volatile uint32_t*)0x53000000))

/* GPIO */
#define GPGCON	(*((volatile uint32_t*)0x56000060))
#define GPGDAT	(*((volatile uint32_t*)0x56000064))
#define GPGUP	(*((volatile uint32_t*)0x56000068))

#define GPFCON	(*((volatile uint32_t*)0x56000050))
#define GPFDAT	(*((volatile uint32_t*)0x56000054))
#define GPFUP	(*((volatile uint32_t*)0x56000058))




void HardwareInitAll(void);
void Delay(uint32_t time);

#endif

s3c2440.c
---------------------------------------------
#include "s3c2440.h"


void Delay(uint32_t time)
{
	while(time--);
}

static void WatchDogDisable(void)
{
	WTCON = 0x0;
}

static void MPLLConfig(void)
{
	MPLLCON = ( 0x5c << 12) | ( 1 << 4 ) | ( 1 << 0 );
}

static void ClockDevideConfig(void)
{
	CLKDIVN = (2 << 1) | ( 1<< 0);
}

static void ChangeModeToAsynchronous(void)
{
	asm(
		"mrc p15,0,r0,c1,c0,0 \n\t"
		"orr r0,r0,#0xc0000000 \n\t"
		"mcr p15,0,r0,c1,c0,0 \n\t"
	);
}

void HardwareInitAll(void)
{
	WatchDogDisable();
	ChangeModeToAsynchronous();
	MPLLConfig();
	ClockDevideConfig();
}

main.c
------------------------------------------------
#include <stdint.h>

#include "s3c2440.h"
#include "led.h"

int main()
{
	HardwareInitAll();
	uint8_t led_now=kLed1;
	LedInitAll();
	while(1)
	{
		SingleLedOFF(led_now++);
		if(led_now > kLed3) { led_now =kLed1; }
		SingleLedON(led_now);
		Delay(100000);
	}
	return 0;
}

В примере легкой воде, а затем изменить часы, часы на частоте 400 МГц можно ясно наблюдать вспышки света быстрее.

Держись!

Опубликовано 19 оригинальных статей · вона похвала 7 · просмотров 6926

рекомендация

отblog.csdn.net/G_METHOD/article/details/104271762