Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103x
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5, 6
shreck
Цитата(klen @ May 26 2009, 12:12) *
я прально понимаю что прерывание tx complite используете для передергивания выводом порта 485-микруху в режим приема для отпускания шины? Если так то не сильно криминально.

Да, правильно. Про ложку дегтя я написал только потому, что USART у STM'a поддерживает кучу режимов, а RS-485 нет. Как-будто его забыли.
asen
А что конкретно не порадовало в 16 битных таймерах ?? меня интересует больше PWM приложения ????
klen
Цитата(asen @ May 26 2009, 10:40) *
А что конкретно не порадовало в 16 битных таймерах ?? меня интересует больше PWM приложения ????

ну че трудно было счетчик 32 бита сделать... хочу интебалы побольше считать с разрешением получше
klen
сериальный отладочный интерфейсс SWJ-DP

ктонить пробывал это для отладки. всего два провода - выглядит удобно.
что нада для того чтоб ЭТО работо?
KRS
Цитата(klen @ May 28 2009, 13:27) *
сериальный отладочный интерфейсс SWJ-DP

ктонить пробывал это для отладки. всего два провода - выглядит удобно.
что нада для того чтоб ЭТО работо?

Я пробовал, подцеплял к OpenOCD свою железку ( на FT232R)
Удобно. По большому счету это всего лишь другой физический уровень.

У codesourcery есть GdbServer который по SWD работатет через FT2232C
klen
Цитата(KRS @ May 28 2009, 15:42) *
Я пробовал, подцеплял к OpenOCD свою железку ( на FT232R)
Удобно. По большому счету это всего лишь другой физический уровень.

У codesourcery есть GdbServer который по SWD работатет через FT2232C


интересненько.. значит OpenOCD умеет это делать. поидее GDB не знает как физически это происходит и он я думаю тут нипричем. Видимо OpenOCD можно както сказать о том чтоб использоать не 5 проводов JTAG а 2 SWD. Буду пытаться...
с самим контроллером что нада сделать чтоб SWD заработало?
KRS
Цитата(klen @ May 29 2009, 14:57) *
интересненько.. значит OpenOCD умеет это делать. поидее GDB не знает как физически это происходит и он я думаю тут нипричем. Видимо OpenOCD можно както сказать о том чтоб использоать не 5 проводов JTAG а 2 SWD. Буду пытаться...
с самим контроллером что нада сделать чтоб SWD заработало?

Просто так сказать не получися, если только новая версия не поддерживает SWD.
Я просто сильно изменил исходники - переделал файл cortex_swjdp.c
sonycman
Чёрт, возникли проблемы с флагом Busy SPI контроллера в режиме мастера.
Вроде считал, что, пока контроллер занят, этот флаг будет всегда установлен.
А когда передача/приём закончена - сброшен.
По ходу, это не так.
Вот что озвучено в мануале:
BUSY flag
This flag indicates the state of the SPI communication layer. When it is set, it indicates that
the SPI is busy communicating and/or there is a valid data byte in the Tx buffer waiting to be
transmitted. The purpose of this flag is to indicate if there is any communication ongoing on
the SPI bus or not. This flag is set as soon as:
1. Data is written in the SPI_DR register in master mode
2. The SCK clock is present in slave mode
The BUSY flag is reset each time a byte is transmitted/received. This flag is set and cleared
by hardware. It can be monitored to avoid write collision errors. Writing to this flag has no
effect. The BUSY flag is meaningful only when the SPE bit is set.


Я привык, опрашивая этот флаг, определять конец передачи данных. Но, на днях, снизив частоту SPI до пары сотен килогерц, обнаружил, что идёт потеря данных.
Оказывается, это бит сбрасывается после передачи каждого байта! То есть, имея в буфере передатчика байт данных n+1, по окончании передачи из сдвигового регистра байта n, флаг busy на короткое время сбросится в ноль?
Млин, спрашивается, какого ляду? Толку тогда от него? Эх...
klen
Цитата(KRS @ May 29 2009, 15:15) *
Просто так сказать не получися, если только новая версия не поддерживает SWD.
Я просто сильно изменил исходники - переделал файл cortex_swjdp.c


результат в студию или лучше в svn репозиторий OpenOCD
да??
планета должна звать своих героев.
KRS
Цитата(klen @ May 29 2009, 23:23) *
результат в студию или лучше в svn репозиторий OpenOCD
да??
планета должна звать своих героев.

Да я просто раскурочил OpenOcd и прямо заменил функции swjdp ( JTAG access piont) что они напрямую лезут исключительно через мою железку ( и уже по SWD),частично игнорируя иерархию интерфейсов OpenOCD.
Так что в SVN это точно не положить.

