Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
#1

MSP430F5xx новичкам

13.01.2014, 11:03. Просмотров 6361. Ответов 8
Метки нет (Все метки)

Обещал ещё до праздников написать работу с таймерами микроконтроллеров семейства 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2014, 11:03
Ответы с готовыми решениями:

Полезное новичкам
Всем доброго времен суток) Для бакалаврской срочно понадобилось научиться...

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

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

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

В помощь новичкам ЗиК
Проблемы при создании Внешнего отчета а верней с описанием языкА? непонимаем в...

8
raxp
10180 / 6563 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
13.01.2014, 15:33 #2
Скриншоты добавьте. Подредактировал.
0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
13.01.2014, 15:43  [ТС] #3
Цитата Сообщение от raxp Посмотреть сообщение
Скриншоты добавьте.
как? не могу редактировать пост
0
raxp
10180 / 6563 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
13.01.2014, 23:31 #4
...приложите, отредактирую или заявку на кураторство темы.

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

Не по теме:

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

0
raxp
10180 / 6563 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
22.06.2014, 13:58 #7
Уроки по MSP430 http://www.shelezyakin.ru
2
Wladan
0 / 0 / 0
Регистрация: 26.07.2016
Сообщений: 1
27.07.2016, 10:21 #8
хочу поблагодарить за краткость и полезную информацию.
Прилагаю ссылку на MSP430USBDevelopersPackage
http://my-files.ru/qkpgue
0
Virtor Sokolov
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 3
05.10.2016, 16:24 #9
Спасибо за уроки, это то что нужно было!
0
05.10.2016, 16:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2016, 16:24

Ресурсы для практики новичкам
Доброго всем времени суток, форумчане. Постараюсь объяснить смысл заголовка...

По каким книгам заниматься новичкам?
В С++ я полный 0 , но хотел бы его изучить , но того кто поможет нет, выход...

Класс TThread (новичкам будет интересно)
Доброе утро! Юзал вчера потоки. Конкретно интересовал вопрос передачи...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru