Перейти к содержанию
    

shumerok

Участник
  • Постов

    58
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о shumerok

  • Звание
    Участник
    Участник
  1. Всем привет. Имеется китайский боард на STM32F407VET6. Пытаюсь запустить на нем Ethernet в режиме MII. Работаю в CubeIDE, библиотеки HAL. Проблема в следующем: куб формирует функцию MX_ETH_Init() для инициализации контроллера Ethernet, но она не проходит. Как только устанавливается разрешение тактирования Ethernet (__HAL_RCC_ETHMAC_CLK_ENABLE()) в регистре ETH_DMABMR устанавливается в "1" бит SR (программный сброс), который должен автоматически очиститься после сброса. Но он не очищается и программа залетает в Error_Handler. Может кто сталкивался с подобным? И еще, часть выводов MII на плате подключены к различной периферии (Flash, LED), может ли это оказывать влияние на процесс инициализации?
  2. Вопрос снимается. В источнике питания не хватало емкости. Просаживало напряжение при запуске ядра.
  3. Сравнивал. Все тоже самое. Обнаружил вот что: при выборе источника клока напрямую от MCLK ФАПЧ замыкается (Lock подсвечивает зеленым, на выходе CLKOUT появляется клок), при выборе в качестве источника PLL все настройки слетают в начальные.
  4. Добрый день. Имеется плата собственной разводки на ADAU1452. На тактирование стоит кварцевый резонатор на 12.288 МГц. Генерация присутствует. Загрузка проектов через Сигма студио. Питание на всех ногах в норме. Обмен с USBi по I2C. Обмен на шине присутствует (осциллографом наблюдается). Читаю состояния всех регистров, но ничего не могу записать. После чтения вижу, что состояние регистров не изменилось. Также отсутствует клок на выходе CLKOUT. Selfboot притянут к земле. Что уже только не перепробовал, PLL не захватывает. Может кто сталкивался с чем подобным? Куда копать? Схему прилагаю.
  5. Проблема решилась вводом задержки в 1мкс в цикле опроса флага прерывания.
  6. Побайтный прием организовал. Но вылезла другая проблема. В дебаге и через RUN все работает. Зашиваю релиз - не работает. Процессор в релизе крутится, но данные не принимает. Новый код: /* * code.c * * Created on: 04.12.2017 * Author: shumer */ #include <stdio.h> #include "xparameters.h" #include "xil_cache.h" #include "xbasic_types.h" #include "xtmrctr.h" #include "xuartlite.h" #include "xintc.h" #include "xil_exception.h" #define UARTRS_ID XPAR_UARTLITE_1_DEVICE_ID #define UARTRS_ESP XPAR_UARTLITE_2_DEVICE_ID #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID #define UARTLITE_INT_IRQ_ID XPAR_INTC_0_UARTLITE_2_VEC_ID #define TMR_ID XPAR_TMRCTR_0_DEVICE_ID #define A 65 #define T 84 #define PLUS 43 #define C 67 #define I 73 #define P 80 #define M 77 #define U 85 #define X 88 #define S 83 #define E 69 #define R 82 #define V 86 #define RAVNO 61 #define ZPT 44 #define TEST_BUFFER_SIZE 1 // Function prototypes void SendHandler(void *CallBackRef, unsigned int EventData); void RecvHandler(void *CallBackRef, unsigned int EventData); int SetupInterruptSystem(XUartLite *UartLitePtr); void delay_us(Xuint32 Vremay); void delay_ms(Xuint32 Vremay); XUartLite UartLiteESP; XUartLite UartLiteRS; XIntc InterruptController; XTmrCtr Time; u8 SendBuffer[4] = {A,T,13,10}; u8 ReceiveBuffer[TEST_BUFFER_SIZE] = {0}; u8 SendBufferRS[6] = {S,E,R,V,13,10}; static volatile int TotalReceivedCount; static volatile int TotalSentCount; int flag = 0; unsigned int RecvByte; unsigned int SendByte; int Count = 0; int main() { int Status; int Index; int flagSend = 0; XTmrCtr_Initialize(&Time, TMR_ID); XTmrCtr_SetOptions(&Time, 0, XTC_DOWN_COUNT_OPTION); Status = XUartLite_Initialize(&UartLiteESP,UARTRS_ESP); if(Status != XST_SUCCESS){ return XST_FAILURE; } Status = XUartLite_Initialize(&UartLiteRS,UARTRS_ID); if(Status != XST_SUCCESS){ return XST_FAILURE; } Status = SetupInterruptSystem(&UartLiteESP); if (Status != XST_SUCCESS) { return XST_FAILURE; } XUartLite_SetSendHandler(&UartLiteESP, SendHandler, &UartLiteESP); XUartLite_SetRecvHandler(&UartLiteESP, RecvHandler, &UartLiteESP); XUartLite_EnableInterrupt(&UartLiteESP); delay_ms(1000); XIntc_Acknowledge(&InterruptController, UARTLITE_INT_IRQ_ID); Index = 0; XUartLite_Send(&UartLiteESP, SendBuffer, 4); while(1){ if(flag == 1){ SendBufferRS[0] = ReceiveBuffer[0]; XUartLite_Send(&UartLiteRS, SendBufferRS, 1); /*if(flagSend != 1){ ++Index; } else{ Index = 0; flagSend = 0; }*/ TotalReceivedCount = 0; flag = 0; } } return(0); } void SendHandler(void *CallBackRef, unsigned int EventData) { TotalSentCount = EventData; XIntc_Acknowledge(&InterruptController, UARTLITE_INT_IRQ_ID); } void RecvHandler(void *CallBackRef, unsigned int EventData) { TotalReceivedCount = EventData; flag = 1; //++Count; XUartLite_Recv(&UartLiteESP, ReceiveBuffer, 1); XIntc_Acknowledge(&InterruptController, UARTLITE_INT_IRQ_ID); } void delay_ms(Xuint32 Vremay) { XTmrCtr_SetResetValue(&Time, 0, Vremay * 50000); XTmrCtr_Start(&Time, 0); while(!(XTmrCtr_IsExpired(&Time, 0))){} XTmrCtr_Stop(&Time, 0); } void delay_us(Xuint32 Vremay) { XTmrCtr_SetResetValue(&Time, 0, Vremay * 50); XTmrCtr_Start(&Time, 0); while(!(XTmrCtr_IsExpired(&Time, 0))){} XTmrCtr_Stop(&Time, 0); } int SetupInterruptSystem(XUartLite *UartLitePtr) { int Status; /* * Initialize the interrupt controller driver so that it is ready to * use. */ Status = XIntc_Initialize(&InterruptController, INTC_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Connect a device driver handler that will be called when an interrupt * for the device occurs, the device driver handler performs the * specific interrupt processing for the device. */ Status = XIntc_Connect(&InterruptController, UARTLITE_INT_IRQ_ID, (XInterruptHandler)XUartLite_InterruptHandler, (void*)UartLitePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the interrupt controller such that interrupts are enabled for * all devices that cause interrupts, specific real mode so that * the UartLite can cause interrupts through the interrupt controller. */ Status = XIntc_Start(&InterruptController, XIN_REAL_MODE); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Enable the interrupt for the UartLite device. */ XIntc_Enable(&InterruptController, UARTLITE_INT_IRQ_ID); /* * Initialize the exception table. */ Xil_ExceptionInit(); /* * Register the interrupt controller handler with the exception table. */ Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &InterruptController); /* * Enable exceptions. */ Xil_ExceptionEnable(); return XST_SUCCESS; } Подозреваю, что есть разница в скорости работы проца в дебаге и релизе. Может кто сталкивался с подобным? Буду благодарен за любую помощь.
  7. Спасибо попробую так. Виснет пока не вычитает буфер. Если принимать по одному, то действительно надо сбрасывать флаг.
  8. Прошу прощения. Сам дурак. Не те символы в ASCII отправлял. Есть дополнительный вопрос: как в режиме прерывания принимать произвольное кол-во байт (неизвестно заранее кол-во). У меня выход из прерывания не происходит, пока буфер не заполнится.
  9. Добрый день уважаемые форумчане. В моем проекте два UARTа. Один работает по прерыванию с внешним модулем, второй только в режиме передачи выводит информацию на терминал ноута. Внешний модуль ESP8266. Я передаю ему команду "AT" и должен получить в ответ "OK". А я получаю ту же команду, что отправляю. Хотя ESP точно не может отправить обратно ту же команду. Получается, что в приемный буфер попадают данные из передающего. Проект собран в ISE. Код привожу ниже: #include <stdio.h> #include "xparameters.h" #include "xil_cache.h" #include "xbasic_types.h" #include "xgpio.h" #include "xil_printf.h" #include "xuartlite.h" #include "xintc.h" #include "xil_exception.h" #include "xtmrctr.h" #define UART_ESP XPAR_UARTLITE_1_DEVICE_ID #define UART_RS232 XPAR_UARTLITE_0_DEVICE_ID #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID #define UARTLITE_INT_IRQ_ID XPAR_INTC_0_UARTLITE_1_VEC_ID #define LED_ID XPAR_GPIO_0_DEVICE_ID #define TMR_ID XPAR_TMRCTR_0_DEVICE_ID #define TEST_BUFFER_SIZE 6 // Function prototypes void SendHandler(void *CallBackRef, unsigned int EventData); void RecvHandler(void *CallBackRef, unsigned int EventData); int SetupInterruptSystem(XUartLite *UartLitePtr); void delay_us(Xuint32 Vremay); void delay_ms(Xuint32 Vremay); XUartLite UartLiteESP; XUartLite UartLiteRS; XIntc InterruptController; XGpio LedTest; XTmrCtr Time; u8 SendBuffer[6] = {65, 84, 92, 114, 92, 110}; u8 ReceiveBuffer[TEST_BUFFER_SIZE]; u8 TotalReceivedCount; u8 TotalSentCount; int main() { int Status; int Index; XTmrCtr_Initialize(&Time, TMR_ID); XTmrCtr_SetOptions(&Time, 0, XTC_DOWN_COUNT_OPTION); delay_ms(1000); delay_ms(1000); for (Index = 0; Index < TEST_BUFFER_SIZE; Index++) { ReceiveBuffer[index] = 0; } Status = XUartLite_Initialize(&UartLiteESP,UART_ESP); if(Status != XST_SUCCESS){ return XST_FAILURE; } Status = XUartLite_Initialize(&UartLiteRS,UART_RS232); if(Status == XST_SUCCESS) { print("UART Init OK\r\n"); } Status = XGpio_Initialize(&LedTest, LED_ID); if (Status == XST_SUCCESS) { print(" Initialize GPIO OK\r\n"); } Status = SetupInterruptSystem(&UartLiteESP); if (Status == XST_SUCCESS) { print("Setup INT OK\r\n"); } XUartLite_SetSendHandler(&UartLiteESP, SendHandler, &UartLiteESP); XUartLite_SetRecvHandler(&UartLiteESP, RecvHandler, &UartLiteESP); //XUartLite_ResetFifos(&UartLiteESP); XUartLite_Recv(&UartLiteESP, ReceiveBuffer, TEST_BUFFER_SIZE); XUartLite_EnableInterrupt(&UartLiteESP); XUartLite_Send(&UartLiteESP, SendBuffer, 6); delay_ms(1); if (TotalSentCount == 6){ TotalSentCount = 0; print("Send OK\r\n"); } while(1){ if (TotalReceivedCount != 0) { print("Recive"); for (Index = 0; Index < TotalReceivedCount; Index++) { xil_printf(" %c", ReceiveBuffer[index]); } TotalReceivedCount = 0; } } return(0); } void SendHandler(void *CallBackRef, unsigned int EventData) { TotalSentCount = EventData; XUartLite_ResetFifos(&UartLiteESP); } void RecvHandler(void *CallBackRef, unsigned int EventData) { TotalReceivedCount = EventData; XUartLite_Recv(&UartLiteESP, ReceiveBuffer, TEST_BUFFER_SIZE); } void delay_ms(Xuint32 Vremay) { XTmrCtr_SetResetValue(&Time, 0, Vremay * 50000); XTmrCtr_Start(&Time, 0); while(!(XTmrCtr_IsExpired(&Time, 0))){} XTmrCtr_Stop(&Time, 0); } void delay_us(Xuint32 Vremay) { XTmrCtr_SetResetValue(&Time, 0, Vremay * 50); XTmrCtr_Start(&Time, 0); while(!(XTmrCtr_IsExpired(&Time, 0))){} XTmrCtr_Stop(&Time, 0); } int SetupInterruptSystem(XUartLite *UartLitePtr) { int Status; /* * Initialize the interrupt controller driver so that it is ready to * use. */ Status = XIntc_Initialize(&InterruptController, INTC_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Connect a device driver handler that will be called when an interrupt * for the device occurs, the device driver handler performs the * specific interrupt processing for the device. */ Status = XIntc_Connect(&InterruptController, UARTLITE_INT_IRQ_ID, (XInterruptHandler)XUartLite_InterruptHandler, (void*)UartLitePtr); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Start the interrupt controller such that interrupts are enabled for * all devices that cause interrupts, specific real mode so that * the UartLite can cause interrupts through the interrupt controller. */ Status = XIntc_Start(&InterruptController, XIN_REAL_MODE); if (Status != XST_SUCCESS) { return XST_FAILURE; } /* * Enable the interrupt for the UartLite device. */ XIntc_Enable(&InterruptController, UARTLITE_INT_IRQ_ID); /* * Initialize the exception table. */ Xil_ExceptionInit(); /* * Register the interrupt controller handler with the exception table. */ Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &InterruptController); /* * Enable exceptions. */ Xil_ExceptionEnable(); return XST_SUCCESS; } Помогите кто чем может).
  10. Благодарю. Кстати, нашел описание от avnet. Там написано, что можно использовать bootloader от parallel flash. Для итого подключается библиотека xilif и команды работы с памятью в bootloadere заменяются на spi-ные.
  11. Добрый день. Имеется стартовый набор Spartan-3e Starter Kit. На плате имеется кристалл XC3S500E, Platform Flash, SPI Flash, Parallel NOR Flash, DDR SDRAM. Работаю с Microblaze. Шина PLB (AXI не поддерживается). Хочу хранить конфигурационные данные + программу во внешней памяти с последующей загрузкой программы в DDR. Зашел в тупик. Общий алгоритм, как я понял, следующий: прошивка состоит из bit-файла аппаратной платформы, bmm-файла блочной памяти и elf-файла загрузчика (bootloader), srec-файла основной программы (располагается по определенному адресу, указываемому в blconfig.h). Проблемы в следующем: 1. Попытка использовать SPI Flash. Используется контроллер XPS SPI. При данном подходе SDK автоматически не формирует файл загрузчика. 2. Попытка использовать Parallel Flash. С помощью SDK автоматом формируется файл загрузчика, в blconfig.h правится начальный адрес расположения SREC-файла. С помощью data2mem формирую новый bit-файл из старого bit, bmm и elf загрузчика (команда data2mem -bm my.bmm -bd code.elf -bt my.bit -o b new.bit). Далее в IMPACT генерирую PROM файл и добавляю в него SREC. Получаю mcs-файл, включающий в себя все, что нужно. Дальше тупик. Как прошить Parallel Flash? Ни по JTAG ни через кристалл она не доступна. 3. Можно ли использовать сформированный для Parallel Flash загрузчик для извлечения данных из SPI Flash? Надо ли в нем что-то менять? 4. И еще вопрос по Linker Script. Что должно стоять в разделе Section to Memory Region Mapping? Начальный адрес локальной шины, flash или DDR? Благодарю за любую помощь.
  12. В общем, завел сигнал с выхода проца на вход и подавал инвертирующийся с интервалом 5 сек сигнал. Контроллер прерывания срабатывает по фронту и по спаду. По поводу накопления прерываний в контроллере пока не скажу, надо создавать проект в ISE и там генерировать прерывания. Прерывания действительно ставятся в очередь даже если стоит запрет. После разрешения прерывания происходит обработка следующего в очереди.
  13. Если бы я делал какой-то проект, то не заморачивался бы и поставил фильтр. Но на данный момент я просто изучаю процессор и все, что к нему прилагается.
  14. В понедельник проверю чистым сигналом с внутренней логики
  15. Притом, что я работаю в дебаге и после срабатывания прерывания я выставляю его запрет. Причем тут дребезг? К моменту разрешения нового прерывания могут пройти десятки секунд.
×
×
  • Создать...