Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC13XX
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
3.14
Ребята, кто-нибудь уже юзал LPC13 серии (у меня 1313)?
Что то у меня он оживать не хочет.
Его пины JTAG совмещены с GPIO и по умолчанию функционируют как JTAG лини, но мой чип в ответ ничего не выдает.
Еще странность, если подтянуть P0.1 на землю во время включения питания или сброса, камень должен остаться в загрузчике, и работать через UART, если соблюсти это условие активности на UART я так же не наблюдаю (он хотяб TX к питанию подтянуть должен).
3.14
Вобщем, по SWD контроллер откликается, остается понять что сделать чтобы он на JTAG переключился ...

Блин, рано обрадовался, флешку стереть-запрограммировать не получается ...
GetSmart
Цитата(3.14 @ Dec 2 2009, 12:44) *
Вобщем, по SWD контроллер откликается, остается понять что сделать чтобы он на JTAG переключился ...

А SWD - это что такое?

ЗЫ. LPC13xx это какой кортекс? Вроде слухи были про 17хх и 11хх, а 13хх не слышал.
etoja
Цитата(GetSmart @ Dec 2 2009, 10:01) *
LPC13xx это какой кортекс?


Cortex-M0
3.14
ARM Cortex-M3
SWD - новый дополнительный интерфейс отладки/программирования у кортексов
3.14
Насчет ошибки операций с флешкой, утилиты сеггера работать с флешкой судя по всему пока не умеют (даже стереть не может), Keil работает нормально но у него едет крыша с контрольной суммой валидности приложения во флешке, так что пока приходится отключать ферификацию записи.
dimka76
Цитата(3.14 @ Dec 2 2009, 13:28) *
Насчет ошибки операций с флешкой, утилиты сеггера работать с флешкой судя по всему пока не умеют (даже стереть не может), Keil работает нормально но у него едет крыша с контрольной суммой валидности приложения во флешке, так что пока приходится отключать ферификацию записи.


FlashMagic отлично работает с этим контроллером.
shahr
В LPC1300 нет JTAG. Только SWD.
3.14
Интресно, а для чего тогда пины вывели?
shahr
Цитата(3.14 @ Dec 11 2009, 14:42) *
Интресно, а для чего тогда пины вывели?

Хороший вопрос smile.gif Спросил об этом наших разработчиков.
3.14
Ну да это уже не принципиально, по SWD все-равно приятнее отлаживаться, да и пинов меньше требуется ...
Меня сейчас застал в расплох такой момент, в режиме DEEP SLEEP он может просыпаться ТОЛЬКО (я после ознакомления с докой по диагонали подумал, что от любого прерывания работающего модуля может, в частности таймера sad.gif ) от внешних GPIO, чего спрашивается "пудрить мозги" тем что включен например АЦП в спячке или нет, когда от этого все-равно в системе никакой реакции не будет ...
shahr
Цитата(3.14 @ Dec 15 2009, 14:21) *
Ну да это уже не принципиально...


Ну непринципиально - и хорошо. Просто надо запомнить, что в LPC1300/LPC1100 - только SWD. А наши документописатели уже рисуют новую версию DS и UM без JTAGовских пинов. И зачем они их там нарисовали - ума не приложу smile.gif
dimka76
Пробую работать с LPC1311.
Вот моя тестовая программака.
Код
#include "LPC13xx.h"  
#include "clkconfig.h"

volatile char i;
void CT16B0_IRQHandler(void)
{
  LPC_TMR16B0->IR = 0x3F; /*clear flag*/
  LPC_TMR16B0->MR0 = i;
  --i;
  return;
}
int main (void)
{
  i = 0;
  /* Enable AHB clock to the GPIO domain. */
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

   SystemInit();

  // Init Timer16_B0
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);
  LPC_TMR16B0->PR = LPC_TMR16B0->CCR = 0;
  LPC_IOCON->PIO0_8 = 0x02;
  LPC_IOCON->JTAG_TCK_PIO0_10 = 0x03;
  LPC_TMR16B0->MR1 = 0xFF;/*TimerInterval*/
  LPC_TMR16B0->MR0 =1;
  LPC_TMR16B0->MR2 = 0x1F;   //test signal with constant pulse width
  LPC_TMR16B0->MCR=(1<<4)| /*Reset on MR1*/
                                  (1<<3); /*Interrupt MR1*/
