Files
Balsam_167/Source/Internal/tools.c

89 lines
3.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @file tools.c
* @brief Низкоуровневая настройка XINTF Zone 7 и микросекундные задержки.
*
* init_zone7() программирует GPIO и временные параметры внешней 16-битной шины.
* Значения lead/active/trail привязаны к частоте SYSCLKOUT и характеристикам
* внешней памяти. pause_us() является активным ожиданием и блокирует процессор,
* поэтому подходит только для коротких аппаратных пауз вне критичных ISR.
*/
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
// Configure the timing paramaters for Zone 7.
// Notes:
// This function should not be executed from XINTF
// Adjust the timing based on the data manual and
// external device requirements.
/**
* @brief Включает XINTF и программирует временную диаграмму Zone 7.
* @pre Функция исполняется не из памяти, отображённой в настраиваемую Zone 7.
* @post Внешняя шина работает в 16-битном режиме с XTIMCLK=SYSCLKOUT.
* @warning Значения тактов рассчитаны для штатной частоты платы.
*/
void init_zone7(void)
{
// Make sure the XINTF clock is enabled
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;
// Configure the GPIO for XINTF with a 16-bit data bus
// This function is in DSP2833x_Xintf.c
InitXintf16Gpio();
EALLOW;
// All Zones---------------------------------
// Timing for all zones based on XTIMCLK = SYSCLKOUT
XintfRegs.XINTCNF2.bit.XTIMCLK = 0;
// Buffer up to 3 writes
XintfRegs.XINTCNF2.bit.WRBUFF = 3;
// XCLKOUT is enabled
XintfRegs.XINTCNF2.bit.CLKOFF = 0;
// XCLKOUT = XTIMCLK
XintfRegs.XINTCNF2.bit.CLKMODE = 0;
// Zone 7------------------------------------
// When using ready, ACTIVE must be 1 or greater
// Lead must always be 1 or greater
// Zone write timing
XintfRegs.XTIMING7.bit.XWRLEAD = 1;
XintfRegs.XTIMING7.bit.XWRACTIVE = 2;
XintfRegs.XTIMING7.bit.XWRTRAIL = 1;
// Zone read timing
XintfRegs.XTIMING7.bit.XRDLEAD = 1;
XintfRegs.XTIMING7.bit.XRDACTIVE = 3;
XintfRegs.XTIMING7.bit.XRDTRAIL = 0;
// don't double all Zone read/write lead/active/trail timing
XintfRegs.XTIMING7.bit.X2TIMING = 0;
// Zone will not sample XREADY signal
XintfRegs.XTIMING7.bit.USEREADY = 0;
XintfRegs.XTIMING7.bit.READYMODE = 0;
// 1,1 = x16 data bus
// 0,1 = x32 data bus
// other values are reserved
XintfRegs.XTIMING7.bit.XSIZE = 3;
EDIS;
//Force a pipeline flush to ensure that the write to
//the last register configured occurs before returning.
asm(" RPT #7 || NOP");
}
/**
* @brief Выполняет блокирующую паузу приблизительно t микросекунд.
* @param t Требуемая длительность при текущей конфигурации SYSCLKOUT.
* @note Во время цикла процессор не выполняет foreground-работу.
*/
void pause_us(unsigned long t)
{
unsigned long i;
t = t >> 1;
for (i = 0; i < t; i++)
{
DSP28x_usDelay(CLKMULT*8L);
} }