Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

STR7 & STM32
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9609
Страница 1 от 1

Автор:  miro_atc [ Чет Дек 15, 2011 12:48 pm ]
Заглавие:  STR7 & STM32

Помогнете ми да се ориентирам малко с тия ST-та ;-)
Имам малко въпросчета, за които ми трябва съвсем кратки отговори без подробности....

Въпрос 1: Има ли периферии, които се ползват в повече от една фамилия (STR7, F1, F2, F4) и кои. Примерно в Атмел PIO контролера е един и същ за всички фамилии. Има периферии пък които за АРМ7 са едни, за всички куртекси други. Има естествено и периферии само за конкретна фамилия.

Тая информация ми трябва за да си структурирам правилно директориите и файловете. Значи за всяка периферия дето ползвам, си правя хедър за регистрите и отделно някакво драйверче. Но е важно къде ще ги сложа тия хедъри и драйвери, защото имам някаква организация за условно компилиране според производител/серия/фамилия/чип...

Въпрос 2: GPIO ремапването - аз ли не мога да го разбера или просто си е каша?
При всички останали мапинга се прави в PIO контролера и е универсално, демек ако един пин може да има 8 функции ще има 3 бита за избор и тия 3 бита ги има за всеки пин и винаги са на определен адрес/офсет. Така ако правя да кажем UART драйвер му давам една структура за TX пина и той може да си го конфигурира когато трябва. При ST e някаква боза дето не мога да схвана как да я направя универсална...


Въпрос 3: GPIO прекъсвания - как работи тая боза ?!

Автор:  fan [ Чет Дек 15, 2011 3:28 pm ]
Заглавие:  Re: STR7 & STM32

Здравей! Аз пък немога да се ориентирам точно какъв тип отговор търсиш, ама лаф да става, ако мога ще помагам. :)

1. За STR7 нямам наблюдения, но относто F1,L1,F2 перифериите са едни и същи. Има си малки допълнения в по-новите серии, примерно и в режим на изход към пина можеш да включиш вътрешен резистор към PullUp или Down. Самата структура на регистрите за всяка една периферия е подредена и последователна и там няма произволни разхвърляния из адресното пространство - виж stm32f1xx.h, stm32l1xx.h ...
2. Това е по-дълга тема...
3. Разрешаваш клока към съответния GPIO, конфигурираш режима на съответния пин или група пинове за съответна функция - вход,
изход, алтернативна функция. Конфигурираш му типа на изхода и PullUp или Down резистор или го изключваш.
Ако STM-ката от L1 серията, пускаш клок на "SYSCFG" блока. Следва свързване през този блок на съответното прекъсване от избран външен пин.
Следва конфигуриране на EXTI блока за съответното прекъсване там активираш определената линия, режим, начин на прекъсване, и го разрешаваш.
Последното е запускането на самия контролер на прекъсването. Там конфигурираш за избраното прекъсване приоритета и разрешаваш прекъсването.


Код:
    /* Enable GPIOA clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOА | RCC_APB2Periph_AFIO, ENABLE);
   
       /* Configure PA7 as inpit - "FLOATING" mode */
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource7);
   
    EXTI_StructInit(&EXTI_InitStructure);
    EXTI_InitStructure.EXTI_Line = EXTI_Line7;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    EXTI_ClearITPendingBit(EXTI_Line7);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority    =    0x0F;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority          =    0x0F;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
   
   .
   .
   .
   
   
void EXTI9_5_IRQHandler(void)
{

     if(EXTI_GetITStatus(EXTI_Line7) != RESET)
     {

       /* Clear the Key Button EXTI line pending bit */
        EXTI_ClearITPendingBit(EXTI_Line7);
     }
}   


За L1 серията:
Код:
     /* Enable GPIOB clock */
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
     /* Configure PB1 pin as input floating */
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
     GPIO_Init(GPIOB, &GPIO_InitStructure);

     /* Enable SYSCFG clock */
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

     /* Connect EXTI1 Line to PB1 pin */
     SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource1);

     /* Configure EXTI1 line */
     EXTI_InitStructure.EXTI_Line = EXTI_Line1;
     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
     EXTI_Init(&EXTI_InitStructure);

     /* Enable and set EXTI1 Interrupt to the lowest priority */
     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
    
    
     .
     .
     .
    