/* PWM mode is enabled for CT16B0_MAT0 */
  LPC_TMR16B0->PWMC = 1 + (1<<2);
  NVIC_EnableIRQ(TIMER_16_0_IRQn);
  LPC_TMR16B0->TCR = 1; /* enable Timer */  

  while (1) {};
}


Здесь настраиваю таймер на выдачу двух ШИМов: один с постоянной скважностью (MR2), другой с изменяемой(MR0).
В обработчике прерывания по переполнению таймера (0xFF) делаю либо инкремент скважности, либо декремент.
Сигнал с выхода MR0 пропускаю через RC-фильтр (R=5.6 кОм, С=2.2 нФ). На выходе RC имею пилу.
Так вот, при инкременте все замечательно.
При декременте на пиле появляется зазубрина.
Откуда она появляется? И почему ширина импулься с выхода MR0 внезапно становится равна нулю при декременте?
Чертовщина какая-то ))).
Писал в службу поддержки NXP и вот что они мне ответили
Цитата
I did a test with your program on a MCB1000 board with the LPC1343 micro and and did not see any difference. The choice of output might be the problem. Try an other output mode in IOCON register (bit 3 and 4).

The jitter and the rise and fall time are the same with increment or decerment i


На сайте NXP нет почтового адреса (e-mail) службы поддержки, а только WEB-форма, которая позволяет отправлять только текст.

Может shahr посодействует в получении ответа на мой вопрос. Или 3.14 повторит мой эксперимент.
Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла
Vitaliy_ARM
Если не трудно, могут ли владельцы плат MCB1300 или LPCXpresso 1343 проверить приложенную прошивку?
Вроде бы сделано все правильно. Файл компановщика сконфигурирован в соответствии с AN10904.

Прошивка очень простая, но уже весь мозг сломал - не работает HID. smile3046.gif

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

Код
#include "includes.h"                        /* LPC13xx definitions */

#define USB_VENDOR_ID 0x1FC9
#define USB_PROD_ID   0x0003
#define USB_DEVICE      0x0100

USB_DEV_INFO DeviceInfo;
HID_DEVICE_INFO HidDevInfo;
ROM ** rom = (ROM **)0x1fff1ff8;

#define     EN_TIMER32_1    (1<<10)
#define     EN_IOCON        (1<<16)
#define     EN_USBREG       (1<<14)

#define PORT0        0
#define PORT1        1
#define PORT2        2
#define PORT3        3

/*
*  Get HID Input Report -> InReport
*/

void GetInReport (uint8_t src[], uint32_t length)
{
    uint8_t PCInReportData = 0;
    
              /*                  */
              src[0] = PCInReportData;
}

/*
*  Set HID Output Report <- OutReport
*/
void SetOutReport (uint8_t dst[], uint32_t length)
{
    uint8_t PCOutReportData = dst[0];
}


int main (void)
{
    volatile int n;
    
    HidDevInfo.idVendor = USB_VENDOR_ID;
    HidDevInfo.idProduct = USB_PROD_ID;
    HidDevInfo.bcdDevice = USB_DEVICE;
    HidDevInfo.StrDescPtr = (uint32_t)&USB_StringDescriptor[0];
    HidDevInfo.InReportCount = 1;
    HidDevInfo.OutReportCount = 1;
    HidDevInfo.SampleInterval = 0x20;
    HidDevInfo.InReport = GetInReport;
    HidDevInfo.OutReport = SetOutReport;
    
    DeviceInfo.DevType = USB_DEVICE_CLASS_HUMAN_INTERFACE;
    DeviceInfo.DevDetailPtr = (uint32_t)&HidDevInfo;
        
    
    LPC_SYSCON->SYSAHBCLKCTRL |= (EN_TIMER32_1 | EN_IOCON | EN_USBREG);
    
    (*rom)->pUSBD->init_clk_pins();  

    for (n = 0; n < 75; n++) {};
    
    (*rom)->pUSBD->init(&DeviceInfo);
    (*rom)->pUSBD->connect(TRUE);
    
    while(1);
}

