Як перейти від мікроконтролерів “Basic” до ARM Cortex?


22

Я маю багаторічний досвід роботи з 8-бітовими ядрами різних виробників - а саме 8051, PIC та AVR - і тепер у мене є Cortex M0, щоб розібратися. Зокрема, це , але я сподіваюся, що ми можемо бути загальнішими за це.

Це виявляється трохи більше, ніж я торгувався, з безліччю документів, які описують різні частини системи з різним рівнем деталізації, і жоден насправді, який я бачив, щоб з'єднати це все разом. Це порівняно з тим, що є одна таблиця даних, яка пояснює все. Я розумію, що в першу чергу потрібно документувати набагато більше речей, але зміна формату підштовхує мене до циклу.

На веб-сайті, наведеному вище, є один документ, який є хорошим оглядом кожної підсистеми та периферійних пристроїв, і ще один, який детально описує кожен реєстр, і я маю весь вихідний код для їх SDK, включаючи файли заголовків та деякі складні приклади, але я все ще бачу нічого, що описує, як це все з’єднується.

Чи є коротка характеристика архітектури Cortex, яка пояснює функцію речей, яких менші контролери просто не мають - наприклад, декілька шарів шин від процесора до периферійних пристроїв, у кожного зі своїм таймером сторожового контролю - і як вони всі з'єднуються разом?


Я не можу сказати з того, що ви описали, якщо ви отримали фактичний лист / інструкцію користувача для процесора від виробника. Це має дати хорошу загальну картину та деталі. З однієї з зображень на веб-сайті, на який ви пов’язали, схоже на процесор NXP. Подивіться номер виробника та знайдіть документацію процесора на їхньому сайті. Також є сайт ARM arm.com/products/processors/cortex-m/cortex-m0.php .
DigitalNinja

Вибачте за затримку з поверненням до цього; Я займався іншими проектами. Дякую @Adam за голос досвіду.
AaronD

І дякую @Richard за огляд того, як про це думати, та примітку про друк конфігурації штифтів. Я підтримав вас обох.
AaronD

Ви ніколи не повернетесь назад, за винятком випадків, коли виявите екстремальні цінові вимоги. І навіть тоді ви будете спокушатися, оскільки є досить багато бруду дешевого Cortex-M.
Ронан Пайшао

Відповіді:


40

Я працював над AVR, а також з MCU на базі ARM Cortex-M3 / M4 / R4. Я думаю, що можу запропонувати кілька загальних порад. Це передбачає, що ви програмуєте на C, а не на збірку.

Процесор насправді є легкою частиною. Основні типи даних C будуть різного розміру, але ви все одно використовуєте uint8 / 16 / 32_t, правда? :-) І тепер усі цілі типи повинні бути досить швидкими, 32-бітний (int) є найшвидшим. Напевно, у вас немає FPU, тому продовжуйте уникати поплавків та пар.

Спочатку попрацюйте над розумінням архітектури системного рівня. Це означає IO, тактирування, пам’ять, скидання та переривання. Також вам потрібно звикнути до ідеї карти пам’яті периферійних пристроїв. На AVR ви можете не замислюватися над цим, оскільки регістри мають унікальні імена з унікальними глобальними змінними, визначеними для них. У більш складних системах зазвичай посилаються на регістри за базовою адресою та зміщенням. Це все зводиться до арифметики вказівника. Якщо вам не в курсі покажчиків, починайте вчитися зараз.

Для ІО з’ясуйте, як обробляється периферичний придушення. Чи є центральний елемент керування mux для вибору, які штифти є периферійними сигналами, а які GPIO? Або ви встановлюєте штифти в периферійний режим, використовуючи периферійні регістри? І звичайно вам потрібно знати, як налаштувати GPIO як входи та виходи, а також увімкнути режим відкритого зливу та підтягування / падіння. Зовнішні переривання також підпадають під цю категорію. GPIO є досить загальними, тому ваш досвід повинен вам добре слугувати тут.

Годинник зводиться до кількох речей. Ви починаєте з тактового джерела, як правило, кристала або внутрішнього генератора RC. Це використовується для створення одного або декількох доменних годин на системному рівні. Фішки з високою швидкістю використовуватимуть PLL, який можна думати як множник частоти. У різних точках також будуть годинникові роздільники. Вони важливі для розгляду, - якою повинна бути тактова частота процесора та швидкість передачі бітів, необхідних для вашої комунікаційної периферії. Зазвичай це досить гнучко. Коли ви вдосконалюєтесь, ви можете дізнатися про такі речі, як режими низької потужності, які, як правило, засновані на решітці годин.

