Начинаю осваивать BF-533 по примерам, программы на С, использую ADSP-BF533 EZ-Kits (27MHz).
Попробывал с простым примером из программ EZ-Kits - LED индикаторы, что то работает.
Далее пытаюсь сделать работу процессора BF533 с последовательным портом RS232.
Мне очень нужное дело. На входе GPS - раз в секунду выдаёт строку данных (GPS точно работает, со скоростью 9600).
Пока просто пытаюсь убедиться, что работает UART, идут его прерывания. Для этого
в прерывание UART изменение индикации LED индикаторов EZ-Kits (*pFlashA_PortB_Data), ноль имоций.
Возможно неправильная инц-я UART и т.д.
Навставлял где надо и ненадо (по другим примерам):
ssync();
idle();
Собственно их значение мне почти не понятно
Мой пример далее - если есть возможность у опытных разработчиков?
#ifndef __Talkthrough_DEFINED
#define __Talkthrough_DEFINED
#include <sys\exception.h>
#include <cdefBF533.h>
#include <ccblkfn.h>
#include <sysreg.h>
void Init_Config(void);
void Init_Interrupts(void);
void Init_Flags(void);
void Init_Flash(void);
// CLKIN frequency is 27MHz on the ADSP-BF533 EZ-Kits.
#define CLKIN 27
#define BAUDRATE 9600
#define NEWLIGHT 200
// Neiaieuiua eiinoaiou //
// Aa?ana aey Port B a Flash A
#define pFlashA_PortB_Dir (volatile unsigned char *)0x20270007
#define pFlashA_PortB_Data (volatile unsigned char *)0x20270005
extern char aByte;
extern short FlagLight;
extern long int IntrId;
EX_INTERRUPT_HANDLER(UART_RX_ISR);
#endif
//--------------------------------------------------------------------------//
#include "Talkthrough.h"
#include "sysreg.h"
#include "ccblkfn.h"
#include <defBF533.h>
#include <string.h>
char aByte;
short FlagLight=0;
long int IntrId=0;
///////////////////////////////////////////////////////////////
//CLKIN is the input clock.The ADSP-BF533 EZ-Kit's CLKIN is 27MHz
//This function will check what the system clock is based
//on the MSEL, DF, and SSEL values in the PLL_CTL and PLL_DIV registers.
///////////////////////////////////////////////////////////////
int GetSCLK()
{
unsigned short tempPLLCTL, tempPLLDIV;
unsigned short MSEL, SSEL, DF, VCO, SCLK;
unsigned short clkin = CLKIN;
tempPLLCTL = *pPLL_CTL;
tempPLLDIV = *pPLL_DIV;
//get MSEL, SSEL, DF
MSEL = ((tempPLLCTL & 0x7E00) >> 9);
SSEL = tempPLLDIV & 0x000f;
DF = tempPLLCTL & 0x0001;
if(DF == 1) clkin = clkin/2;
VCO = MSEL * clkin;
return ( VCO * 1000000 ) / SSEL;
}
void main(void)
{
sysreg_write(reg_SYSCFG, 0x32);
Init_Config();
Init_Flash();
Init_Interrupts();
while(1) {};
}
//--------------------------------------------------------------------------//
#include "Talkthrough.h"
void Init_Config(void)
{
unsigned long divisor=0;
*pPLL_CTL = 0x0200; // VCO = 27MHz
ssync();
idle();
*pUART_LCR = 0x83;
ssync();
divisor = GetSCLK() / ( 16 * BAUDRATE );
*pUART_DLL = divisor;
ssync();
*pUART_DLH = divisor>>8;
ssync();
*pUART_LCR = 0x03;
ssync();
*pUART_GCTL = 0x01;
ssync();
}
void Init_Interrupts(void)
{
*pUART_IER = 0x0007;
*pUART_IIR = 0x0005;
ssync();
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xf3ffffff;
*pSIC_IAR2 = 0xffff5fff;
ssync();
register_handler(ik_ivg10, UART_RX_ISR);
*pSIC_IMASK = 0x00084000;
ssync();
}
void Init_Flash(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
*pFlashA_PortB_Dir = 0x3f;
*pFlashA_PortB_Data = 0x31;
}
//--------------------------------------------------------------------------//
#include "Talkthrough.h"
EX_INTERRUPT_HANDLER(UART_RX_ISR)
{
aByte = *pUART_RBR;
ssync();
if(FlagLight)
{
FlagLight = 0;
if(IntrId > NEWLIGHT)
{
IntrId = 0;
*pFlashA_PortB_Data = 0x10;
}
else IntrId++;
}
else
{
FlagLight = 1;
if(IntrId > NEWLIGHT)
{
IntrId = 0;
*pFlashA_PortB_Data = 0x21;
}
else IntrId++;
}
}