void USBIRQ_IRQHandler(void)
{
  (*rom)->pUSBD->isr();
}
Vitaliy_ARM
Интересно, а кто-нибудь вообще использует HID или MSD на этом процессоре?
GetSmart
Vitaliy_ARM, где разрешение прерываний в майне?

USBIRQ_IRQHandler кто будет вызывать? Даже указателя на него не видно.

Контроллер прерываний разве не надо настраивать?
Vitaliy_ARM
Цитата(GetSmart @ Sep 6 2010, 21:56) *
Vitaliy_ARM, где разрешение прерываний в майне?

USBIRQ_IRQHandler кто будет вызывать? Даже указателя на него не видно.

Контроллер прерываний разве не надо настраивать?


Внизу кода, после функции main, прописан обработчик прерывания USB.
Если я не ошибаюсь, все настройки прерываний и прочего делают функции, зашитые в область памяти USB драйвера.
Это отражено в презентациях NXP и даташите на процессор.
Одну из презентаций приложил. Попробовал встроить также __enable_interrupt() в часть кода, результат все равно тот же: устройство не опознано.
Хотя usb загрузчик работает без проблем.

Код
    (*rom)->pUSBD->init(&DeviceInfo);
    (*rom)->pUSBD->connect(TRUE);
    
    __enable_interrupt();
    
    while(1);
GetSmart
Цитата(Vitaliy_ARM @ Sep 6 2010, 23:24) *
Внизу кода, после функции main, прописан обработчик прерывания USB.

Если речь о USBIRQ_IRQHandler, то в коде не видно ни указателя, ни прямого вызова. Так что его никто не догадается вызвать. И соответственно все прерывания от USB будут недоступны.


Цитата
Если я не ошибаюсь, все настройки прерываний и прочего делают функции, зашитые в область памяти USB драйвера.

Частично ошибаетесь. Пользовательская программа (обычно в cstartup.c) имеет свои вектора IRQ, начиная с адреса 0x40. Так вот, если вектор USB-прерывания пользовательской проги не настроен на USBIRQ_IRQHandler, то работать USB не будет.

Цитата
Хотя usb загрузчик работает без проблем.

Он работает на собственном векторе прерываний, бутовом.

Хм.. У USB оказывается 2 вектора. И возможно оба их нужно инициализировать .

Хотя возможно ещё кое-что. Если работать на бутовом ремапе, то наверное можно как-то работать на бутовых прерываниях (если они это умеют).

ЗЫ. lpc13xx.usb.pdf ещё не прочитал. Где-то мог и ошибиться.
Vitaliy_ARM
Цитата(GetSmart @ Sep 6 2010, 23:12) *
Если речь о USBIRQ_IRQHandler, то в коде не видно ни указателя, ни прямого вызова. Так что его никто не догадается вызвать. И соответственно все прерывания от USB будут недоступны.


Попробую подпаять джитаг. Лучше один раз увидеть smile.gif . Потом отпишусь.
GetSmart
Нашёл такую вот инфу
Код
Memory Restrictions: The rom-based HID drivers use sections 0x10000050 to 0x10000180 of the on-chip RAM, meaning that you will need to configure the linker in your toolchain to avoid this area. Any attempt to use this memory for your own code will almost certainly result in system failure. The project files provided with the LPC1343 Code Base are configure to exclude these chunks of memory from system use, but if you are implementing your own custom project and making use of rom-based HID you will need to make sure the linker is properly configured to avoid this memory range.


Из исходников в сети нашёл только один
http://www.microbuilder.eu/Projects/LPC134...43CodeBase.aspx
http://www.microbuilder.eu/Projects/LPC134...umentation.aspx

