Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/56: Рейтинг темы: голосов - 56, средняя оценка - 4.73
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041

MSP430F5xx новичкам

13.01.2014, 11:03. Показов 11824. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обещал ещё до праздников написать работу с таймерами микроконтроллеров семейства MSP430F5xx (у меня был микроконтроллер MSP430F5435a и MSP430F5435). Несмотря на то, что вряд-ли кто-то из новичков начнёт знакомство именно с контроллеров MSP430, всё же попробую ориентировать это всё на "полных новичков", т.к. сам таковым являюсь

Была задача запустить таймер и вызывать по таймеру прерывания каждые 10 мкс. Для этого нужно:
Итак, вооружившись всем необходимым, начнём. Открываем IAR , нажимаем "create new project", выбираем папку, где будет храниться наш проект и даём ему какое-нибудь имя. Далее в опциях нашего проекта в "Device" выбираем наш микроконтроллер и видим такой код:
C
1
2
3
4
5
6
7
#include "io430.h"
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  return 0;
}
#include "io430.h - препроцессор, который подключает заголовочный файл io430.h к нашему проекту, в свою очередь если вы откроете этот файл, то увидите в нем можество различных #ifndef #define и т.д. - всё это обёртки для подключения другого заголовочного файла, необходимого для работы нашего микроконтролера (в нём описаны различные регистры, адреса и т.д.). Нампериодически будет необходимо залезать в этот файл, поэтому для удобства мы подключим его к нашему проекту вместо io430.h. Для этого открываем хедер "io430.h" и ищем там наш контроллер (наверху в IAR есть строка поиска, в которую достаточно написать "5435" и мы быстро найдём то что нас интересует, в данном случае нам нужна строка #include "io430f5435.h") и заменяем строку:
C
1
#include "io430.h"
на
C
1
#include "io430f5435.h"
Теперь приступаем к инициализации нашего микроконтроллера. Для этого нужно настроить модуль синхронизации - Unified Clock System (UCS). Открываем 5 главу Guide, читаем, описывать всю его работ я не буду, - он весьма гибок и это займет много времени.Скажу лишь, что для нашей задачи необходимо инициализировать сигнал SMCLK от DCOCLK, который, в свою очередь, автоматически настраивается на частоту 2.097152 MHz после старта микроконтроллера. Для того, чтобы понять, что же мы сделали, необходимо открыть Guide, найти в конце 5-й главы описание регистра UCSCTL4 и посмотреть что же мы включили.

Пишем в наш проект следующее:
C
1
2
3
UCSCTL4=SELM_3|SELS_3;
// SELM_3 - MCLK работает от DCOCLK; fDCOCLK = 2.097152 MHz. 
// SELS_3 - SMCLK работает от DCOCLK;
Далее необходимо настроить сам таймер, в нашем контроллере их несколько, для своих нужд я взял TimerA0. Во-первых - необходимо понимать, как работает таймер (счётчик таймера независимо от выполнения программы, если в ходе программы не менять его настройки, считает до определённого момента, после чего вызывает прерывание). Наш таймер является 16-ти битным, это означает, что он способен считать от 0 до 65536. Теперь прикинем следующее: наш таймер будет тратить на каждую итерацию счетчика 1/2097152 секунд, т.е. примерно 0.476 мкс. Для того, чтобы получить 10 мс нам необходимо чтобы счётчик считал до какого-то числа Х.