К тому же я пользуюсь IAR, а в IAR, как я уже писал, протокол GDB server трактует не правильно, поэтому и с некоторыми версиями OpenOcd не работает. В итоге я написал свой Gdb Server, но для полноценной отладки Cortex в IAR все равно не годится( системные регистры не показывает) нужен RDI.

Дописывать OpenOCD я точно не буду, мне не нравится их стиль кода - по идеологии С++, но написано на С, разломать и втиснуть свое я еще могу, но что бы самомуписать... К тому же там еще надо с автомейком разбираться...

А вот если кто соберется RDI делать, готов поучаствовать.
KostyantynT
Цитата(klen @ May 28 2009, 12:27) *
сериальный отладочный интерфейсс SWJ-DP

ктонить пробывал это для отладки. всего два провода - выглядит удобно.
что нада для того чтоб ЭТО работо?

Под CW замечательно работает, работаю через JetLink. Скорость ниже, чем по JTAG, но особых неудобств не замечал.
sonycman
Хм, только сейчас обратил внимание, что кортексы могут без проблем читать невыровненные данные, как halfword (16 бит)? так и word (32 бита).
Прикольно laughing.gif
MALLOY2
Но команда при этом выполняется дольше!
sonycman
А как сменить приоритет для прераваний без порядкового номера?
К примеру, для SysTick - системного таймера? В таблице указано, что можно менять, но регистры Interrupt Priority Registers начинаются с номера 0, а это Window watchdog interrupt и ниже...
Что-то непонятно как-то sad.gif
KRS
Цитата(sonycman @ Jun 4 2009, 22:44) *
А как сменить приоритет для прераваний без порядкового номера?
К примеру, для SysTick - системного таймера?

Там еще есть
System Handler Priority Registers
3 регистра
sonycman
Цитата(KRS @ Jun 4 2009, 22:57) *
Там еще есть
System Handler Priority Registers
3 регистра

Спасибо большое! smile.gif

В STM у нас всего 16 уровней приоритетов, вроде?
Приходится затачивать его ужасный I2C контроллер под них, так, как в последней эррате советуют... на макс. приоритет...
KRS
Цитата(sonycman @ Jun 4 2009, 23:05) *
В STM у нас всего 16 уровней приоритетов, вроде?

Да, насолько я помню 4 бита используется. Но надо учитывать что старших 4 бита!
Еще надо про PRIGROUP в Application Interrupt and Reset Control Register не забыть.
AHTOXA
Цитата(sonycman @ Jun 5 2009, 00:44) *
А как сменить приоритет для прераваний без порядкового номера?
К примеру, для SysTick - системного таймера? В таблице указано, что можно менять, но регистры Interrupt Priority Registers начинаются с номера 0, а это Window watchdog interrupt и ниже...
Что-то непонятно как-то sad.gif


core_cm3.h:
Код
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, int32_t priority)
{
  if(IRQn < 0) {
    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); }
    /* set Priority for Cortex-M3 System Interrupts */
  else {
    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        
    /* set Priority for device specific Interrupts      */
}


stm32f10x.h:
Код
typedef enum IRQn
{
...
  SysTick_IRQn                = -1,
sonycman
Цитата(AHTOXA @ Jun 4 2009, 23:57) *
core_cm3.h:
[code]static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, int32_t priority)

Спасибо, вроде разобрался. smile.gif
gregory812
Обнаружил странную вещь. При использовании кейловской ОС RL-RTX, если настроить прерывание от ADC1, то запуск первой же ОС функции os_sys_init() приводит к вылету в прерывание HardFaultException() и, соответственно, зависанию процессора.
gregory812
Разобрался. Не учел, что файлы STM32F10x.s (от Keil) и stm32f10x_vector.s (от ST) содержат в себе разные названия функций для обработки прерываний.
miksher
Здравствуйте

Посмотрите пожалуйста пример программки миганием светодиода (не получается помигать)
В чем ошибка?