Пам'ять означає спалах і оперативну пам'ять. Якщо у вас достатньо оперативної пам’яті, часто швидше зберігати свою програму там під час ранньої розробки, тому вам не доведеться програмувати спалах знову і знову. Велике питання тут - управління пам’яттю. Ваш постачальник повинен надати зразки сценаріїв зв’язків, але вам може знадобитися виділити більше пам’яті на код, константи, глобальні змінні чи стек залежно від характеру вашої програми. Більш складні теми включають безпеку коду та програмування флеш-режимів під час виконання.

Скидання досить прості. Зазвичай потрібно лише стежити за тимчасовим таймером, який може бути включений за замовчуванням. Скидання важливіше під час налагодження під час запуску одного і того ж коду знову і знову. Пропустити помилку легко через такі послідовності проблем.

Про переривання потрібно знати дві речі - як ви їх вмикаєте та вимикаєте та як налаштовуєте вектори переривань. AVR-GCC робить останнє для вас макросами ISR (), але в інших архітектурах вам, можливо, доведеться писати функціональну адресу в реєстр вручну.

Периферійні пристрої мікроконтролерів, як правило, не залежать одна від одної, тому ви можете вивчити їх по черзі. Це може допомогти вибрати один периферійний пристрій і використовувати його для вивчення частини матеріалів на рівні системи. Комунікаційна периферія та ШІМ добре підходять для тактових функцій та вводу-виводу, а таймери - для переривань.

Не лякайтеся рівнем складності. Ці "базові" мікроконтролери вже навчили вас багато чого з того, що вам потрібно знати. Будь ласка, дайте мені знати, якщо вам потрібно, щоб я щось уточнив.


4
Гарна відповідь. Інша річ, на яку слід звернути увагу, - це периферійні пристрої DMA, які, як правило, мають складні та недостатньо задокументовані інтерфейси.
Дуг МакКлін

3
"І тепер усі цілі типи повинні бути однаково швидкими." Власне, через цілі правила просування в C, використання 8/16-бітних типів може призвести до значного розширення знаків / нулів, а також може виникнути проблема, коли флеш-пам’яті мало. Отже, якщо є запам'ятована пам'ять, вона може окупитись використанням більше 32-бітних типів або принаймні віддати перевагу int/ int_leastN_Tтипам для змінних стеків.
користувач694733

Зробив помилку в моєму коментарі. Я мав на увазі сказати; використовувати int_fastN_tтипи, а не int_leastN_tтипи.
user694733

@ user694733: Я хотів би, щоб стандарт C дозволив коду запитувати ціле число, яке займає заданий розмір в пам'яті і може працювати на значеннях у певному діапазоні, але із слабко заданою семантикою, коли виходить за межі цього діапазону. На щось подібне до ARM int16_tчастота буде такою ж швидкою, як і int32_tдля значень, що зберігаються в пам'яті, але Стандарт вимагає, щоб на платформах, intрозміром яких 17 біт або більше, було int16_t x=32767; x+=2;встановлено xзначення -32767, часто вимагаючи інструкцій щодо розширення знаків, навіть якщо код ніколи не використовуйте таку поведінку.
supercat

Стандарт @supercat C вимагає поведінки із загортанням лише для непідписаних типів. Для підписаних типів будь-яке обгортання є UB, через різні можливі подання. Так що з x+=2, було б законно використовувати інструкцію для 16-бітних типів, тому що компілятор може припустити, що значення не завершиться, і, таким чином, його використання не змінить спостережувану поведінку. Але я думаю, що в ARM немає 16-бітної інструкції ADD, яка б це зробила можливою. (Я можу помилитися, мої знання щодо набору інструментів ARM - це не так добре.)
user694733

8

Корисно пам'ятати, що ARM володіє інтелектуальною власністю для мікропроцесора, але насправді не складає деталей. Натомість виробники ліцензують різні версії процесорів ARM та виробляють власні унікальні деталі з індивідуальними сумішами функцій та периферійних пристроїв.

З огляду на це, якщо ви новачок в архітектурі, можливо, було б сенс почати з документації ARM, яка, по суті, є базовою документацією для всіх таких мікропроцесорів.

Наприклад, Cortex-M0 описаний на веб-сайті ARM .

Існує також список книг, пов’язаних із зброєю та зброєю, які задовольняють найрізноманітніші потреби та інтереси.

Нарешті, є специфічні таблиці виробників. Що стосується M0, Cypress, NXP та STMicroelectronics - лише три з багатьох виробників реальних деталей на базі Cortex-M0.

