MSP430FR - поморгаем?

Тема в разделе "Флудилка", создана пользователем parovoZZ, 22 июн 2019.

  1. parovoZZ

    parovoZZ Гуру

    Приехала ко мне прямо от ковбоев плата под звучным названием LAUNCHPAD. Что на ней имеется? Прежде всего, это целевой МК на основе FRAM памяти - MSP430FR2433. Также на плате присутствует программатор/отладчик. И самое вкусное - это аппаратная обвязка технологии EnergyTrace™ Technology. У ковбоев стоит такая плата 9.9 енотов, но в дни распродаж стоимость упала до 4.3. Доставка бесплатная FedEx -ом. Но есть и неприятность - обязательная процедура растаможки. Процедура бесплатная (при соблюдении некоторых условий) и происходит через таможенного брокера (он сам с вами свяжется для запроса документов). У меня же кроме лаунчпада в посылке были ещё какие-то компоненты, поэтому посылка разделилась на две: одна часть ехала из штатов и прошла растаможку без моих телодвижений (что странно), вторая часть посылки ехала из Сингапура (1 МК стоимостью 2.5 енота) и тормознулась на таможне. Пришлось засылать копии документов. Ехало всё очень быстро - менее 6 дней с доставкой до вашего крыльца.
    В какой среде писать программу? TI предлагает две "каропки" - это полностью бесплатная CCS на основе ECLIPSE, и второй вариант - IAR. Также присутствует онлайн-редактор с минимальными возможностями (необходим агент на компьютере и расширение в браузере). CCS - это крайне тормознутый монстр (по сравнению с MSVS), при этом в нем есть всё для комфортной работы, хотя несколько и непривычно после MSVS (необходимо нажимать Ctrl + Space, чтобы появились подсказки).
    Первая мысль после запуска IAR - да поотрубать всем головы, кто ЭТО придумал. Редактор кода убогий настолько, насколько это возможно в принципе. Это самый обыкновенный блокнот с минимальной подсветкой. Правда, можно прикрутить внешний редактор типа notepad++, но тогда все "фенечки" (которых и так нет) исчезнут (нельзя перейти к декларации переменной/функции, нет подсказок и прочее). Тем не менее, IAR очень быстро запускается и очень шустро работает. Лично я пока его и использую, несмотря на всю убогость редактора.
    Мало кто знает, но у MSP430 тоже есть свой фреймворк, который полностью повторяет "arduino". Называется он Energia. Но, т.к. я изучаю МК, а не фреймворки, пользоваться я ей не буду.
    Литература у TI для своих МК организована так (это не правило, но в большинстве случаев так) - есть даташит на целое семейство МК (в нашем случае это MSP430FR4xx and MSP430FR2xx family User's Guide) с общим описанием всевозможных модулей, а для отдельных МК из этого семейства прилагается ещё один даташит уже с подробным описанием (что есть и чего нет в МК описывается именно в этом даташите). Для MSP430FR2433 документ так и называется: MSP430FR2433 Mixed-Signal Microcontroller datasheet.
    Давайте уже поморгаем. Моргать в стиле "Hello, world" уже не интересно, поэтому будем моргать в стиле "Привет, ЗЕМЛЯНЕ!". Тем более, что у нас для этого есть аж пять таймеров со счетчиками в 16 бит.
    Первое, что делаем, выключаем вачдог (по-умолчанию он включен):
    Код (C++):
    WDTCTL = WDTPW | WDTHOLD;
    Затем необходимо определить как выход тот пин, который мы можем подключить к блоку сравнения таймера и на котором у нас сидит светодиод. Это первая нога первого порта:
    Код (C++):
    P1DIR |= BIT1;
    Бит BIT1 в заголовочнике определен как:
    Код (C++):
    #define BIT1                (0x0002)
    Затем нам необходимо подключить выход блока сравнения к пину, чтобы на нем генерировать ШИМ. MSP430FR2433 здесь особого простора не предоставляет - всё жестко привязано аппаратно внутри. Поэтому открываем даташит на МК и смотрим картинку
    msp430_select.png
    К пину 1 порта 1 (P1.1) можно подключить первый компаратор нулевого таймера А (TA0). Первое услови е мы уже выполнили - пин переключили на выход. Теперь необходимо определить альтернативную функцию для выбранного пина. Это делается с помощью пары регистров P1SEL0 и P1SEL1. В них, согласно таблицы, необходимо записать число 10 на то место в регистре, пин которого должен обладать альтернативной функцией (да, мозгодробительно))):
    Код (C++):
    P1SEL1 = BIT1;
    Если бы мы подключали выход второго компаратора таймера А к пину (а это второй пин первого порта), то писали бы так:
    Код (C++):
    P1SEL1 = BIT2;
     
    DetSimen, arkadyf, KindMan и 3 другим нравится это.
  2. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    Текста многа, читаь лень...
    Но лайк влеплю :D
     
  3. parovoZZ

    parovoZZ Гуру

    Теперь заводим таймер. ШИМ-ить будем, как уже сказали, нулевым таймером Timer_A (это экземпляр типового таймера A3). Чтобы таймер заработал, ему необходимо подключить источник тактирования. Источников тактирования в MSP430 несколько: внутренние ACLK и MSCLK, а также внешние - TACLK и INCLK. Для разнообразия, мы будем использовать сразу два: ACLK и MSCLK. Первый генерирует частоту 32768 Гц, второй 1 МГц (по-умолчанию. Но возможно и перестроить). Для нулевого таймера Timer_A бы будем использовать частоту 1 МГц, поэтому подключим MSCLK. Счетчик в этом типе таймера может считать до определенного значения как вверх, так и вверх и вниз, а также только вверх до максимального совего значения (0xFFFFFFFF). Мы определим, что счетчик считает только вверх и сбрасывается при достижении значения 256. Также перед включением таймера необходимо сбросить его самого и его предделитель. За это отвечает бит TACLR. Теперь всё сказанное запишем в коде:
    Код (C++):
    TA0CCR0 = 256;
    TA0CTL = TASSEL__SMCLK | MC__UP | TACLR;
    Перед запуском таймера необходимо настроить компаратор. У компаратора есть несколько режимов работы. Их можно посмотреть в даташите на семейство
    msp430_timer.png
    Среди них я выбрал режим Toggle/Reset. Это режим Mode2:
    Код (C++):
    TA0CCTL1 = OUTMOD_2;
    И определим значение регистра сравнения сразу после инициализации
    Код (C++):
    TA0CCR1 = 255;
    Всё, таймер настроен и уже работает. Для модуляции ШИМ -а будем использовать другой таймер этого же типа - TA1.
     
    DetSimen, arkadyf, ИгорьК и 2 другим нравится это.
  4. ostrov

    ostrov Гуру

    Если коротко и не гуглить отдельно, какие основные характеристики м преимущества данного МК. В чем смысл его копать?
     
  5. ИгорьК

    ИгорьК НЕ Модератор

    Поставил лайк, ибо работа.

    Я бы чуть изменил вопрос - какие реальные, а не абстрактные, задачи нерешаемы привычными железами, что надо это.
     
  6. ИгорьК

    ИгорьК НЕ Модератор

    FRAM по i2c (навскидку, может ошибаюсь) к любой железке цепляются.
     
    Andrey12 и SergeiL нравится это.
  7. ИгорьК

    ИгорьК НЕ Модератор

    От задач смысл определяется, а не от скорости, ИМХО.
     
    SergeiL нравится это.
  8. В любой задаче есть требования по скорости. В некоторых они такие, что требуется fram. И цеплять по i2c бессмысленно.
     
  9. ИгорьК

    ИгорьК НЕ Модератор

    Да, кэп. Именно так.
     
  10. SergeiL

    SergeiL Гуру

    А если задача состоит в том, чтобы каждые четверть секунды сохранять данные в энергонезависимую память?
    Чем FRAM по I2C не подходит?
    У EEPROM ресурс намного меньше. :)
     
  11. SergeiL

    SergeiL Гуру

    :)
    К FRAM по I2C - это относится на 100% :)
     
  12. parovoZZ

    parovoZZ Гуру

    Чтобы промодулировать наш ШИМ генератор (создание эффекта плавного затухания и загорания светодиода), я буду использовать такую конструкцию, вызываемую в прерывании от первого таймера Timer_A:
    Код (C++):
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=TIMER1_A1_VECTOR
    __interrupt void TIMER1_A1_ISR(void)
    {
        switch(__even_in_range(TA1IV, TA1IV_TAIFG))
        {
            case TA1IV_TAIFG:
                if (dir)
                {
                    TA0CCR1 = count;
                }
                else
                  {
                      TA0CCR1 = 256 - count;
                  }

                if (!count)
                {
                    dir = !dir;
                }

                count --;
                           
                break;
            default:
                break;
        }
    }
    где:
    Код (C++):
    volatile uint8_t        count;

    volatile uint8_t        dir;
    Ну и запуск таймера TA1. Отличие здесь в разрешении прерывания, источнике тактирования и отсутствие работы компараторов:
    Код (C++):
     TA1CCR0 = 255;

        TA1CTL = TASSEL__ACLK | MC__UP | TACLR | TAIE;
    Чтобы зря не гонять процессор между прерываниями, я его буду останавливать. Исторически так сложилось, что MSP430 предлагает богатый набор режимов энергосбережения. Я буду использовать режим остановки процессора - LPM3:
    Код (C++):
    __bis_SR_register(LPM3_bits | GIE);
    __no_operation();                             // For debugger
    Выход из режима энергосбережения или его смена в МК MSP430 устроено несколько иначе, чем в Atmel. Суть в том, что периферийное устройство будит процессор, запускает необходимый осциллятор для своей работы, после завершения своей работы останавливается осциллятор (если он больше никому не нужен), а процессор уходит в тот режим, из которого его разбудили. И здесь каких-то телодвижений со стороны программиста совершать не требуется. Другое дело, если мы хотим совершить какие-то действия вне прерывания после пробуждения. Тогда в обработчике прерывания нам необходимо вручную сменить режим работы.

    Ну и вишенка: EnergyTrace™ Technology.
    На плате установлен ШИМ стабилизатор на основе МК из семейства MSP430. Как оно устроено и как работает - всё есть в документах от TI. Суть в том, что такая технология позволяет измерять токи вплоть до сотни наноампер с приемлемой точностью. Из минусов - работает только в режиме дебага. Впрочем, запускаем наш код и смотрим на токопотребление:
    msp430_current.png
    Мы видим, что с ростом скважности ток падает и наоборот. Ну оно и логично.
    Enjoy!
     
    KindMan, DetSimen, Daniil и ещё 1-му нравится это.
  13. ИгорьК

    ИгорьК НЕ Модератор

    Fram имеет преимущество перед другими в вопросах
    1. Скорости
    2. Количество перезаписи/энергонезависимость.

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

    А когда надо до той степени, что привычное железо не годится? Пример для МК?
     
    Последнее редактирование: 22 июн 2019
    SergeiL нравится это.
  14. ИгорьК

    ИгорьК НЕ Модератор

    Здесь. Что вам не нравится? Мы обсуждаем предлагаемый МК.
     
  15. parovoZZ

    parovoZZ Гуру

    Архитектура 16 бит. При этом не обязательно, что и периферия будет также 16 бит. Например, SPI именно в 2433 8 бит. 16 бит SPI в моделях постарше.
    Контроль запуска и работы внешних осцилляторов. То бишь запуск МК всегда происходит на внутреннем RC осцилляторе и переключение на внешний осциллятор должно происходить только после флага готовности. Контроль ручной.
    Модуль CRC для контроля целостности памяти программ и информационного блока.
    Память FRAM. Из плюсов - изностойкость 10 в степени 15. Нет необходимости стирать ячейки перед их записью. Скорость записи быстрее, чем в EEPROM. Энергопотребление при записи также ниже. Работа с памятью осуществляется специальным контроллером и для программиста полностью прозрачна. Минусы. Сразу после чтения FRAM ячейки её необходимо заново записать. Скорость чтения также не должна превышать 8МГц. Таким образом, если скорость работы МК выше 8МГц, то возможно искусственное замедление скорости. Это возможно избежать с помощью кэширования (не разбирался с этим вопросом).
    Ну и разумеется, энергопотребление. В рабочих режимах у MSP430FR наблюдается некий паритет с последними Attiny PicoPower от Atmel, но в режимах энергосбережения они поинтереснее.
    Из даташита:
    Самый жёсткий режим - LPM4.5 - в нем выключено решительно всё, и даже память SRAM не сохраняется. Но в обмен на 16 наноампер.
    Присутствует умножитель на 32 разряда уже в не самых навороченных МК. В 2433 он тоже есть.
    В МК чуть подороже есть DMA контроллер.
     
    SergeiL, DetSimen, Daniil и ещё 1-му нравится это.
  16. parovoZZ

    parovoZZ Гуру

    Да хотя бы для того, чтобы извилины к старости не выпрямились.
     
  17. Daniil

    Daniil Гуру

    Фрам и малое потребление? Если правильно помню, то паровоз любит сажать камушки на диету.
    Плюс у TI есть любопытная серия камней с аналоговой цепью внутри (набор ОУ с набором резюков, которые можно под/пере-ключать внутри камушка), на будущее.
    А атмел хотят денюшку за программатор с амперметром(
     
  18. SergeiL

    SergeiL Гуру

    :)
     
  19. parovoZZ

    parovoZZ Гуру

    Ну это не серия, а какие-то МК внутри семейства. Называется оно Smart Analog Combo. В MSP430FR2...FR4.... оно есть, но простенькое. В 2433 такого блока нема. В G серии есть МК по паре ОУ на борту с PGA. Вот там без стакана не разберешься.