Код
//********************************************************************************
*****************
//******************* Настойка тактирования процессора ********************************************
//********************************************************************************
*****************
void SetupClock(void)
{
  // 1. включаем внутренний генератор
  RCC_CR_bit.HSION = 1;                   // включаем внутренний генератор
  while(RCC_CR_bit.HSIRDY != 1){}         // ожидаем потверждения включения внутреннего генератора
  // 2. %%%%%%%%%%%% отключаем SYSCLK  %%%%%%%%%%%%%%%%%%%%%%%%%%
  RCC_CFGR_bit.SW = 0;                    // системный clock не выбран
  while(RCC_CFGR_bit.SWS != 0){}          // ожидаем потверждения выключения SYSCLK
  // 3. отключаем внешний генератор
  RCC_CR_bit.HSEON = 0;                   // отключаем внешний генератор
  RCC_CR_bit.HSEBYP = 0;                  // не замыкаем внешний генратор с SYSCLK
  while(RCC_CR_bit.HSERDY != 0){}         // ожидаем потверждения выключения внешнего генератора
  // 4. ******ВЫКЛЮЧАЕМ PLL********
  RCC_CR_bit.PLLON = 0;                   // выключаем PLL
  while(RCC_CR_bit.PLLRDY != 0 ){}         // ожидаем потверждения выключения PLL
  // 5. настаеваем SYSCLK
  RCC_CFGR_bit.PLLSRC = 0;                // HSI (внутренний генератор) выбирается как вход PLL, при этом делится на 2
  RCC_CFGR_bit.PLLXTPRE = 0;              // HSE (внешний генератор) не делится на 2 во вход в PLL
  RCC_CFGR_bit.PLLMUL = 0xA;              // установка умнажителя на 12 (8 МГц -> /2 -> 4 МГц -> *12 -> 48 МГц)
  // 6. ********ВКЛЮЧАЕМ PLL*******
  RCC_CR_bit.PLLON = 1;                   // включаем PLL
  while(RCC_CR_bit.PLLRDY == 0){}         // ожидаем потверждения включения PLL
  
  // 7. настраемаем AHB предделитель
  RCC_CFGR_bit.HPRE = 0x0;                // преддилитель AHB = 1
  // 8. настраемаем APB1 предделитель
  RCC_CFGR_bit.PPRE1 = 0x4;               // преддилитель APB1 = 2
  // 9. настраемаем APB2 предделитель
  RCC_CFGR_bit.PPRE2 = 0x0;               // преддилитель APB2 = 1
  
  RCC_CR_bit.CSSON = 0;                   // отключаем внешний детектор clock
  
  // 12. %%%%%%%%%%%%%%%%%%% включаем SYSCLK %%%%%%%%%%%%%%%%%%%%%
  RCC_CFGR_bit.SW = 2;                    // PLL как системный clock
  while(RCC_CFGR_bit.SWS != 2){}          // ожидаем потверждения включения SYSCLK
}
//********************************************************************************
*****************

//********************************************************************************
*****************
//******************* Инициализация порта D *******************************************************
//********************************************************************************
*****************
void PortDInit(void)
{
  RCC_APB2ENR_bit.IOPDEN = 1;             // включаем clock к GPIOA
  RCC_APB2RSTR_bit.IOPDRST = 1;           // сброс GPIOA
  
  GPIOD_BRR_bit.BR2 = 1;                  // сброс PD2
  GPIOD_CRL_bit.MODE2 = 3;                // Output mode, max speed 50 MHz.
  GPIOD_CRL_bit.CNF2 = 0;                 // output Push-pull
  GPIOD_ODR_bit.ODR2 = 0;                 // output Push-pull
}


затем в main()
Код
while(1)
  {
    GPIOD_BRR_bit.BR2 = 1;
    myDelay(3000000);
    GPIOD_BSRR_bit.BS2 = 1;
    myDelay(3000000);
  }


Может кто-нибудь поможет с примером программы мигания светодиода
Мой микроконтроллер: STM32F103xxE, LQFP64, светодиод на 54 ноге (порт D, 2-ой пин)
Внешнего генератора нет использую внутренний

Пример программы в прикрепленном архиве
Dog Pawlowa
Цитата(miksher @ Jun 13 2009, 11:16) *
Может кто-нибудь поможет с примером программы мигания светодиода

Бог (IAR) подаст :-)
Посмотрите проекты для Олимексовского старт-кита, там 16 светодиодов на плате, и моргают все!
sonycman
Мужики, подскажите, кто работал с USB данных чипов.
Начал с ним разбираться - в первый раз. rolleyes.gif

Мой девайс будет питаться от своего источника.
Что произойдёт, если устройство не запитано, но производится его подключение кабелем к PC?
Не будет ли напряжение с порта пытаться запитать контроллер через защитные диоды портов? (так как обычно сигнал с порта USB +5v подаётся на порт контроллера для детектирования подключенного кабеля...)

Какова правильная схемотехника для данного случая?
sonycman
Кажися, я нашёл потенциальный глюк в фирменной ST-шной библиотеке USB-FS-Device development kit v3.0.1.
Это касается модификации регистров конечных точек USB_EPnR.

Регистры выглядят так:
Нажмите для просмотра прикрепленного файла
Мягко говоря, весьма поганый набор битов с различными режимами доступа - и обычные rw, и read_only_cleared_by _writing_zero (rc_w0), и даже toggle биты, меняющие своё состояние только при записи единички...

Так вот, процедуры модификации полей TYPE и STAT работают очень просто - читают регистр, затем маскируют (AND) биты, требующие модификации и toggle биты (оставляя без изменения остальные rw и rc_w0 биты).
Затем записывают по OR нужное значение и всё это дело пишется обратно в регистр.
Вот код:
Код
#define _GetENDPOINT(bEpNum)        ((uint16_t)(*(EP0REG + bEpNum)))