(І ні, я не працюю на ARM і ніколи не маю.)


1
Це досить загальна відповідь, яка не робить більше, ніж посилання на деякі документи Cortex-M0, які я впевнений, що ОП може знайти самостійно.
Джей Карлсон

1
Він стосується прямого питання, яке попросило допомогти у пошуку загальної документації. Ця відповідь безпосередньо відповідає на те, що потрібно, і пояснює, чому все є таким, яким вони є.
Едвард

8

Важливою різницею є використання наданих постачальниками бібліотек. Для PIC, Atmels тощо базові бібліотеки (для gpio, таймерів, adc тощо) більшість розробників мало використовували. На мій досвід, люди (якнайбільше) використовуватимуть їх як путівники при написанні власного коду.

Однак із ARM бібліотеки майже завжди використовуються. Існує стандарт "CMSIS", якого виробники рекомендують дотримуватися. Більшість робить. Він допомагає в переносу коду (між різними ARM та між виробниками) і дає "стандартизований" метод структурування вашого коду. Люди звикають бачити та розуміти функції бібліотеки.

Впевнені, що є деякі розробники, які отримують доступ до регістрів безпосередньо, але вони є видатками :)

Щоб відповісти на ваше запитання, мені було дуже корисно прочитати документацію про бібліотеку. ST має добре розроблений код, з великим файлом довідки, створеним Doxygen. Ви можете побачити, які всі варіанти є для кожного апаратного модуля.

Щоб використовувати GPIO як приклад, функція ініціалізації обробляє:

  • Напрямок (вхід чи вихід)
  • підтягування / витягування
  • відкритий колектор / push-pull
  • швидкість вбивства
  • тощо.

Переглянувши варіанти, ви можете побачити, що можливо. І, звичайно, ви навчитеся передавати ці параметри у функцію Init!

Добре, тепер, коли я це сказав, я бачу, що у вашому конкретному ARM немає бібліотек, сумісних із CMSIS. Натомість для завантаження доступний їхній власний SDK. Я б почав шукати, хоча їх документи SDK.

Якщо ви не одружені з цим конкретним продуктом, я можу рекомендувати вам знайти іншого постачальника з більш сумісними бібліотеками. Ви все одно збираєтеся піднятися на криву навчання, тож можете зробити інвестиції більш портативними ...

Озброєння - це весело! Я не озирнувся.


"Для PIC, Atmels тощо, більшість розробників не використовували бібліотеки." Не впевнений, звідки це походить. Я використовував лише PIC, а не AVR, але, звичайно, не хотів би писати власну бібліотеку, наприклад, для інтерфейсу USB-хоста, стека TCP або файлової системи SD-карти. Бібліотеки Microchip для всього цього здаються цілком адекватними.
tcrosley

Ах, @tcrosley, ти напевно правильний. Я лише намагався посилатися на функціональність, охоплену основними периферійними пристроями: gpio, таймери,
adc

Я згоден, я зазвичай отримую доступ до GPIO, таймерів, годинників та UART R / W безпосередньо. Я інколи використовую їхні бібліотечні дзвінки для налаштування I2C, SPI, ADC та UART, але не завжди. Багато реєстрів, незалежно від того, чи говорите ви PIC (і зокрема PIC32) або ARM.
tcrosley

Я вважаю, що ця відповідь є найбільш прагматичною, вказаною на це питання, хоча вона не стосується конкретного контролера ОП. Я думаю, що ви можете зробити трохи хорошої вбудованої інженерії, не розуміючи AHB чи NVIC.
Джей Карлсон

@JayCarlson Дякую! Вашу редакцію цієї відповіді було відхилено, оскільки ми не повинні так суттєво змінювати пости інших людей. Але це була дійсно гарна інформація! Я пропоную вам опублікувати це як свою власну відповідь, так що це допоможе людям, а також отримати прихильність :)
bitsmack

5

Гарний час рухатися; 8-біт швидко гине; коли ви можете придбати плату за 5 доларів (наприклад) STM32F103, яка є досить здатною 32-бітовою мікроконтролером ARM (навіть за допомогою USB!), сумніви часів не змінилися.

У вас вже були чудові відповіді, але в першу чергу я б сказав "забудьте збірку" і майже "забудьте піклуватися про те, як процесор працює на низькому рівні" - одного дня буде кутовий випадок, коли вам потрібно буде заритися в нього (специфічна оптимізація або для налагодження), але ARM-сердечники винятково добре працюють з кодом C (за конструкцією), і вам дуже рідко потрібно заглиблюватися всередину кишок.

Це означає, що ви витратите певну кількість часу на удари головою проти проблем із компіляторами (і особливо лінкерами та файлами), що баффікують вам незрозумілі помилки, але всі вони переважають.

Кишки того, як працюють ARM (тобто книги для процесорів ARM), щільні і не дуже цікаві до того дня, коли вам насправді потрібно оптимізувати (і ви будете вражені, як це нечасто, коли у вас є 32-бітові регістри та ваш PLL ' d тактовий процесор знаходиться в районі 100 МГц).

"Набір інструкцій ARM" старого skool "набагато простіше читати розбирання, ніж набагато новіший" Thumb2 "- що саме ви знайдете в більшості сучасних ARM-апаратів рівня мікроконтролерів (Cortex) - але знову ж таки внутрішніх вказівок інструкцій на мові збірки в основному відходять на другий план; якщо у вас є правильний набір інструментів (особливо пристойний налагоджувач на рівні джерела з точками прориву / один крок тощо), ви просто не надто переймаєтесь тим, що це ARM взагалі.

Опинившись у світі 32-розрядних регістрів та 32-бітної ширини шини даних, і все, що ви коли-небудь хотіли, доступне на мікросхемі, ви ніколи не захочете знову повернутися до 8-бітного процесора; в основному, за те, що "полегшити" та писати код, часто не передбачено розбірливості більш ніж ефективно.

Однак ... периферія ... так, і ТУТ.

Ви впевнені, що в сучасних MCU граєте багато речей, і багато з них - це дуже вигадливі речі; Ви часто знаходите світ вишуканості далеко за межами периферійних пристроїв AVR, PIC та 8051.

Один програмований таймер? Ні, майте вісім! DMA? Як щодо 12 каналів з програмованим пріоритетом та режимом розриву та ланцюговим режимом та автоматичним перезавантаженням і .. і .. і ...

I2C? I2S? Десятки варіантів піксельного приглушення? П'ятнадцять різних способів перепрограмувати флеш-пам’ять? Звичайно!

Часто відчувається, що ви перейшли від голоду до бенкету периферійними пристроями, і звичайно, що є цілі шматки чіпа, яким ви захоплюєтесь, але ледве використовуєте (отже, годинникові решітки).

Кількість апаратного забезпечення на мікросхемі (і варіації цього лише в одній лінійці мікросхем постачальника) на сьогоднішній день є досить приголомшливою. Звичайно, один постачальник мікросхем, як правило, повторно використовує блоки IP, тож коли ви ознайомитесь з певним брендом, це стане простіше, але "лайно в даний час отримано просто".

Якщо що-небудь, периферійні пристрої та їх взаємодія (і DMA, і переривання, і розподіл шини, і, і ...) є настільки складними (і, в деяких випадках, не так, як описано в таблицях), що інженери часто мають улюблений діапазон MCU-модулів ARM і прагнуть дотримуватися цього просто тому, що вони знайомі з периферійними пристроями та інструментами розробки.

Хороші бібліотеки та засоби розробки (тобто швидкий компіляція + цикл налагодження з належним налагоджувачем) та великий набір робочих прикладних проектів з кодом є абсолютно важливими для вашого вибору ARM MCU на сьогодні. Здається, більшість постачальників зараз мають надзвичайно дешеві дошки з оцінювання (

Як я впевнений, ви помітили, як тільки ви вийдете за рівень мікроконтролера з ARM та на рівень SOC (наприклад, Raspberry Pi / etc SOCs стилю Raspberry), то правила повністю змінюються, і справа в тому, для якого Linux ви переходите бігати, тому що - за суттєво нечисленними винятками - ти благаєш божевільний, щоб спробувати щось інше.

В основному; незалежно від процесора, який (можливо) був попередньо обраний для вас на цьому концерті, купіть собі декілька супердешевих комітетів з оцінювання на основі Cortex у кількох різних постачальників (TI, STM, Freescale та багато іншого) здійснити злому з наданим зразком коду.

Заключний рада; як тільки ви знайдете сторінку чи три в таблиці даних, яка описує параметри фіксації штифтів для чіпу чіткого номера деталі, з яким ви працюєте, ви можете роздрукувати його і приклеїти до стіни. Дізнавшись пізно в проекті, що певна комбінація периферійних пристроїв неможлива через прикручування пін-файлу - це не цікаво, а іноді ця інформація настільки захована, що ви б поклялися, що намагаються її приховати :-)


швидке доповнення - якщо ваш проект набагато більше, ніж самий спрощений контролер, подумайте про використання RTOS - є щось із кривої навчання, що б ви не вибрали, але навіть найменші ARM мають багато oomph на сьогоднішній день для роботи багатопотокової ОС. Особисто я виявив, що ChibiOS є чудовою сумішшю худорлявих функцій (особливо це працює на STM32, де він постачається з приємною периферійною бібліотекою), але є ряд варіантів.
Річард Аплін

4

Я також прийшов від AVR і зараз зазвичай дотримуюся STM32 (Cortex-M). Ось що я рекомендую для початку, і відображає мої власні труднощі, коли я почав:

  1. Отримайте плату з налагоджувачем або хоча б роз'ємом JTAG (а потім придбайте налагоджувач JTAG). Навколо є багато дешевих, і ви заощадите багато часу, використовуючи його.

  2. Отримайте хороший IDE з усім включеним. Я давно рекомендував CooCox CoIDE . З тих пір він зупинився і відновив розвиток, тому я не впевнений, як зараз. "Хороший IDE" дозволяє отримати основний індикатор Hello World, що блимає в найкоротші терміни.

  3. "Гарний IDE" повинен налаштувати заголовки CMSIS виробника. Це, в основному, регістрові карти, які дозволяють простіше писати програми C / C ++, із назвами змінних замість простих чисел та покажчиків.

  4. Спробуйте використовувати периферійні бібліотеки виробника, якщо вам не потрібні абсолютні найкращі показники. Ви насправді цього не робите, оскільки навчаєтесь. Якщо пізніше ви виявите, що вам потрібно видавити більше, загляньте в код бібліотеки, щоб побачити, як це робити. Хороша річ у бібліотеках також полягає в тому, що вони, як правило, дозволяють використовувати багато різних фішок одного і того ж виробника з тим самим кодом.

  5. Відмінність від AVR, чіпи ARM починаються з відключення периферійних пристроїв. Спершу їх потрібно включити. У хорошій периферійній бібліотеці будуть приклади того, як правильно використовувати периферійні пристрої, і ви можете отримати додаткову інформацію з таблиці даних пристрою. Отже, не забудьте включити годинники та периферійні пристрої перед тим, як користуватися ними. Так, навіть порти вводу / виводу вважаються периферійними пристроями.

  6. Код, як ви дізнаєтесь. Не намагайтеся обробляти все відразу, адже це дійсно досить складно. Я б почав з вивчення дерева годинника (APB, AHB тощо), а також взаємодії годин і дільників годин. Тоді я би поглянув, де IDE зберігає скрипти посилання та код запуску для вашого пристрою. Сценарій лінкера - це те, як ви організовуєте пам'ять (де є оперативна пам'ять, спалах, векторна таблиця ISR тощо). Сценарій запуску налаштовує вашу програму (такі речі, як копіювання глобальних змінних ініціалізаторів з флеш-пам’яті в ОЗУ). Деякі IDE мають сценарії запуску в ASM, а деякі - у C. Іноді ви можете подати Google на інший, мовою, яку ви бажаєте.

  7. Запустіть налагоджувач якнайшвидше. Досить часто спочатку помилитися, роблячи деякі речі (як правило, ініціалізацію обладнання) у іншому порядку, ніж слід. Це іноді запускає виключення ISR, яке отримує вас у while(1);нескінченному циклі (реалізація за замовчуванням для цього ISR), що зупиняє вашу програму, і важко простежити навіть за допомогою налагоджувача. Уявіть без налагоджувача.

  8. Якщо говорити про налагоджувач, спробуйте також перейти до UART, а потім прочитайте це за допомогою послідовного USB-адаптера. printf()налагодження завжди корисно :-)


3

Я не дуже багато працював над 8051, AVR або PIC. Але останнім часом я почав дивитися на лінійку процесорів ARM Cortex MX. Тому я не можу сказати вам багато про перехід від 8051, AVR або PIC, але переважно з точки зору початківця.

Процесор ARM®Cortex ™ -M4 базується на архітектурі Гарварду, тому має окремі шини даних та інструкцій. Нижче зображення високого рівня.

введіть тут опис зображення

Цього тижня представники NXP відвідають наш заклад. Я перевірю з ними будь-які ресурси NXP ARM-Cortex Mx та опублікую їх тут. У Freescale є 32-розрядний мікроконтроллер Kinetis Low Power (MCU) на основі ядер ARM® Cortex®-M , я розумію, що вони також мають подібні посібники для вивчення процесорів ARM. На жаль, я їх не досліджував.


Список літератури:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.