void EXTI1_IRQHandler(void)
{

   if(EXTI_GetITStatus(EXTI_Line1) != RESET)
   {
      // Clear the EXTI line 1 pending bit //
      EXTI_ClearITPendingBit(EXTI_Line1);


   }
}

Автор:  Цецо [ Чет Дек 15, 2011 3:49 pm ]
Заглавие:  Re: STR7 & STM32

Аз да ти кажа - ако си свикнал с Atmel, ST ще ти се видят ужасна боза.

Обратното е също 100% валидно.

Автор:  miro_atc [ Чет Дек 15, 2011 5:51 pm ]
Заглавие:  Re: STR7 & STM32

определено изглежда като голяма боза...

Въпросът е прост - или може да се ползва по универсален начин или не... Примерен код как се сетва някакъв пин не ми помога. Поне не и директно, щото трябва да се ровя в стойности на константи и т.н.

Универсален начин ще рече пинът да може да е променлива и кодът да не звиси от това за кой точно пин става дума.

Примерно при атмел един порт има до 32 пина и всички регистри са 32 битови. Бит 0 от всички регистри е за пин 0 от съответния порт. Бит 1 съответства на пин 1 и т.н. Ако искам да включа пулъпи на пинове 1 и 5 съответно трябва да запиша 1-ци в битове 1 и 5 (=0x22) на Pull-up Enable Register. Aко искам да разреша прекъсване от 3-ти пин пиша 1-ца в 3-ти бит на регистъра за рарешаване на прекъсвания. Като получа прекъсване пък гледам кой битове са вдигнати - ако 7-ми бит е 1, значи 7-пин е генерирал прекъсване.

Просто е и винаги има съответствие бит-пин и обратно.

При ST гледам портовете са 16 пина - ОК. Прекъсванията не са към GPIO контролера ами на майната си в някакъв евънт... ремапванията в друг модул. Три модула вместо един -ОК, три пъти ще разрешаваме, три пъти ще клокваме...
Но това не е толкова зле, колкото връзките - примерно прекъсванията са 20 бита, а пиновете 16. Хайде ще го преживеем - сложили са още 4 прекъсвания не където им е мястото, ама кво толкова.
Обаче тия 16 бита дето уж са пинове, не са за тия пинове дето си мисля май? Нормално човек би очаквал че ако първи бит в статуса на първия модул е вдигнат, значи има промяна на първи бит от първи порт. Да, ама НЕ! Промяната наистина е по някой първи пин, ама кой порт ебали му мамата... Трябва да правиш справка в мапинга, а там да направиш справка си е....

Е, честно като минавах от Атмел към Луминари имах чувството че се връщам в първи клас, ама като гледам със ST май ще трябва да се върна там където съм бил на две отделни клетки още...

Автор:  fan [ Чет Дек 15, 2011 6:30 pm ]
Заглавие:  Re: STR7 & STM32

Е що пък трагедията ти се вижда голяма, нямаш нужда да им знаеш адресите - имаш библиотека с дефиниции.
искаш да нулираш пин:
GPIOB->BSRRH = GPIO_Pin_1

... да сетнеш:
GPIOB->BSRRL = GPIO_Pin_1

има си изходен и за двете операции - GPIOx_ODR.
Трябва ти само основната библиотека с дефинициите и структурите stm32f1xx.h, stm32l1xx.h ... и тази с дефинициите на съответната периферия.
Все негодуваш от тия и ония! :)

Автор:  miro_atc [ Чет Дек 15, 2011 11:24 pm ]
Заглавие:  Re: STR7 & STM32

fan,
работата ми е да правя добри основи за софтуера... Следният цитат описва доста точно в какво се състои тая работа:

Цитат:
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to build bigger and better idiots. So far, the universe is winning."
Rick Cook