#define _SetENDPOINT(bEpNum,wRegValue)  (*(EP0REG + bEpNum)= \
    (uint16_t)wRegValue)

#define EPREG_MASK     (EP_CTR_RX|EP_SETUP|EP_T_FIELD|EP_KIND|EP_CTR_TX|EPADDR_FIELD)

#define EPTX_DTOGMASK  ( 0x0030 | EPREG_MASK)

#define _SetEPTxStatus(bEpNum,wState) {\
    register uint16_t _wRegVal;       \
    _wRegVal = _GetENDPOINT(bEpNum) & EPTX_DTOGMASK;\
    /* toggle first bit ? */     \
    if((EPTX_DTOG1 & wState)!= 0)      \
      _wRegVal ^= EPTX_DTOG1;        \
    /* toggle second bit ?  */         \
    if((EPTX_DTOG2 & wState)!= 0)      \
      _wRegVal ^= EPTX_DTOG2;        \
    _SetENDPOINT(bEpNum, _wRegVal);    \
  } /* _SetEPTxStatus */


void SetEPTxStatus(uint8_t bEpNum, uint16_t wState)
{
  _SetEPTxStatus(bEpNum, wState);
}


Но! Ведь таким "макаром" можно стереть rc_w0 бит, в случае, если он был установлен железом в момент между чтением и записью регистра!
То есть читаем такоой бит как "0", затем записываем его, естественно, тоже как "0", тем самым перезаписывая новое его значение!

По идее, если я правильно понял, после маскирования биты rc_w0 надо ещё и принудительно устанавливать в "1", чтобы при записи гарантированно не потерять момент изменения состояния...

Странно, почему у фирмачей не так? laughing.gif

Вот даже мануал говорит, что:
Цитата
Read-modify-write cycles on these registers should be avoided because between the read
and the write operations some bits could be set by the hardware and the next write would
modify them before the CPU has the time to detect the change. For this purpose, all bits
affected by this problem have an ‘invariant’ value that must be used whenever their
modification is not required. It is recommended to modify these registers with a load
instruction where all the bits, which can be modified only by the hardware, are written with
their ‘invariant’ value.

Так почему же это не выполняется?
Serj78
Кто-нибудь изучал, как ведут себя контроллеры STM32F103xxx при перегрузке выходов по току?

Если вывод на 100 ом нагрузить(защитные сопротивления) - это не страшно?
sonycman
Ммм, ковыряюсь в ST-шном примере USB Mass Storage.
В коде не увидел обработки битов синхронизации (DTOG_TX и DTOG_RX) для нулевого канала.
Ну я могу ещё допустить, что они сбрасываются автоматически при приёме SETUP и сами переключаются на последующих пакетах данных.
Но как же быть с последним, подтверждающим пакетом, где эти биты всегда должны быть в единичке? Не думаю, что и эта ситуация может быть автоматически обработана контроллером, так как он не сможет предсказать, какой именно пакет будет последним...

Эх, кажется, намучаюсь я ещё с этим примерчиком... laughing.gif
zksystem
Цитата(sonycman @ Jun 17 2009, 12:18) *
Мужики, подскажите, кто работал с USB данных чипов.
Начал с ним разбираться - в первый раз. rolleyes.gif

Мой девайс будет питаться от своего источника.
Что произойдёт, если устройство не запитано, но производится его подключение кабелем к PC?
Не будет ли напряжение с порта пытаться запитать контроллер через защитные диоды портов? (так как обычно сигнал с порта USB +5v подаётся на порт контроллера для детектирования подключенного кабеля...)

Какова правильная схемотехника для данного случая?

если Ваш девайс имеет собственное питание, то в этом случае ИМХО просто пренебречь линией +5В от USB, использовать ее как факт подключения к USB.
Axel
Цитата(zksystem @ Jun 24 2009, 06:46) *
... просто пренебречь линией +5В от USB, использовать ее как факт подключения к USB.


Именно в этом случае и может возникнуть нежелаемый эффект. Если Вы не хотите питать Ваш девайс от USB, имеет смысл контролировать +5V через буфер, напр. полевик.
sonycman
Да, тоже остановился на буфере из транзисторов/полевике, чтобы не допустить прямой подачи +Uusb на контроллер.
Ну а линии D+ и D- - с ними не надо заморачиваться? Надеюсь, на них нет никаких диодов?
Axel
Не надо.
sonycman
Цитата(Axel @ Jun 24 2009, 12:54) *
Не надо.

Спасибо!
Хотя в некоторых схемах для защиты используется блок диодов (U4 на схеме):
Нажмите для просмотра прикрепленного файла

От него также придётся отказаться, в случае self-powered девайса... sad.gif

ЗЫ: а-а, так ведь изначально на пинах D+\- нет напряжения? Шина в состоянии сброса?
Axel
Цитата(sonycman @ Jun 24 2009, 12:03) *
От него также придётся отказаться, в случае self-powered девайса...


Можно не отказываться, а использовать USB-шные 5V вместо 3.3. Вообще-то эта хрень нужна только для прохождения тестов, а по жизни - вполне можно и без нее (я использую...).
sonycman
Подскажите, пожалуйста, насчёт двойной буферизации USB конечных точек для STM32.
Мануал по этому поводу (RM0008, последняя июньская версия) пестрит ошибками и отсутствующей информацией.

Например, не указано, где именно находятся регистры указателей на буфера - ADDRn_TX_0, ADDRn_TX_1, ADDRn_RX_0, ADDRn_RX_1.
Также мануал утверждает, что счётчики количества данных COUNTn_TX_0 и COUNTn_TX_1 находятся в одном 32-ух битном регистре, тогда как библиотека STM32_USB-FS-Device_Lib_V3.0.1 юзает два разных 16-ти битных регистра...

И ещё - как правильно переключать буфера с одного на другой? Достаточно ли просто переключить бит DTOG или надо ещё и статус EP поставить в VALID?

Может, есть какие-то примеры реализации bulk double buffering endpoints?

Не понял про STALL для буферизованных EP, вычитал в UM0424 User manual:
Double buffer STATUS
The simple and double buffer modes use the same functions to manage the
Endpoint STATUS except for the STALL status for double buffer mode. This
functionality is managed by the function: SetDouBleBuffEPStall();

Вот код:
Код
void SetDouBleBuffEPStall(uint8_t bEpNum, uint8_t bDir)
{
  uint16_t Endpoint_DTOG_Status;
  Endpoint_DTOG_Status = GetENDPOINT(bEpNum);
  if (bDir == EP_DBUF_OUT)
  { /* OUT double buffered endpoint */
    _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPRX_DTOG1);
  }
  else if (bDir == EP_DBUF_IN)
  { /* IN double buffered endpoint */
    _SetENDPOINT(bEpNum, Endpoint_DTOG_Status & ~EPTX_DTOG1);
  }
}

Как видно, от обычной функции установки статуса она отличается отсутствием маскирования toggle битов, в результате чего все они будут сброшены.
И что, в этом был весь сокровенный смысл этой "необычной" функции??

Причём в референсном мануале про отличия установки STALL между буферизованными и нет bulk EP нет вообще ничего!
rolleyes.gif

Из-за отсутствия этой информации у меня возникают нехорошие сомнения в качестве кода USB библиотеки для STM32.

К примеру, вышеприведённый код пытается установить два бита статуса в состояние STALL (01) путём сброса только одного бита.
Это у него получится только при условии, что он был перед этим в состоянии 1, то есть VALID.
А если статус был NAK (10), то вместо STALL получится DISABLED (00). sad.gif

Блин, запарили эти индейцы своими библиотеками.
Вместо того, чтобы нормально объяснить механизм, впаривают тут всякое...

ЗЫ: форум на st.com вообще умер, ответа от спецов не дождёшься, одни только вопросы...
sonycman
Вроде разобрался немного с двойной буферизацией EP.
Пришлось смотреть, как всё это работает по коду USB библиотеки от ST, так как мануал действительно откровенно врёт и недоговаривает по поводу размещения регистров буферов.

Скоро доделаю свой Mass Storage девайс (на SD карте в режиме SPI и Full Speed обмен c PC).
Со скоростями в режиме чтения прикольно получается.
Сначала было около 520 KB\sec (последовательное чтение - получили запрос - прочитали - отдали данные).
Потом 820 KB\sec (параллельное считывание с карты во время передачи данных из буфера).
С добавлением двойной буферизации стало ~950 KB\sec.

Интересно, это потолок для Full Speed, или можно ещё быстрее сделать на STM32?
Вроде теоретический потолок ~1200 KB\sec, но ведь MSC протоколу ещё надо команды и ответ на них передавать...

С другой стороны, может "притормаживать" и карта памяти (SPI), хотя в режиме непрерывного чтения она способна отдавать ~1300 KB\sec данных...
sonycman
Поднял частоту SPI, на котором сидит карта памяти, до 18 МГц.
Результаты те же - чтение до 950 килобайт\сек., запись - до 800 к\сек.
Видимо, уже упёрся в USB...
Ладно, заоблачных скоростей от FS явно не получить, да и не надо пока...

Что прикольно - увеличение размера внутреннего буфера чтения\записи приводит к росту скорости записи, а скорось чтения наоборот, незначительно падает laughing.gif
alexvm
TE-STM32F103RE - «Махаон» вопрос по работе с SDIO

Работаю с этим модулем вторую неделю, пробовал примеры из
STM32F10xFWLib - V2.0.3 Patch1 c MT-Link-6 JTAG/SWD.
(Boot в соответствии с RM0008 - Reference manual rev.9 стр.48)