Можно сделать это по-разному. Я написал простенький код на С++ в CodeBlocks, смысл его прост - в цикле считаем до момента, когда умножение 0.476 мкс на счётчик нашего таймера (в данном случае это i) не будет больше 10000 (10 в 3-й степени, т.к. считаем мы в мкс:
C++
1
2
3
4
    double a=1*pow(10.,6)/2097152;
    for (int i=10000;i<65536;i++)
        if ((a*i)<10000)
        cout <<  i << endl;
Что ж, последнее, что мы получаем, это число 20972 или в шестнадцатиричной форме 0x51EC. Именно это число мы записываем в регистр TA0CCR0, а чтобы при достижении этого числа вызывалось прерывание, записываем следующее:
C
1
2
3
4
5
6
7
TA0CCR0=0x51EC;   // регистр счётчика, до которого мы будем считать
TA0CCTL0|=CCIE // CCIE - разрешение прерываний по достижении TA0CCR0; 
TA0CTL|=TASSEL1|MC0|TACLR;
// TASSEL1 - тактирование от SMCLK
// MC0 - счет от 0000h до TAxCCR0
// TACLR - обнуление таймера-счётчика
__enable_interrupt();         // здесь мы разрешаем маскеруемые прерывания, к которым относится и наш таймер (Это функция именно IAR'a , для других IDE есть примерно тоже самое)
На данный момент наш код должен выглядеть так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "io430f5435A.h"
int main( void )
{
UCSCTL4=SELM_3|SELS_3;
TA0CCR0=0x51EC;   
TA0CCTL0|=CCIE; // CCIE - разрешение прерываний по достижении TA0CCR0; 
TA0CTL|=TASSEL1|MC0|TACLR;
// TASSEL1 - тактирование от SMCLK
// MC0 - счет от 0000h до TAxCCR0
// TACLR - обнуление таймера-счётчика
__enable_interrupt();    
  while(1)
  {
  }
}
Далее необходимо как-то описать обработчик прерываний, это можно сделать следующим образом(напишу подробно, чтобы понимать как работать с картой векторов прерываний). Открываем наш даташит, клацаем Ctrl+F, пишем в поиск Interrupt Vector Addresses, там ищем наш таймер ТА0 и наше прерывание - TA0CCR0, копируем адрес 0FFECh (в IAR представление числа будет записываться 0xFFEC), далее в IAR открываем хедэр нашего микроконтроллера io430f5435.h, ищем через поиск наш адресс 0xFFEC и находим там следующее:
C
1
#define TIMER0_A0_VECTOR    (54 * 2u) /* 0xFFEC Timer0_A5 CC0 */
Далее для того, чтобы написать обработчик прерываний необходимо написать такую строку
C
1
2
3
4
5
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER_A0(void)   // прерывание по флагу TA0CCR0 CCIFG0
{
// операторы и т.п.
}
Поясню: #pragma vector = TIMER0_A0_VECTOR - даёт понять компилятору, что следующая строка будет описывать прерывание по флагу таймера А0 по флагу TA0CCR0 CCIFG0, а __interrupt void "любое название"(void) уже сам заголовок прерывания.

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "io430f5435A.h"
 
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER_A0(void)   // прерывание по флагу TA0CCR0 CCIFG0
{
// операторы и т.п.
}
 
int main( void )
{
UCSCTL4=SELM_3|SELS_3;
TA0CCR0=0x51EC;   
TA0CCTL0|=CCIE;
TA0CTL|=TASSEL1|MC0|TACLR;
__enable_interrupt();    
  while(1)
  {
  }
}
Прошу не ругаться и подредактировать написанное
2
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2014, 11:03
Ответы с готовыми решениями:

Полезное новичкам
Всем доброго времен суток) Для бакалаврской срочно понадобилось научиться кодить под атмелевский at91sam7x256/128 в uvision 4. Был...

Новичкам
Подкиньте хороших ссылок !!! Лучших на Ваш взгляд статей для начинающих Ну и хотя-бы словарь сленга (&quot;морды&quot;... ) :P

Помощь Новичкам Си/С++
Здравствуйте, в очередной раз возникают вопросы с изучением программирования на языке Си/С++. Ищу человека опытного, который мог бы...

11
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
13.01.2014, 15:33
Скриншоты добавьте. Подредактировал.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
13.01.2014, 15:43  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
Скриншоты добавьте.
как? не могу редактировать пост
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
13.01.2014, 23:31
...приложите, отредактирую или заявку на кураторство темы.

Добавлено через 7 часов 32 минуты
Так как, 1 или 2?
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
13.01.2014, 23:43  [ТС]
лучше 2, я бы кое-что подредактировал, дополнял бы постепенно новыми вещами т.к. мне ещё работать с ними порядочно придётся
0
14.01.2014, 13:41

Не по теме:

Вам дан статус куратора темы. Удачи.

