реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103, Альтернатива библиотеки производителя
KSN
сообщение May 6 2009, 09:58
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Достаточно много проектов сделано на ATmele(AVR,ARM) и как-то привык к startup, low_level_init и стилю, как там все организовано и описывается. Решил попробовать STM32. Поглядел примерчики под IAR. Все как-то необычно. Хотел бы услышать мнения и отзывы людей. которые используют STM32+IAR: используете ли функции/макросы (настройка таблицы векторов, настройка переферии и т.п.), которые есть примерах для IAR? Адаптируете их под себя(как удобней, как привыкли)? Создаете свои функции/макросы или где-то есть альтернатива?
Go to the top of the page
 
+Quote Post
KRS
сообщение May 6 2009, 11:54
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Так у IAR для STM32 есть include в обычном для IAR формате!
и startup у них и для cortex обычный с low_level_init

Библиотеки полезно посмотреть, если что то в даташите не понятно и/или не работает. Но использовать эту библиотеку, лично мне, как то не захотелось.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 6 2009, 12:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(KSN @ May 6 2009, 12:58) *
Создаете свои функции/макросы или где-то есть альтернатива?

Речь идет о примерах ИАР или примерах библиотеки STM?
Библиотека в примерах ИАР безнадежно устарела, регулярно обновляемся с сайта STM.

Если нет проблемы с временем выполнения, использую стандартные функции из библиотеки.
Пробовал создавать свои макросы для PIO - все работает на ура.
В более сложные узлы не лазил, потому что есть мнение, что в библиотеке учтены work arround к errata, а заново копаться в этом всем желания нет.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение May 6 2009, 13:34
Сообщение #4


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



ST библиотеки не использую категорически! после просмотра кода.....
Для STM сделал свой хедер к периферии, библиотек особо не создаю, по ходу работы делаю отдельные драйверки под используемую переферию, дальше они кочуют по проектам.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 10 2009, 13:50
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Dog Pawlowa @ May 6 2009, 16:45) *
В более сложные узлы не лазил, потому что есть мнение, что в библиотеке учтены work arround к errata, а заново копаться в этом всем желания нет.

Есть ещё и другое мнение: используя чужую библиотеку, Вы добавляете к своим багам баги этой библиотеки.
У меня библиотеки от ST почему-то вызывают отторжение. Причины скорее эстетические: стиль их кода не нравится. К тому же не вижу, чем библиотека может жизнь облегчить: руководство на чип всё равно читать нужно.
Go to the top of the page
 
+Quote Post
KSN
сообщение May 28 2009, 08:03
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



подкиньте примерчик написания функции прерывания для STM32. Что-то я не нашел *.h файла в папке IAR, где-бы определялись адреса векторов прерываний.
Go to the top of the page
 
+Quote Post
KRS
сообщение May 28 2009, 09:00
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(KSN @ May 28 2009, 12:03) *
подкиньте примерчик написания функции прерывания для STM32. Что-то я не нашел *.h файла в папке IAR, где-бы определялись адреса векторов прерываний.

Для кортекса обработчик - обычная С функция. Надо только указатель на нее в векторе прерывания разместиь
Go to the top of the page
 
+Quote Post
miksher
сообщение Jun 10 2009, 10:56
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 64
Регистрация: 27-02-08
Из: Россия, Алтайский край, г.Баранул, Павловский тракт 283
Пользователь №: 35 418



Цитата(KRS @ May 28 2009, 16:00) *
Для кортекса обработчик - обычная С функция. Надо только указатель на нее в векторе прерывания разместиь

Здравствуйте.
Посмотрите пожалуйста для Таймера 1 будет работать прерывание по вектору TIM1_UP_IRQHandler.
Код
#pragma language=extended
#pragma segment="CSTACK"

void __iar_program_start( void );

#pragma location = ".intvec"
/* STM32F10x Vector Table entries */
const intvec_elem __vector_table[] =
{
  { .__ptr = __sfe( "CSTACK" ) },         //0
  __iar_program_start,                    //1
  0,//NMIException,                       //2
  0,//HardFaultException,                 //3
  0,//MemManageException,                 //4
  0,//BusFaultException,                  //5
  0,//UsageFaultException,                //6
  0, 0, 0, 0,        /* Reserved */
  0,//SVCHandler,                         //11
  0,//DebugMonitor,                       //12
  0,                 /* Reserved */
  0,//PendSVC,                            //14
  0,//SysTickHandler,                     //15
  0,//WWDG_IRQHandler,                    //16
  0,//PVD_IRQHandler,                     //17
  0,//TAMPER_IRQHandler,                  //18
  0,//RTC_IRQHandler,                     //19
  0,//FLASH_IRQHandler,                   //20
  0,//RCC_IRQHandler,                     //21
  0,//EXTI0_IRQHandler,                   //22
  0,//EXTI1_IRQHandler,                   //23
  0,//EXTI2_IRQHandler,                   //24
  0,//EXTI3_IRQHandler,                   //25
  0,//EXTI4_IRQHandler,                   //26
  0,//DMAChannel1_IRQHandler,             //27
  0,//DMAChannel2_IRQHandler,             //28
  0,//DMAChannel3_IRQHandler,             //29
  0,//DMAChannel4_IRQHandler,             //30
  0,//DMAChannel5_IRQHandler,             //31
  0,//DMAChannel6_IRQHandler,             //32
  0,//DMAChannel7_IRQHandler,             //33
  0,//ADC_IRQHandler,                     //34
  0,//USB_HP_CAN_TX_IRQHandler,           //35
  0,//USB_LP_CAN_RX0_IRQHandler,          //36
  0,//CAN_RX1_IRQHandler,                 //37
  0,//CAN_SCE_IRQHandler,                 //38
  0,//EXTI9_5_IRQHandler,                 //39
  0,//TIM1_BRK_IRQHandler,                //40
  TIM1_UP_IRQHandler,                 //41
  0,//TIM1_TRG_COM_IRQHandler,            //42
  0,//TIM1_CC_IRQHandler,                 //43
  0,//TIM2_IRQHandler,                    //44
  0,//TIM3_IRQHandler,                    //45
  0,//TIM4_IRQHandler,                    //46
  0,//I2C1_EV_IRQHandler,                 //47
  0,//I2C1_ER_IRQHandler,                 //48
  0,//I2C2_EV_IRQHandler,                 //49
  0,//I2C2_ER_IRQHandler,                 //50
  0,//SPI1_IRQHandler,                    //51
  0,//SPI2_IRQHandler,                    //52
  0,//USART1_IRQHandler,                  //53
  0,//USART2_IRQHandler,                  //54
  0,//USART3_IRQHandler,                  //55
  0,//EXTI15_10_IRQHandler,               //56
  0,//RTCAlarm_IRQHandler,                //57
  0,//USBWakeUp_IRQHandler,               //58
};


А
Код
void __iar_program_start( void );
для чего или она тут не при чем?

Кто-нибудь может скинуть пример работы программы на STM32 с библиотекой от IAR.
Мне нужно запустить процессор, инициализировать прерывания, таймер, АЦП и UART.
С процессором вроде как разобрался, вот что получилось:
Код
void SetupClock(void)
{
  // 1. включаем внутренний генератор
  RCC_CR_bit.HSION = 1;                   // включаем внутренний генератор
  while(RCC_CR_bit.HSIRDY == 0){}         // ожидаем потверждения включения внутреннего генератора
  // 2. %%%%%%%%%%%% отключаем SYSCLK  %%%%%%%%%%%%%%%%%%%%%%%%%%
  RCC_CFGR_bit.SW = 0;                    // системный clock не выбран
  while(RCC_CFGR_bit.SWS != 3){}          // ожидаем потверждения выключения 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


Скачал примеры, там самописные билиотеки (не привязанные к IAR), такие замудренные, разбираться замучаешься.
Может кто чем поможет?
Заранее спасибо!
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 10 2009, 12:23
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(miksher @ Jun 10 2009, 13:56) *
Скачал примеры, там самописные билиотеки (не привязанные к IAR), такие замудренные, разбираться замучаешься.

Какие библиотеки? От STM?
Я бы так не драматизировал, только одна ошибка - определение TRUE и FALSE конфликтует с ИАРовским.
Зато все есть, и примеры под них написаны.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
miksher
сообщение Jun 13 2009, 07:55
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 64
Регистрация: 27-02-08
Из: Россия, Алтайский край, г.Баранул, Павловский тракт 283
Пользователь №: 35 418



Цитата(Dog Pawlowa @ Jun 10 2009, 19:23) *
Какие библиотеки? От STM?
Я бы так не драматизировал, только одна ошибка - определение TRUE и FALSE конфликтует с ИАРовским.
Зато все есть, и примеры под них написаны.


библиотека с программным обеспечение IAR (c:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation\arm\inc\ST\iostm32f10xxE.h)
Хотелось бы посмотреть примеры программ с этой библиетекой
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 13 2009, 07:58
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Был на семинаре ST в прошлом месяце, купил кит с программатором.
Прямо там попробовали несколько простых примерчиков скомпилить и зашить - всё быстро и приятно получилось.
Использовали Кейл и библиотеку от ST - сильной неприязни не испытал, но кое что подправить захотелось сразу же.
С библиотекой всяко лучше чем без ничего...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jun 13 2009, 09:38
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(miksher @ Jun 13 2009, 10:55) *
библиотека с программным обеспечение IAR (c:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation\arm\inc\ST\iostm32f10xxE.h)
Хотелось бы посмотреть примеры программ с этой библиетекой

А пошарьте на сайте STM - там есть и последняя версия библиотеки и примеры ее использования. ИАР всегда опаздывает.
Ссылку не дам - дома по WLL подключен sad.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 19 2009, 17:27
Сообщение #13


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Сдаётся мне, что баги есть и в родной USB библиотеке для STM32 - USB-FS-Device development kit v3.0.1.
Это касается модификации регистров конечных точек USB_EPnR.

Регистры выглядят так:
Прикрепленное изображение


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

Странно, почему у фирмачей не так? unsure.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.


Так почему же это не выполняется?
Задал этот же вопрос в ветке по АРМам, но видимо никто не в курсе... crying.gif

ЗЫ: по идее, эта библиотека и куски кода из неё наверняка юзаются не в одном проекте.
И если никто не чешется - значит или баг очень маловероятен, или его нет...

В общем, пока буду, на всякий случай, дополнительно OR-ить эти два бита перед записью в регистр сразу после чтения...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016