Интересует работа модуля SDIO с FWLib от ST.
Я немного доработал main.c для определения наличия карты и подачи питания + индикация светодиодами о результатах теста microSD.
С картами не SDHC проблем нет, но с SDHC (Kingston microSD 4 и 8 Gb)
библиотечная софтина работает нормально только при подключенном JTAG или
SWD из под IAR 5.3 (boot - Main Flash memory, SDIO_BusWide_4b).
По сбросу (без JTAG или SWD) тест проходит только с картами не SDHC типа.

На http://www.terraelectronica.ru/board/index...hl=te-stm32f103 пока вопрос не решён.
На буржуйском ST форуме поднималась похожая проблема но там обходились с SDIO_BusWide_1b.

Может кто нибудь повторить пример на терровской или другой плате с SDIO_BusWide_4b
(STM32F10xFWLib - V2.0.3 with Patch1\FWLib\examples\SDIO) для SDHC и сообщить о результатах?
khach
Кому-нибудь попадались ссылки на дешевые демоплаты STM32 с интегрированными силовыми цепями для управления моторами? Интересуют как щеточные, так и безщеточные и АС сервы.
Что то по типу линейки Luminary http://www.luminarymicro.com/products/rdk_bldc.html и http://www.luminarymicro.com/products/rdk_bdc.html. Кстати, никто не знает случайно в каком формате luminary дает проекты своих плат? А то схема в Альтиуме отдается свободно, а файл с расширением pcb открыть невозможно. Чтобы не было оффтопом- хотел использовать проекты luminary в качестве "рыбы" для STM32.
klen
2_alexvm

у меня махаон заработал в 4битном режиме SDIO
флешка Transcent 4Gb MMAGRO4GUDCA-DB, 6 класс, SDHC

скорость 1 мегабайт запись, >5 чтение. если померил правильно ( 1 гиг зщаписи чтения мерял на время) .
исходник из FirmWare не заработал сразу.
косяк с таймером SDIO был. зависало нафиг все.
тоже добавил детектирование карты.


вопрос зЮбрам smile.gif

нашел косяг в GCC для Corterx'ов
не вдаваясь в подробности ситуация такая что вижу косяг но не могу понять как исправить. я думал что знаю как работают инструкции ITxxx COND

оказалось не понимаю.. sad.gif

в доке написано что суфикс IT определяем исполнятся или нет инструкции соответствующей суфиксу в соответствии с COND условием.
если условие не выполнено то просто проталкивается NOP и типа это дает фиксирование время прохода и линию на конвеере.
но... сами иструкции условные сами по себе. и ъто можно суфиксами инструкций сделать тоже самое (кстате компиллер их всерано требует для блока IT)
они также в NOP превращаются
а где сокровенный смысл и разница?

оъясните. туплю .....устал топорщить мозговоую кость.
sonycman
Дело в том, что инструкции THUMB2, в отличие от ARM, не могут быть условными.
То есть могут, но не все.
Эта фича (IT) позволяет абсолютно все инструкции юзать как условные.
По крайней мере я так понимаю.
alexvm
TE-STM32F103RE - «Махаон» работа с SDIO.
Проблема в работе с некоторыми SDНС картами оказалась в несоблюдении
в данной версии_1.00 платы SD Memory Card Hardware Interface
(отсутствуют 5 подтягивающих резисторов).
В STM3210E-EVAL evaluation board (UM0488) на SDIO они установлены (и на SWJ тоже).

Про Hi-Z state: ST - RM0008, Rev 9, стр.464-467.
(If the CPSM is not in the Send state, the SDIO_CMD output is in the Hi-Z state,
as shown in Figure 187 on page 464.
Idle: the data path is inactive, and the SDIO_D[7:0] outputs are in Hi-Z.)
Для поддержания Hi-Z состояния выводы порта должны быть сконфигурированны в Open Drain Mode,
и тогда наличие подтягивающих резисторов на линии передачи оправдано,
но в данном случае все выводы SDIO сконфигурированны в FWLib в Push-Pull Mode (кроме SDCard_Detect)
и в процессе работы конфигурация не меняется, т.е. вроде никакого Hi-Z state быть
не должно, если только вывод не вырубается автоматом аппаратно.
Однако добавление 5 подтягивающих резисторов решает проблему работы с некоторыми SDHC картами.

Причём в режиме отладки c SWJ-DP всё работало и без этих резисторов, поэтому пришлось вылавливать косяки
через HyperTerminal.
Без подтягивающих резисторов карта сначала не проходила инициализацию в SD_PowerON() - вываливалась с
SD_COM_CRC_FAILED после CMD55 (добавление повторов команды эту проблему решало),
но дальше всё висло в SD_EnableWideBusOperation(SDIO_BusWide_4b)--> SDEnWideBus(ENABLE)-->
FindSCR(RCA, scr)--> в цикле:
Код
while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
  {
    if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
    {
      *(tempscr + index) = SDIO_ReadData();
      index++;
    }
  }

Вариации на тему изменения рабочей частоты, фазы синхронизации, TIMEOUT и SDIO_Wait результата не давали.

Ниже приведён пример листинга HyperTerminal рабочей программы SDIO для терровского махаона
и файл main.c который можно установить взамен библиотечного из FWLib-V2.0.3.
(в файле sdcard.c в cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024; убрать *1024, чтобы не было переполнения)
В опциях препроцессора указать EMB_FLASH взамен VECT_TAB_FLASH для загрузки во flash.

Нажмите для просмотра прикрепленного файла

SDIO DEBUG:

SD Init
SD_GetCardInfo:
CardType = SDIO_HIGH_CAPACITY_SD_CARD
CSD Version 2.0
CardCapacity = 7600 Mb
CardBlockSize = 512 byte
CardComdClasses = 5
MaxBusClkFrec = 25 MHz

SD SelectDeselect
EnableWideBusOperation
Erase
Set Transfer Mode
ReadMultiBlocks
Compare the buffer with zero
Write block of 512 bytes on address 0
Read block of 512 bytes from address 0
Check the correctness of written data
TransferStatus1 = 1
Write multiple block of many bytes on address 0
Read block of many bytes from address 0
Check the correctness of written data
TransferStatus2 = 1
Status = 42_SD_OK

Остаётся однако совершенно непонятным вопрос - почему без подтягивающих резисторов на SDIO
в режиме отладки из под IAR_5.3 всё выполнялось отлично и по шагам и в реалтайме..... wacko.gif
sherr
Цитата
Недавно купили кит EKI-LM3S6965 Ethernet Evaluation Kit for IAR Embedded Workbench
от Stellaris
так вот на нем интегрирован JTAG в виде FTDI2232C, и есть фича при удерживании reset при включекнии он может работать наружу, пробовал подключать его к ARM7 но IAR пишет что LMFTDI поддерживает только Cortex-M3, похоже можно любой cortex подключить


Извиняюсь, что немного не по теме --- есть плата с LP2478, которую надо отлаживать и есть плата EKI-LM3S1968 c
вышеупомянутой отладкой -- так вот-- есть ли вариант их подружить?
alexvm
Проверил сейчас работу SDIO c DosFS на махаоне SDIO_DosFS_V02 - вроде всё пашет и с SDHC smile.gif
Но как то больше efsl + SPI раньше использовал.
А делал ли кто-нибудь порт ST_SDIO под efsl или fatfs?
klen
Цитата(alexvm @ Aug 24 2009, 14:20) *
Проверил сейчас работу SDIO c DosFS на махаоне SDIO_DosFS_V02 - вроде всё пашет и с SDHC smile.gif
Но как то больше efsl + SPI раньше использовал.
А делал ли кто-нибудь порт ST_SDIO под efsl или fatfs?


у меня fatfs на SDHC c махаоном работает.
MasterAlexei
Приветствую!
Программлю SPI на STM32F103RBT6. До этого сделал SPI в режиме SLAVE через прерывания, все работало прекрасно. Решил переключить в MASTER, так как только NVIC настраиваю, так он падает в SPI прерывание и там и остается на всю оставшуюся жисть до ресета. Причем в прерывании выставленны как RX так и TX флаги, типа он и принял чего то и послал чего то.
Пины все выставил вроде как правильно. NSS пин выставил в Софт-режим. На сам пин вроде вывел 1.

По идее, проц даже и не должен попадать в прерывание, как только проинициализируешь СПИ переферию.
А он даже не вылазит от туда.

Ни у кого такого не было случаем?
sonycman
Цитата(MasterAlexei @ Dec 7 2009, 17:42) *
По идее, проц даже и не должен попадать в прерывание, как только проинициализируешь СПИ переферию.
А он даже не вылазит от туда.

А какие прерывания от SPI вы разрешили?

К примеру, при установке бита TXEIE регистра SPI_CR2 (разрешении прерывания Tx buffer empty) и пустом буфере передатчика оно будет сгенерировано немедленно.
MasterAlexei
Цитата(sonycman @ Dec 7 2009, 16:24) *
А какие прерывания от SPI вы разрешили?

К примеру, при установке бита TXEIE регистра SPI_CR2 (разрешении прерывания Tx buffer empty) и пустом буфере передатчика оно будет сгенерировано немедленно.