Спецификата на проектите ни е такава, че има една част да го кажем "ниво приложение", която е доста сложничка и я пишем в продължение на години. Междувременно хардуерът се променя, примерно намерили сме по-добър дисплей, флаш или нещо друго. Но приложението продължава да се поддържа и за стария хардуер на полето и за новия.
Естествено би било безумие приложение със стотици сорс файла да му правим различна версия за всяка хардуерна модификация. Основната част никога не я дублираме. Ако има нещо променливо то е в ОС-а или няколко прости библиотечки, които се портват за тоя или оня хардуер.
Тоя концепция е добре позната при компютрите... нали не си представяш М$ да тръгнат да пишат различна версия на офис пакета за всеки монитор на пазара. И не само компютрите... по принцип това е правилният начин да се правят нещата.

Само че като почнат да се разхвърлят нещата по библиотеки има значение дали ползваш run time, compile time или design time алгоритми. В случая функционалността на ST е кофти щото според пина, който ползваш може да се наложи да променяш кода още на ниво дизайн. А при компилация със сигурност има разлики. Демек голям проблем за библиотечене!

А за капсулиране в драйвер направо не ми се мисли...

Автор:  miro_atc [ Чет Дек 15, 2011 11:54 pm ]
Заглавие:  Re: STR7 & STM32

продължавам с тъпите въпроси - само до 16 пина едновременно могат да правят прекъсване?

и то не кои да е 16... баси тва не мой да е истина?

Автор:  fan [ Пет Дек 16, 2011 6:46 am ]
Заглавие:  Re: STR7 & STM32

Действително, до 16 пина едновременно могат да бъдат навързани към външно прекъсване при това точно определени
а именно - всички портове с еднакъв индекс са мултиплексирани към аналогичнaта линия на прекъсване.
PA0, PB0... PI0 - към EXTI0 ... PA15, PB15 ... PI15 към EXTI15.
Отделни са векторите на прекъсване за EXTI0 до EXTI4 a останалите са обединени в други два - EXTI9_5 и EXTI15_10.
Това важи за всички микроконтролери от сериите L1, F1, F2 и F4.

Автор:  miro_atc [ Пет Дек 16, 2011 10:40 am ]
Заглавие:  Re: STR7 & STM32

мда... трябва да се чете дребния шрифт :evil:

Автор:  miro_atc [ Пет Дек 16, 2011 1:03 pm ]
Заглавие:  Re: STR7 & STM32

остава ми "само" алтернативния ремапинг... На първо четене го разбирам, но тук коментирахте някакви проблеми - какви бяха?

Автор:  fan [ Пет Дек 16, 2011 1:36 pm ]
Заглавие:  Re: STR7 & STM32

Там проблеми съм нямал(важно е да не се забравя включването на клока към AFIO :) ), само трябва при конфигуриране да си отваря очите човек на 4 и да чете както казваш и дребния шрифт, примерно като:
"To optimize the number of peripherals available for the 64-pin or the 100-pin or the 144-pin
package, it is possible to remap some alternate functions to some other pins..." или
"The external interrupt/event function is not remapped. PD0 and PD1 cannot be used for external interrupt/event generation on 36-, 48- and 64-pin packages." ...

Автор:  Цецо [ Пет Дек 16, 2011 3:54 pm ]
Заглавие:  Re: STR7 & STM32

И чети ератите, че имаше някой "особенности" в ремапването. Бъгове чисти - ако това е ремапнато така, онова не може да се ползва и прочие дивотии. То за теб не би трябвало да е проблем де, щото това са си чисти бъгове в желязото, т.е. проблем на потребителя на продукта е да мисли за това. Така си мисля де.

Аз малко му загубих връзката, ама върху какво работиш сега? RTOS + плъгини за куртекс ли?

Автор:  miro_atc [ Пет Дек 16, 2011 4:20 pm ]
Заглавие:  Re: STR7 & STM32

портвам оса за ST-тата... макар че засега повече умувам, отколкото върша работа ;-)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/