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

Там еще есть

System Handler Priority Registers

3 регистра

Спасибо большое! :)

 

В STM у нас всего 16 уровней приоритетов, вроде?

Приходится затачивать его ужасный I2C контроллер под них, так, как в последней эррате советуют... на макс. приоритет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В STM у нас всего 16 уровней приоритетов, вроде?

Да, насолько я помню 4 бита используется. Но надо учитывать что старших 4 бита!

Еще надо про PRIGROUP в Application Interrupt and Reset Control Register не забыть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как сменить приоритет для прераваний без порядкового номера?

К примеру, для SysTick - системного таймера? В таблице указано, что можно менять, но регистры Interrupt Priority Registers начинаются с номера 0, а это Window watchdog interrupt и ниже...

Что-то непонятно как-то :(

 

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,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

core_cm3.h:

static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, int32_t priority)

Спасибо, вроде разобрался. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обнаружил странную вещь. При использовании кейловской ОС RL-RTX, если настроить прерывание от ADC1, то запуск первой же ОС функции os_sys_init() приводит к вылету в прерывание HardFaultException() и, соответственно, зависанию процессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался. Не учел, что файлы STM32F10x.s (от Keil) и stm32f10x_vector.s (от ST) содержат в себе разные названия функций для обработки прерываний.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте

 

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

В чем ошибка?

 

//********************************************************************************
*****************
//******************* Настойка тактирования процессора ********************************************
//********************************************************************************
*****************
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-ой пин)

Внешнего генератора нет использую внутренний

 

Пример программы в прикрепленном архиве

stm.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто-нибудь поможет с примером программы мигания светодиода

Бог (IAR) подаст :-)

Посмотрите проекты для Олимексовского старт-кита, там 16 светодиодов на плате, и моргают все!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мужики, подскажите, кто работал с USB данных чипов.

Начал с ним разбираться - в первый раз. :rolleyes:

 

Мой девайс будет питаться от своего источника.

Что произойдёт, если устройство не запитано, но производится его подключение кабелем к PC?

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Это касается модификации регистров конечных точек USB_EPnR.

 

Регистры выглядят так:

post-19695-1245332449_thumb.png

Мягко говоря, весьма поганый набор битов с различными режимами доступа - и обычные 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:

 

Вот даже мануал говорит, что:

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.

Так почему же это не выполняется?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Если вывод на 100 ом нагрузить(защитные сопротивления) - это не страшно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ммм, ковыряюсь в ST-шном примере USB Mass Storage.

В коде не увидел обработки битов синхронизации (DTOG_TX и DTOG_RX) для нулевого канала.

Ну я могу ещё допустить, что они сбрасываются автоматически при приёме SETUP и сами переключаются на последующих пакетах данных.

Но как же быть с последним, подтверждающим пакетом, где эти биты всегда должны быть в единичке? Не думаю, что и эта ситуация может быть автоматически обработана контроллером, так как он не сможет предсказать, какой именно пакет будет последним...

 

Эх, кажется, намучаюсь я ещё с этим примерчиком... :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мужики, подскажите, кто работал с USB данных чипов.

Начал с ним разбираться - в первый раз. :rolleyes:

 

Мой девайс будет питаться от своего источника.

Что произойдёт, если устройство не запитано, но производится его подключение кабелем к PC?

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

 

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

если Ваш девайс имеет собственное питание, то в этом случае ИМХО просто пренебречь линией +5В от USB, использовать ее как факт подключения к USB.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... просто пренебречь линией +5В от USB, использовать ее как факт подключения к USB.

 

Именно в этом случае и может возникнуть нежелаемый эффект. Если Вы не хотите питать Ваш девайс от USB, имеет смысл контролировать +5V через буфер, напр. полевик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, тоже остановился на буфере из транзисторов/полевике, чтобы не допустить прямой подачи +Uusb на контроллер.

Ну а линии D+ и D- - с ними не надо заморачиваться? Надеюсь, на них нет никаких диодов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...