У меня разрешены TXE и RXNE прерывания. Но ведь я же еще ничего не записывал в TX буфер. На других контроллерах (например AVR от Амел) оно так и работает: пока ничего не запишешь, никаких прерываний не будет. А тут с какого испугу пришло прерывание, если в переферию ничего не писали?
Может я через полчаса только записать чего нить захочу туда.
sonycman
Цитата(MasterAlexei @ Dec 7 2009, 20:21) *
У меня разрешены TXE и RXNE прерывания. Но ведь я же еще ничего не записывал в TX буфер. На других контроллерах (например AVR от Амел) оно так и работает: пока ничего не запишешь, никаких прерываний не будет. А тут с какого испугу пришло прерывание, если в переферию ничего не писали?
Может я через полчаса только записать чего нить захочу туда.

Ну здрасте rolleyes.gif
При чём тут запишешь незапишешь?
TXE что значит? Буфер передатчика пуст. При старте SPI передачтик пуст? Пуст. Разрешили прерывание - получите и распишитесь.

Пересели на другой камень - приготовтесь к тому, что он будет работать по другому smile.gif

ЗЫ: запрещайте прерывание TXE в обработчике, если больше нечего передавать.
MasterAlexei
Цитата(sonycman @ Dec 7 2009, 19:35) *
Ну здрасте rolleyes.gif
При чём тут запишешь незапишешь?
TXE что значит? Буфер передатчика пуст. При старте SPI передачтик пуст? Пуст. Разрешили прерывание - получите и распишитесь.

Пересели на другой камень - приготовтесь к тому, что он будет работать по другому smile.gif

ЗЫ: запрещайте прерывание TXE в обработчике, если больше нечего передавать.

Да я собственно не переносил, а делал по аналогии. Видимо придется так и делать - прерывание разрешать именно при непосредственной передаче.

Но тогда возникает логичный вопрос - почему в режиме SLAVE при абсолютно одинаковой инициализации всех прерываний такого не происходит?
Там я тоже оба прерывания разрешаю.
MasterAlexei
Цитата(cebotor @ Jan 15 2009, 12:22) *
сброс pending бита NVIC происходит сразу по входу в прерывания , во всех типах прерывания(механизм общий аппаратно). Но в EXTI источник прерывания не сбрасывается при сбросе пендинг бита(вручную), и получается как раз такой механизм как вы описали - вы сбрасываете источник , но после этого нужно сбросить и пендинг бит который только что выставился .
теперь домыслы которые подкреплены прочитанным на форуме арма:
Все это "вокруг" того чтобы не потерять последнее состояние входа. Во первых разработчикам камня упрощается жизнь в том что не надо реагировать на короткие пики (с момента выставления источника до момента его сброса как минимум пройдет время входа в прерывание). А во вторых для разработчика ПО эффект задумывался как раз противоположный наблюдаемому Вами : вы видите два входа в обработчик вместо одного , а можно видеть один вместо двух. Разположив сброс источника после чтения статуса входа не пропустим его последнее состояние, но дополнительного вызова прерывания не будет.

мне надо было организовать неограниченную вложенность прерываний самих в себяк примеру так
Код
systick_ISR
{...  
       systick_ISR
       {...  
             systick_ISR
             {
             }...
       }...
}

и друг в друга .
Выяснилось что манипулируя приоритетами это сделать не возможно в данном ядре.
NVIC постоянно проверяет приоритет прерывания которое пытается исполниться и текущий системный приоритет. Если мы в обработчике прерывания, то этот приоритет он берет из таблицы описателей прерываний. и получается, что меняя приоритет прерывания находясь в нем мы меняем оба числа и слева от знака неравенства и справа.
для верности я попробовал использовать пустой слот прерывания - выставлять ему приоритет наивысший , вызывать его искуственно , и выставлять низший приоритет... и получил хард фаулт эксепшн неизвестной природы, который мне не смогли объяснить в сапорте ST.
Так что без асм враппера не удалось обойтись. Кстати , если у кого есть сакральные знания на эту тему - прошу меня поправить.

А можно поинтересоваться, на сколько сложным оказался враппер? Можно ли глянуть на него. Не то, чтобы мы его будем применять, но надо одному утырку доказать, что именно эта схема, которая приведена в вашем посте про вложенные прерывания - не работает. Картинка с осциллографа его почему-то не устраивает, и он говорит, что оно должно работать, хотя я наблюдаю именно то, что прерывание само себя прервать не может, и, собственно, не прерывает, а просто висит.
Он придумал тут систему шедулера и активно ее проталкивает. Правда все задачи у него запускаются как раз из systick таймера. Это систик таймер настроен на 1 милисекунду, и есть задачи - 1 мс, 10 мс. Причем он утверждает, что задачи в 10 мс могут и выполняться все 10 мс. и что те задачи, что в 1 мс тоже будут запускаться, прерывая 10милисекундные задачи. Но вот каким образом, если все эти задачи стартуют именно ИЗ обработчика систик.
Я состряпал простенький тест, который симулирует такое поведение. И благополучно завесил весь контроллер.

Если не затруднит, можно глянуть на враппер?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.