Но там вроде как похожий код, тоже без __enable_interrupt().
Только баг бутового (*rom)->pUSBD->init_clk_pins() описан. Точнее полубаг. Ядро начинает работать на 48 МГц, хотя это не обязательно и не всегда удобно.
Vitaliy_ARM
Цитата(GetSmart @ Sep 7 2010, 02:59) *
Нашёл такую вот инфу
Код
Memory Restrictions: The rom-based HID drivers use sections 0x10000050 to 0x10000180 of the on-chip RAM, meaning that you will need to configure the linker in your toolchain to avoid this area. Any attempt to use this memory for your own code will almost certainly result in system failure. The project files provided with the LPC1343 Code Base are configure to exclude these chunks of memory from system use, but if you are implementing your own custom project and making use of rom-based HID you will need to make sure the linker is properly configured to avoid this memory range.


Из исходников в сети нашёл только один
http://www.microbuilder.eu/Projects/LPC134...43CodeBase.aspx
http://www.microbuilder.eu/Projects/LPC134...umentation.aspx

Но там вроде как похожий код, тоже без __enable_interrupt().
Только баг бутового (*rom)->pUSBD->init_clk_pins() описан. Точнее полубаг. Ядро начинает работать на 48 МГц, хотя это не обязательно и не всегда удобно.


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

После отладки своего проекта получил следующее:
Увидел, что в моем проекте не проходит функция (*rom)->pUSBD->init_clk_pins(); Отладчик на ней останавливается. Разбираюсь, в чем может быть дело.
Vitaliy_ARM
Примеры победил. Ошибка была в плате. На вывод USB_VBUS не было подано +5V от разъема. Подал - все заработало! 08.gif
И мышка и виртуальный ком порт. Только драйвер на VCP под виндовс 7 не захотел ставиться.

Мой проект пока не работает. IAR не компилирует обработчик прерывания:
Код
void USBIRQ_IRQHandler(void)
{
  (*rom)->pUSBD->isr();
}


В чем может быть дело?
GetSmart
Дело в том, что не подключен свой или стандартный startup.s

Его можно взять из проекта с примером.

Точнее даже так. В том стартапе, который подключается (ИАРом?) по умолчанию имена обработчиков (в том числе и от USB) могут отличаться. Поэтому варианта два.
1. Узнать имя и изменить своё имя обработчика.
2. Использовать всегда свой стартап и своё имя (любое) обработчика в майне и в стартапе.
Vitaliy_ARM
Цитата(GetSmart @ Sep 9 2010, 17:35) *
Дело в том, что не подключен свой или стандартный startup.s

Его можно взять из проекта с примером.

Точнее даже так. В том стартапе, который подключается (ИАРом?) по умолчанию имена обработчиков (в том числе и от USB) могут отличаться. Поэтому варианта два.
1. Узнать имя и изменить своё имя обработчика.
2. Использовать всегда свой стартап и своё имя (любое) обработчика в майне и в стартапе.


Вариант 1 - ошибка в имени обработчика. Подсмотрел в стартапе rolleyes.gif , заменил на void USB_IRQHandler(void) и все сразу заработало. Спасибо!

В общем мне процессор очень понравился, если бы не мои ошибки, то вообще было бы все замечательно. Аппаратный хид работает как часы.

Всем спасибо за внимание.
igorsk
Ещё подсказка на будущее - при компиляции в С++ режиме стандартные обработчики нужно объявлять как С-функции:

extern "C" void USB_IRQHandler()
{
...
}
Vitaliy_ARM
Цитата(igorsk @ Sep 10 2010, 02:10) *
Ещё подсказка на будущее - при компиляции в С++ режиме стандартные обработчики нужно объявлять как С-функции:

extern "C" void USB_IRQHandler()
{
...
}


Это сделано.

Вопрос такого плана. Может кто имеет опыт работы с HID устройством. Вытаюсь организовать передачу данных от устройства в ПК без потерь. В процессоре в функции GetInReport() стоит счетчикЮ который инкрементируется каждый раз, когда вызывается функция. В проге на ПК делается следующее, в цикле параллельного процесса вызывается постоянно функция ReadFile() и читаются данные из устройства. Иногда наблюдаю пропуски пакетов. Такая задача реализуема или это по другому делается?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.