|
MSP430F2013 из eZ430-F2013 + IAR для начинающих, MSP430F2013 из eZ430-F2013 + IAR для начинающих |
|
|
|
Sep 18 2007, 06:10
|
Участник

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991

|
Я программист и раньше писал для ПК, Psion, PalmOS, PocketPC. Сейчас очень хочу изучить МК от TI. Имеется eZ430-F2013, IAR и желание. Но никак не могу понять принципов программирования МК. Прошу помощи. Вот есть такие вопросы: 1. на борту памяти 128Б флеша 2К: 1.1. Программа прошивается в флеш? 1.2. Мне для работы будет доступно 2К минус размер программы? 2. Имеется 100Б параметров (типа номер, пользователь и т.д.) они должны быть записаны во флеш 2.1. Есть стартове значения, как их при прошивки записать во флеш или нужно при первом запуске программы инитить? 3. Таймер. Имею код: Цитата #include "msp430x20x1.h"
void main(void) { WDTCTL = WDTPW + WDTHOLD; //выключили WD P1DIR |= 0x01; //Порт работает на выход
TACTL = TASSEL_1 + MC_1; //Используем ACLK и движение от 0 до TACCR0 TACCR0 = 1000; //Предел 1000 TACCTL0 = CCIE; //Включить прерывание
_BIS_SR(LPM0_bits + GIE); //Перейти в режим сна }
#pragma vector=TIMERA0_VECTOR __interrupt void TIMERA0_ISR(void) { P1OUT ^=0x01; //Изменить состояние порта (как я понимаю в порт будет подавать/не подавать постоянно импульс) } 3.1. Правильно ли я понял код? 3.2. Как сделать чтобы задержка была 1сек? Как вычислять эту цифру? 3.3. Генератор ACLK работает с одинаковой скорость в спящем режиме? 4. Как вычислять скорость выполнения каждой команды? 5. При отладке с использованием Z430-F2013 код прошивается или идет подобие эмуляции? Пока все вопросы, надеюсь на ответы для человека с уровнем 0.
|
|
|
|
|
Sep 18 2007, 07:56
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(AlexandrM @ Sep 18 2007, 10:10)  Я программист и раньше писал для ПК, Psion, PalmOS, PocketPC. Сейчас очень хочу изучить МК от TI. Имеется eZ430-F2013, IAR и желание. Но никак не могу понять принципов программирования МК. Прошу помощи. Вот есть такие вопросы: 1. на борту памяти 128Б флеша 2К: 1.1. Программа прошивается в флеш? 1.2. Мне для работы будет доступно 2К минус размер программы? 2. Имеется 100Б параметров (типа номер, пользователь и т.д.) они должны быть записаны во флеш 2.1. Есть стартове значения, как их при прошивки записать во флеш или нужно при первом запуске программы инитить? 3. Таймер. Имею код:
3.1. Правильно ли я понял код? 3.2. Как сделать чтобы задержка была 1сек? Как вычислять эту цифру? 3.3. Генератор ACLK работает с одинаковой скорость в спящем режиме? 4. Как вычислять скорость выполнения каждой команды? 5. При отладке с использованием Z430-F2013 код прошивается или идет подобие эмуляции? Пока все вопросы, надеюсь на ответы для человека с уровнем 0. 1.1 да во флешь. это пзу (аналог винчестера в ПК  ) 1.2 что значит доступно? для чего. Для записипрограммы вам будет доступна вся флешь (в доке смотрите таблицу памяти). для переменных все ОЗУ. Программа при выполнении выполняется из флешь а не ОЗУ 2.1 Я правильно понял, что вамнадочто то записать во флешь потому что при последующем перепрограммировании вам нельзя это стирать? если так, то надо использовать Information Memory например - это спец область флеши для таких нужд. Если вам просто надо при программировании набор констант использовать, то пользуйте const. 3.1 Судя по коментам вроде да. Только фраза " в порт будет подавать/не подавать постоянно импульс" насмешила 3.2 Эта цифра зависит от частоты того генератора, которым тактируется таймер. В вашем случае ACLK. Как задавать частоту ACLK почитайте в доке (например можно от внешнего кварца, обычно именно так ACLK пользуют). 3.3 да. 4. одна АССЕМБЛЕРНАЯ команда выполняется за 1 такт, то есть 1/Fmclk c/ Но зачем вам это? Формировать задержки? это не так делается, а с помощью таймера. 5. прошивается У Вас тяжелое наследие программирования ПК. Все кто в программирование МК приходит изПК так мучаются. Не переживайте... лечится
|
|
|
|
|
Sep 18 2007, 08:34
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(AlexandrM @ Sep 18 2007, 12:10)  1.1. Программа прошивается в флеш? Да. Цитата(AlexandrM @ Sep 18 2007, 12:10)  1.2. Мне для работы будет доступно 2К минус размер программы? Для какой именно работы? Для внутрипрограммной записи во Flash? У MSP430F2013 четыре сектора по 512Байт в основной памяти Flash (старший сегмент правда не совсем 512Байт, см. в datasheet) и четыре сектора по 64 байта в области INFO (это тоже Flash). Перед записью во Flash ее нужно стереть. Стирать Flash можно только посекторно (целыми секторами). Если ваша программа будет использовать хотя бы один байт в секторе, то стирать/перезаписывать этот сектор вы уже не сможете (если только не исхитритесь). Для записи констант обычно используются (они для этого и предназначены) сегменты INFO. Цитата(AlexandrM @ Sep 18 2007, 12:10)  2. Имеется 100Б параметров (типа номер, пользователь и т.д.) они должны быть записаны во флеш Пишите в область INFO, как я уже и сказал выше. Цитата(AlexandrM @ Sep 18 2007, 12:10)  2.1. Есть стартове значения, как их при прошивки записать во флеш или нужно при первом запуске программы инитить? Это как вам будет удобно. Только советую сгруппировать константные параметры в структуру и обращаться к ним по указателю как к элементам структуры. Цитата(AlexandrM @ Sep 18 2007, 12:10)  3. Таймер. Имею код:
3.1. Правильно ли я понял код? В общем-то правильно. Только период перезагрузки таймера 1000+1, а не 1000. Состояние 0x0000 это тоже 1 такт. Чтобы период был ровно 1000 тактов в регистр TACCR0 нужно число 1000-1=999 записывать. Цитата(AlexandrM @ Sep 18 2007, 12:10)  3.2. Как сделать чтобы задержка была 1сек? Как вычислять эту цифру? Вычислять как отношение тактовой частоты к значению регистра перезагрузки. В вашем случае как F(ACLK)/(1000+1). Частота переключения выхода P1.1 будет Fout(P1.1)=F(ACLK)/(1000+1)/2 Цитата(AlexandrM @ Sep 18 2007, 12:10)  3.3. Генератор ACLK работает с одинаковой скорость в спящем режиме? Да, т.к. его частота используется для тактирования таймера. А таймер работает (не остановлен). Цитата(AlexandrM @ Sep 18 2007, 12:10)  4. Как вычислять скорость выполнения каждой команды? Время (количество тактов) каждой команды указано в руководстве (User's Guide). Цитата(AlexandrM @ Sep 18 2007, 12:10)  5. При отладке с использованием Z430-F2013 код прошивается или идет подобие эмуляции? Пока все вопросы, надеюсь на ответы для человека с уровнем 0. Да, программный код прошивается во Flash. P.S. еще добавлю, что за счет ортогональной фон-Неймановской архитектуры MSP430 программа может выполняться как из Flash, так и из ОЗУ. Но компиляторы обычно размещают программный код в основной Flash. Чтобы разместить программу в области INFO или загрузить в ОЗУ компилятор нужно поднастроить (задать опции в виде своих собственных сегментов).
|
|
|
|
|
Sep 18 2007, 08:39
|
Участник

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991

|
Цитата(jorikdima @ Sep 18 2007, 10:56)  1.2 что значит доступно? для чего. Для записипрограммы вам будет доступна вся флешь (в доке смотрите таблицу памяти). для переменных все ОЗУ. Программа при выполнении выполняется из флешь а не ОЗУ Вот есть 2К флеша с 0 по 2047 программа размером 512Б прошьется с Х адреса (с какого прошивается? как определить какая свободная?), т.е. с 512 по 2047 я могу использовать для хранения данных? Цитата(jorikdima @ Sep 18 2007, 10:56)  2.1 Я правильно понял, что вамнадочто то записать во флешь потому что при последующем перепрограммировании вам нельзя это стирать? если так, то надо использовать Information Memory например - это спец область флеши для таких нужд. Если вам просто надо при программировании набор констант использовать, то пользуйте const. Это не константы это очень редко меняющиеся данные. Про Information Memory понял, ее там 256Б (получается 2К + 256Б реально имеется?). А если нужно больше 256Б хранить? Основная суть вопроса вот в чем, имеется: - базовые параметры размером 300Б они нужны для работы (напр. Номер и Пользователь); - размер программы 1748Б; - итого вся память занята как IAR сказать чтобы разместил Номер и Пользователь например сразу за кодом программы при прошивке, чтобы я мог его использовать так void main { SN = ReadFlash(Addr_SN); USer = ReadFlash(Addr_User); } если не размещаять при прошивке нужно записать во флеш стартовые данные void main { SN = ReadFlash(Addr_SN); User = ReadFlash(Addr_User); if (SN == 0) { SN = 12345; User = 09876; } } но это как бы лишний код и памяти под него нет итого: можно ли при прошивки размещать некоторые данные во флеше по определенным адресам? и как? Цитата(jorikdima @ Sep 18 2007, 10:56)  3.2 Эта цифра зависит от частоты того генератора, которым тактируется таймер. В вашем случае ACLK. Как задавать частоту ACLK почитайте в доке (например можно от внешнего кварца, обычно именно так ACLK пользуют). А без внешних как? Как узнать текущие насройки? Цитата(jorikdima @ Sep 18 2007, 10:56)  У Вас тяжелое наследие программирования ПК. Все кто в программирование МК приходит изПК так мучаются. Не переживайте... лечится  Цитата(rezident @ Sep 18 2007, 11:34)  Вычислять как отношение тактовой частоты к значению регистра перезагрузки. В вашем случае как F(ACLK)/(1000+1). Частота переключения выхода P1.1 будет Fout(P1.1)=F(ACLK)/(1000+1)/2 Чувствую что глупый вопрос, но чему это F(ACLK) будет равно на этом чипе?
|
|
|
|
|
Sep 18 2007, 08:58
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(AlexandrM @ Sep 18 2007, 12:39)  Вот есть 2К флеша с 0 по 2047 программа размером 512Б прошьется с Х адреса (с какого прошивается? как определить какая свободная?), т.е. с 512 по 2047 я могу использовать для хранения данных? С какого места и как программа будет располагеться во флэш описывается в xcl-файле, который используется линковщиком (пример для 430x149): // ------------------------------------------------------------------- // Information memory (FLASH) // ------------------------------------------------------------------- -Z(CODE)INFO=1000-10FF -Z(CODE)INFOA=1080-10FF -Z(CODE)INFOB=1000-107F // ------------------------------------------------------------------- // ROM memory (FLASH) // ------------------------------------------------------------------- // Code -Z(CODE)CSTART=1100-FFDF -Z(CODE)CODE,TAIVINT=1100-FFDF // Constant data -Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=1100-FFDF // Interrupt vectors -Z(CONST)INTVEC=FFE0-FFFF // ------------------------------------------------------------------- Там же описывается распределение RAM: // ------------------------------------------------------------------- // RAM memory // ------------------------------------------------------------------- -Z(DATA)DATA16_I,DATA16_Z,DATA16_N,HEAP+_HEAP_SIZE,UART_BUF=0200-0A00 -Z(DATA)CSTACK+_STACK_SIZE# Цитата(AlexandrM @ Sep 18 2007, 12:39)  Чувствую что глупый вопрос, но чему это F(ACLK) будет равно на этом чипе? Еще раз - читайте документацию, это все там подробно и понятно написано. Конкретно по этому вопросу - раздел - "Basic Clock Module". Например, в MSP430x1xx: "ACLK: Auxiliary clock. The ACLK is the buffered LFXT1CLK clock source divided by 1, 2, 4, or 8." Это касается и Вашего вопроса насчет того можно ли его использовать без внешнего кварца - кварц на ХТ1 НУЖЕН для ACLK. P.S. Конкретно под MSP430F2013 не стал скачивать документацию, проверьте сами совпадает ли написанное мной с описанием конкретно Вашего чипа, скорее всего да.
|
|
|
|
|
Sep 18 2007, 09:03
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(AlexandrM @ Sep 18 2007, 14:39)  Вот есть 2К флеша с 0 по 2047 программа размером 512Б прошьется с Х адреса (с какого прошивается? как определить какая свободная?), т.е. с 512 по 2047 я могу использовать для хранения данных? Неверные адреса! Распределение памяти смотрите в datashseet конкретного кристалла. Для MSP430F2013 распределение памяти такое (см. правую колонку в аттаче). Цитата(AlexandrM @ Sep 18 2007, 14:39)  Это не константы это очень редко меняющиеся данные. Про Information Memory понял, ее там 256Б (получается 2К + 256Б реально имеется?). А если нужно больше 256Б хранить? Основная суть вопроса вот в чем, имеется: - базовые параметры размером 300Б они нужны для работы (напр. Номер и Пользователь); - размер программы 1748Б; - итого вся память занята Рекомендую для такого случая использовать внешнюю м/с EEPROM. Для уменьшения энергопотребления можно запитать ее прямо от вывода любого порта MSP430. Цитата(AlexandrM @ Sep 18 2007, 14:39)  как IAR сказать чтобы разместил Номер и Пользователь например сразу за кодом программы при прошивке, чтобы я мог его использовать так void main { SN = ReadFlash(Addr_SN); USer = ReadFlash(Addr_User); } если не размещаять при прошивке нужно записать во флеш стартовые данные void main { SN = ReadFlash(Addr_SN); User = ReadFlash(Addr_User); if (SN == 0) { SN = 12345; User = 09876; } } но это как бы лишний код и памяти под него нет Не понял, что за такая функция ReadFlash? Константы можно адресовать непосредственно, зачем еще функцию для этого писать? Еще раз повторяю, чтобы константы разместить в одном месте используйте структуру. Т.е. оформите данные как структуру констант. Цитата(AlexandrM @ Sep 18 2007, 14:39)  итого: можно ли при прошивки размещать некоторые данные во флеше по определенным адресам? и как? Можно. Читайте документ MSP430 C/C++ Compiler Reference Guide из состава IAR  Цитата(AlexandrM @ Sep 18 2007, 14:39)  Чувствую что глупый вопрос, но чему это F(ACLK) будет равно на этом чипе? Поскольку вы не используете никаких процедур инициализации источников тактирования, то ACLK будет по-умолчанию от LFXT1CLK тактироваться, то бишь от часового кварца, который установлен на вашем EZ430.
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 18 2007, 09:41
|
Участник

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991

|
Цитата(rezident @ Sep 18 2007, 12:03)  Поскольку вы не используете никаких процедур инициализации источников тактирования, то ACLK будет по-умолчанию от LFXT1CLK тактироваться, то бишь от часового кварца, который установлен на вашем EZ430. Подскажите как обойтись без внешних кварцев?
|
|
|
|
|
Sep 18 2007, 10:45
|
Участник

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991

|
А существует какой-нибудь примерник элементарных кусков кода с разяснениями?
|
|
|
|
|
Sep 18 2007, 11:13
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(AlexandrM @ Sep 18 2007, 14:45)  А существует какой-нибудь примерник элементарных кусков кода с разяснениями? Настроим DCO (смотрите "Digitally-Controlled Oscillator (DCO)" в мануале): Код u08 ucGIF = __get_interrupt_state(); __disable_interrupt(); // запрет прерываний
// работаем от DCO, частоту на максимум: BCSCTL1 = RSEL0 | RSEL1 | RSEL2 | XT2OFF;
BCSCTL2 = 0; DCOCTL = DCO1 + DCO0 + DCO2; Init_timer_В(); __set_interrupt_state(ucGIF); // восстановление прерываний В результате внутренний осциллятор будет настроен на частоту около 7 МГц, внешние кварцы не используются, ACLK - в этом случае не работает, таймеры нужна включать от SMCLK: Код void Init_timer_В(void) { u08 ucGIF = __get_interrupt_state(); __disable_interrupt();
// Останов таймера TBCCR0 = 0;
// настройка TBCTL = TBSSEL_2 // Timer B clock source select: SMCLK | ID_3 // Timer B input divider: /8 | MC_1; // Up to CCR0 // используем только нулевой, остальные стоят TBCCTL0 = CM_0 | CCIS_2 | CCIE; // режим сравнения, вход захвата на землю, прерывание разрешено TBCCTL1 = 0; TBCCTL2 = 0; TBCCTL3 = 0; TBCCTL4 = 0; TBCCTL5 = 0; TBCCTL6 = 0;
// ну сюда вписать то число тактов, которое вам надо TBCCR0 = 0x1000; // Ft = F(SMCLK)/(1000+1)/2 TBCCR1 = 0; TBCCR2 = 0; TBCCR3 = 0; TBCCR4 = 0; TBCCR5 = 0; TBCCR6 = 0; __set_interrupt_state(ucGIF); } Но! DCO весьма нестабильно - от внешних условий может колебаться на 10%. Подробнее - в документации на Ваш контроллер. Поэтому и точность измерения времени будет соответствующая. Я однажды допустил ошибку - назначил для тактирования UART SMCLK от DCO - померил, осцильником частоту, вписал ее для расчета бодрэйта - усе было ОК. На следующее утро не мог понять почему нет связи с прибором, которая накануне была...
|
|
|
|
|
Sep 18 2007, 11:21
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(jorikdima @ Sep 18 2007, 13:53)  не использовать ACLK. Использовать например MCLK или SMCLK MCLK - частота собственно ядра: "MCLK is used by the CPU and system." Использовать его для периферии (таймеров, UART, SPI) - нельзя. "Читайте Basic Clock." (с)Ваше.
|
|
|
|
|
Sep 18 2007, 11:30
|
Участник

Группа: Новичок
Сообщений: 46
Регистрация: 9-07-07
Пользователь №: 28 991

|
Цитата(jorikdima @ Sep 18 2007, 14:17)  http://www.ti.com/litv/zip/slac015kи вообще поройтесь на сайте ТИ, много интересного... аппликухи там.. Есть это все, мучаю исходники. Но озарение не приходит пока  .
|
|
|
|
|
Sep 18 2007, 11:33
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Цитата(Юрий Санвальд @ Sep 18 2007, 15:21)  MCLK - частота собственно ядра: "MCLK is used by the CPU and system." Использовать его для периферии (таймеров, UART, SPI) - нельзя. "Читайте Basic Clock." (с)Ваше.  не готов отвечать за 2 семейство, так как работаю с 1. Что касается 1 семейства, то по крайней мере Ацп может тактироваться от MCLK. АЦП - перефирия. Это не принципиально... Цитата(AlexandrM @ Sep 18 2007, 15:30)  Есть это все, мучаю исходники. Но озарение не приходит пока  . что конкретно не получается? Про установку частоты куча примеров, да и выше привели.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|