0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
22.06.2014, 13:58
Уроки по MSP430 http://www.shelezyakin.ru
2
0 / 0 / 0
Регистрация: 26.07.2016
Сообщений: 1
27.07.2016, 10:21
хочу поблагодарить за краткость и полезную информацию.
Прилагаю ссылку на MSP430USBDevelopersPackage
http://my-files.ru/qkpgue
0
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 3
05.10.2016, 16:24
Спасибо за уроки, это то что нужно было!
0
0 / 0 / 0
Регистрация: 30.07.2019
Сообщений: 2
30.07.2019, 17:33
Вы только в IAR Embedded Workbench работали? Под linux не поможете Msp430_programming ?
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
04.08.2019, 14:17  [ТС]
я уже года 3.5 как пишу на java, к сожалению. не могу помочь, на тот момент когда я писал этот пост я не помню вариантов под linux
0
0 / 0 / 0
Регистрация: 26.09.2022
Сообщений: 2
26.09.2022, 08:51
это выглядит очень красивой нитью. у вас есть опыт работы с MSP430F449?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.09.2022, 08:51
Помогаю со студенческими работами здесь

SEO новичкам
Почитал раздел по сео увидел что у пользователей много мелких вопросов с эти связанных. Вот пришла идея создать темку в которой будут...

Помощь новичкам
Доброго дня всем уважаемые сис-админы) !!! Пишет Вам новичок в использовании Linux-Unix ОСей. На работе вот делать нечего почти...

совет новичкам
Все знают что на выдачу в поисковике влияют ссылки, но возможно не все новички знают почему. Так вот в интернете как и все как в жизни...

Новичкам в Python
Этот пост я посвятил тому чтобы предостеречь новичков которые начали изучать Python в надежде зарабатывать удалённо от ошибки, которую...

Рыбалка на С++. (Новичкам от новичка)
Вспоминал давно забытый С++, решил написать маленькую программку. (Распаковать в отдельную папку). Также хочу поделиться исходным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Кэш REDIS и C#
UnmanagedCoder 01.06.2025
Redis (Remote Dictionary Server) - это ультраскоростное хранилище данных в оперативной памяти, работающее по принципу "ключ-значение". Суть проста: данные хранятся не на диске, а прямо в RAM, что. . .
Lenovo IH110CX Rev 1.0 user manual
Maks 01.06.2025
Размещения без повторений
VistaSV30 31.05.2025
Код возвращает список вариантов размещений A^{k}_{n}=\frac{n!}{(n-k)!} from itertools import permutations def pwr(k, n): # Размещение без повторений (Placement without repetition) if k. . .
Redis и Node.js с TypeScript - решения для высоконагруженных систем
Reangularity 31.05.2025
Redis (Remote Dictionary Server) — сверхбыстрое хранилище данных в памяти, способное обрабатывать операции за микросекунды. И что особенно важно для нас — с удивительно простым API. А теперь. . .
Unit-тестирование с моками в Go
golander 31.05.2025
Большинство разработчиков предпочитают тестировать код без использования моков. Например, при интеграции с Elasticsearch логичнее запустить контейнер локально и тестировать Go-код непосредственно с. . .
Как работать с PDF в C#
stackOverflow 31.05.2025
Нам приходится сталкиваться с PDF по разным причинам. Генерация счетов, создание отчетов, извлечение данных из загруженных пользователем документов, автоматизация рабочих процесов - это лишь верхушка. . .
Двухбуквенные коды стран в шифровании.
russiannick 31.05.2025
Человечество издревле манила возможность замены сочетаний букв вымышленными символами, делающие сообщение понятным только для посвещенных. Настала пора внести в это свой вклад. Двухбуквенные коды. . .
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона.
Programma_Boinc 31.05.2025
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона. Хотел бы поделиться опытом в исправлении ошибки приложения в части заряда батареи смартфона. Сразу скажу, что. . .
Добро пожаловать на конкурс PrimeGrid, посвященный 20-летию PrimeGrid
Programma_Boinc 31.05.2025
Добро пожаловать на конкурс PrimeGrid, посвященный 20-летию PrimeGrid: 5-дневный обобщенный поиск простых чисел Ферма n = 20 с 12 июня 20:20 UTC по 17 июня 20:20 UTC. 12 июня 2005 года. . .
Вероятность в шансы / Шансы в вероятность
VistaSV30 31.05.2025
# Шансы -> Вероятность def Chance_to_Probability(ch): def gcd(a, b): # НОД - нужен для упрощения значений шансов while b != 0: a, b = b, a % b return a. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »