Реализация системы
После завершения проектирования схемы и компиляции проекта вы готовы к переносу вашего проекта в код микроконтроллера, выполнив следующие основные шаги:
- Получите параметры и адреса из SigmaStudio (экспортируйте файлы .params, .hex и .h).
- Выполните синтаксический разбор файла с информацией о параметрах.
- Включите (интегрируйте) в код микроконтроллера.
Чтобы получить доступ к параметрам и адресам из SigmaStudio, необходимо сначала скомпилировать проект и экспортировать файлы параметров. После этого у вас будут два файла параметров:
- yourfilename.hex — шестнадцатеричные значения параметров для записи в DSP.
- yourfilename.params — подробный файл с адресами и значениями всех параметров.
Вы можете просмотреть примеры файлов *.params и *.hex в разделе Экспорт программы и параметров (Export Program and Parameters).
Ниже приведен пример того, как можно интегрировать параметры в код микроконтроллера (AD1940). Выделенные функции в главной функции также определены:






~~~~ Нажмите здесь, чтобы просмотреть приведенный выше исходный код в виде обычного текста |
# include "prog_data.h"
# include "param_data.h"
# include "Design_IC 1.h" // *** Этот файл сгенерирован SigmaStudio ***
# include "Design_IC 1_REG.h" // *** Этот файл сгенерирован SigmaStudio ***
# include "comms.h"
# define byte unsigned char
// Основная программа кода микроконтроллера
int main(void)
{
// Настройка порта SPI — это зависит от аппаратного обеспечения
SpiInit();
Mute();
// Запись программы в DSP
SpiWrite(PROG_START_ADR, PROGRAM_DATA, PROG_LENGTH*6);
// Подождать некоторое время
Wait(...);
// Запись файла параметров
SpiWrite(PARAM_START_ADR, PARAM_DATA, PARAM_LENGTH*4);
Wait(...);
UnMute();
// Запись одного значения (0.242) по указанному адресу
// Адрес MODULE_Main_Single1_VALUE определён в
// заголовочном файле, сгенерированном SigmaStudio (Design_IC 1.h).
ParamWrite(MODULE_Main_Single1_VALUE, 0.242);
// Пример безопасной загрузки одного параметра: будет загружено значение 1.999 в формате 5.23
// по адресу 2
// Эта функция включает инициацию безопасной загрузки в parameter RAM
SafeloadSingleParamWrite(2, 1.999);
// Пример безопасной загрузки нескольких параметров (например, коэффициентов фильтра)
// - загружает данные в каждую из пяти позиций безопасной загрузки,
// - затем инициирует безопасную загрузку
SafeloadMultipleParamWrite(MODULE_Main_MidEQ1_Alg0_Stage0_B0_ADDRESS, 1.999, 0);
SafeloadMultipleParamWrite(MODULE_Main_MidEQ1_Alg0_Stage0_B1_ADDRESS, -.988, 1);
SafeloadMultipleParamWrite(MODULE_Main_MidEQ1_Alg0_Stage0_B2_ADDRESS, 1.999, 2);
SafeloadMultipleParamWrite(MODULE_Main_MidEQ1_Alg0_Stage0_A1_ADDRESS, -.999888, 3);
SafeloadMultipleParamWrite(MODULE_Main_MidEQ1_Alg0_Stage0_A2_ADDRESS, 1.999, 4);
InitSafeloadParam();
return 0;
}
// Функция ожидания кода микроконтроллера
void Wait(float time) // время ожидания в миллисекундах
{
long cycles;
cycles = time / 1.422e-3; // при условии тактовой частоты ядра микроконтроллера 45 МГц
while (cycles != 0)
{
--cycles;
}
}
// Функция отключения звука кода микроконтроллера
void Mute()
{
byte corecontrol[2] = {0x00, 0x00};
// Запись в регистр управления ядром
SpiWrite(CORE_CONTROL_REG, corecontrol, 2);
// Подождать 20 мкс
Wait(20);
}
// Функция включения звука кода микроконтроллера
void UnMute()
{
byte corecontrol[2] = {0x02, 0x00};
// Запись в регистр управления ядром
SpiWrite(CORE_CONTROL_REG, corecontrol, 2);
// Подождать 20 мкс
Wait(20);
}
// Функция SpiWrite микроконтроллера
// Функция принимает начальный адрес для записи, массив
// данных и длину массива (в байтах).
void SpiWrite(short address, unsigned char* data, int length)
{
int i = 0;
byte address_hi = 0; // старший байт адреса регистра/RAM
byte address_lo = 0; // младший байт адреса регистра/RAM
address_lo = (byte)address; // получить младший байт адреса регистра/RAM
address_hi = (byte)(address>>8); // получить старший байт адреса, сдвинутый влево на 8 бит
// Вставьте сюда вашу функцию записи
SPI_TX_REG = 0x00; // Запись в DSP по адресу чипа 0
SPI_TX_REG = address_hi; // Запись старшего байта адреса
SPI_TX_REG = address_lo; // Запись младшего байта адреса
for (i=0; i>8);
// Вставьте сюда вашу функцию записи
SPI_RX_REG = 0x01; // Запись в DSP и установка бита RW в 1
SPI_RX_REG = address_hi; // Запись старшего байта адреса
SPI_RX_REG = address_lo; // Запись младшего байта адреса
for (i=0; i>8);
byte param_addr_lo;
byte param_addr_hi;
// получить младший байт адреса параметра
param_addr_lo=(byte)param_addr;
// получить старший байт адреса, сдвинутый влево на 8 бит
param_addr_hi=(byte)(param_addr>>8);
SPI_TX_REG = 0x00; // Запись в DSP по адресу чипа 0
SPI_TX_REG = safe_addr_hi; // Запись старшего байта адреса безопасной загрузки
SPI_TX_REG = safe_addr_lo; // Запись младшего байта адреса безопасной загрузки
SPI_TX_REG = param_addr_hi; // Запись старшего байта адреса параметра
SPI_TX_REG = param_addr_lo; // Запись младшего байта адреса параметра
}
// Функции кода микроконтроллера, безопасная загрузка: SafeParam
void SafeParam(short safe_param, unsigned char* param_data)
{
byte safe_param_lo;
byte safe_param_hi;
// получить младший байт адреса регистра/RAM
safe_param_lo=(byte)safe_param;
// получить старший байт адреса, сдвинутый влево на 8 бит
safe_param_hi=(byte)(safe_param>>8);
SPI_TX_REG = 0x00; // Запись в DSP по адресу чипа 0
SPI_TX_REG = safe_param_hi; // Запись старшего байта адреса безопасной загрузки
SPI_TX_REG = safe_param_lo; // Запись младшего байта адреса безопасной загрузки
SPI_TX_REG = param_data[4]; // Запись байта 4 параметра (старшие биты)
SPI_TX_REG = param_data[3]; // Запись байта 3 параметра
SPI_TX_REG = param_data[2]; // Запись байта 2 параметра
SPI_TX_REG = param_data[1]; // Запись байта 1 параметра
SPI_TX_REG = param_data[0]; // Запись байта 1 параметра (младшие биты)
}
// Примечание: SafeParam и SafeAddr должны выполняться вместе.
// Функции кода микроконтроллера: преобразование числа с плавающей точкой в формат 5.23
void To523(float param_dec, byte* param_hex)
{
long param223;
long param227;
// умножить десятичное число на 2^23
param223 = param_dec * (1 << 23);
// преобразовать в положительное двоичное число
param227 = param223 + (1 << 27);
param_hex[3]=(byte)param227; // получить байт 3 (младшие биты) значения параметра
param_hex[2]=(byte)(param227>>8); // получить байт 2 значения параметра
param_hex[1]=(byte)(param227>>16); // получить байт 1 значения параметра
// получить байт 0 (старшие биты) значения параметра
param_hex[0]=(byte)(param227>>24);
// инвертировать знаковый бит для получения правильного знака
param_hex[0] = param_hex[0] ^ 0x08;
}
~~~~