Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: побайтный доступ к регистрам периферии
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
jorikdima
Здравствуйте.
Работаю с msp430f5418. Там куча периферии всякой и вот я споткнулся на ровном месте. Возьмем к примеру Таймер А, у которого есть такой регистр TA0CTL расположенный по адресу 0x340. Он 16 разрядный, но в UG сказано про все регистры Таймера да и не только:
Цитата
NOTE: All registers have word or byte register access. For a generic register ANYREG, the suffix
"_L" (ANYREG_L) refers to the lower byte of the register (bits 0 through 7). The suffix "_H"
(ANYREG_H) refers to the upper byte of the register (bits 8 through 15).

То есть насколько я понимаю, можно обратиться побайтно к старшей части слова TA0CTL, то есть по адресу 0x341.
Сделав такой код
Код
//UINT8* p = (UINT8*)0x341;
    //*p = 0x1;

то есть попытку записать 1 в младший бит старшего байта, компилятор сделал вполне валидную команду
Код
mov.b #1, &0x341

Но исполнение этой команды привело к записи единицы в младший бит младшего байта регистра. Почему? Тоже самое с регистрами DMA. А вот если в обычную RAM писать ровно такими же командами, то все хорошо.
Спасибо.
Сергей Борщ
Цитата(jorikdima @ Jan 4 2010, 12:13) *
Но исполнение этой команды привело к записи единицы в младший бит младшего байта регистра. Почему?
Такое поведение было характерно для до-54xx серий. Вы смотрели в железе или симуляторе? Если в железе - надо писать в техподдержку. Если в симуляторе - сами знаете wink.gif
jorikdima
Цитата(Сергей Борщ @ Jan 4 2010, 13:44) *
Такое поведение было характерно для до-54xx серий. Вы смотрели в железе или симуляторе? Если в железе - надо писать в техподдержку. Если в симуляторе - сами знаете wink.gif

В железе смотрел, правда через дебаггер. Можно конечно вычитать значение регистра железа в переменную какую-нибудь, мало ли как дебаггер там смотрит smile.gif. Но в целом спасибо, понял, вроде проблема не во мне.
Вообще с 5418 я тут так пляшу сейчас... какие то непонятные вещи он творит вообще.
mdmitry
Код
//UINT8* p = (UINT8*)0x341;
//*p = 0x1;

Может воспользоваться мнемоническими именами регмстров из заголовочного файла.
Работаю с 5437. Проблем не было, были проблемы с оптимизирующим компилятором от IAR. Таймер B работает строго по описанию.
Прочитайте errata а кристалл, там много про отладку. Я дебагер использовал с осторожностью.
jorikdima
Цитата(mdmitry @ Jan 5 2010, 00:48) *
Может воспользоваться мнемоническими именами регмстров из заголовочного файла.
Работаю с 5437. Проблем не было, были проблемы с оптимизирующим компилятором от IAR. Таймер B работает строго по описанию.
Прочитайте errata а кристалл, там много про отладку. Я дебагер использовал с осторожностью.

Да я естественно с мнемонических имен и начал, тут специально привел явный адрес ибо проблема именно в нечетности адреса байта. Про дебаггер не читал с таком талмуде (других слов нет) на 5х серию, посмотрю.
SanvaldYV
Цитата(jorikdima @ Jan 4 2010, 13:54) *
Вообще с 5418 я тут так пляшу сейчас... какие то непонятные вещи он творит вообще.


А если не секрет, с чем именно возникли сложности? Я тоже с 5418 работал, использовал только таймера, АЦП (без ДМА), УАРТ и еще во флэш писал (как в инфо-мемори так и в другие сектора), все работало в адекватно и в соответствии с мануалом. А у Вас с какой периферией трудности?
jorikdima
Цитата(Юрий Санвальд @ Jan 11 2010, 10:44) *
А если не секрет, с чем именно возникли сложности? Я тоже с 5418 работал, использовал только таймера, АЦП (без ДМА), УАРТ и еще во флэш писал (как в инфо-мемори так и в другие сектора), все работало в адекватно и в соответствии с мануалом. А у Вас с какой периферией трудности?

Да в общем ляпнул не поделу smile.gif На вышеупомянутой проблемме все и ограничилось. Сейчас в поддержку ТИ пишу, о результатах сообщу.
Все сложности были по моей причине (прерывание приходило, котороя я не ждал smile.gif ) и по причине наличия ассемблерного модуля софтового RTC (из древних примеров ТИ), которые надо тоже портировать на MSP430X, а я этого не сделал.
В общем софт свой портировал - вроде живет (UART, SPI, DMA, ADC12, TimerA, WDT, MPY).
mdmitry
jorikdima, Вы примеры для 5438 от TI посмотрите для работы с RTC (slac227f и slac166m)
jorikdima
Цитата(mdmitry @ Jan 11 2010, 14:23) *
jorikdima, Вы примеры для 5438 от TI посмотрите для работы с RTC (slac227f и slac166m)

Это я видел. Раньше я на 1611 был, там аппаратного RTC не было, я софтовый пользовал от ТИ, а он на асме.
jorikdima
Переписываюсь с саппортом. То ли я чего то не понимаю, то ли саппорт, рассудите плиз. Вот наша переписка:

Я:
Цитата
In the User Guide for MSP430F54XX said (for example for TimerA): NOTE: All registers have word or byte register access. For a generic register ANYREG, the suffix "_L" (ANYREG_L) refers to the lower byte of the register (bits 0 through 7). The suffix "_H" (ANYREG_H) refers to the upper byte of the register (bits 8 through 15). So it means that e.g. register TA0CTL which is 16 bit width can be byte accessed either MSB byte or LSB byte. So I tried to modify only MSB byte using the following simple code: unsigned char* p = (unsigned char*)0x341; *p = 0x1; But as the result only LSB byte was was modified. This is true also e.g. DMA registers and I suppose for all periphery registers. If try to modify simple RAM memory region such way no problem occurs. msp430f5418 rev L was used. Is there byte access to periphery registers in 5x uC?

Они:
Цитата
Why do you use 'char' here - which is a 8 bit size variable?
I would recommend to use e.g. the predefined values for setting to TA0CTL which can be found in header files or also in TI code examples.

Я:
Цитата
The sample code that I wrote in my question was just to illustrate the problem I had. The problem was with writing periphery registers which are located at odd addresses. Just for illustration I took TimerA and wrote value to TA0CTL using explicit address 0x341. In my main code of course I use predefined values such as TA0CTL etc.
So my question is: if it is possible to have byte access to periphery registers in MSP430F54xx as it declared in UserGuide? Or may be I didn't understand something.

Они:
Цитата
I think the problem is caused as you are using 'char' in your code which is a 8bit variable.
In the examples I sent you can see it's possible to address 16 bit - could you please test your code without usage of 'char'?

Я:
Цитата
But why I can not use 'char' (8bit) in case I want to access only byte??
Ok, let's abstract our mind from C language. Can I access periphery registers using this assembler code:
mov.b #1, &0x341
where 0x341 is the explicit address of the odd part of TA0CTL? According to UserGuide I thought that "yes, I can." But really this command changes only even part of TA0CTL (at 0x340 address).

Они:
Цитата
Please be aware that you need to use the MOV.W command to have access/write to this registers. There are several code examples which show e.g.
mov.w #128,&TA1CCR0 ; PWM Period/2
mov.w #OUTMOD_6,&TA1CCTL1 ; CCR1 toggle/set
mov.w #32,&TA1CCR1 ; CCR1 PWM duty cycle
mov.w #OUTMOD_6,&TA1CCTL2 ; CCR2 toggle/set
mov.w #96,&TA1CCR2 ; CCR2 PWM duty cycle
mov.w #TASSEL_2 + MC_3 + TACLR,&TA1CTL

In header file you find the addresses of this registers e.g.
#define TA0CTL_ (0x0340) /* Timer0_A5 Control */
DEFCW( TA0CTL , TA0CTL_)
#define TA0CCTL0_ (0x0342) /* Timer0_A5 Capture/Compare Control 0 */
DEFCW( TA0CCTL0 , TA0CCTL0_)
#define TA0CCTL1_ (0x0344) /* Timer0_A5 Capture/Compare Control 1 */
DEFCW( TA0CCTL1 , TA0CCTL1_)
#define TA0CCTL2_ (0x0346) /* Timer0_A5 Capture/Compare Control 2 */
DEFCW( TA0CCTL2 , TA0CCTL2_)
#define TA0CCTL3_ (0x0348) /* Timer0_A5 Capture/Compare Control 3 */
DEFCW( TA0CCTL3 , TA0CCTL3_)
Not sure where exactly you do see a problem - maybe you can give me some more background?


Почему мне говорят, что я для побайтного доступа должен пользоваться mov.w а не mov.b???
Я чего-то не понимаю? Может я не понимаю, что такое побайтный доступ (byte register access). Я так полагал, что могу обратиться как для чтения, так и для записи к любому регистру (речь о перефирийных), независимо от того по четному адресу он расположен или нечетному и к любой части регистра (младшие 8 бит или старшие 8 бит 16 разрядного регистра). Я правильно понимаю термин?
Спасибо.
Сергей Борщ
Цитата(jorikdima @ Jan 22 2010, 14:45) *
Почему мне говорят, что я для побайтного доступа должен пользоваться mov.w а не mov.b???
Потому что вы в первом письме вывалили на него слишком много информации, которую он просмотрел по диагонали. Зацепился глазом за TA0CTL и 8 бит и теперь пытается донести до вас, что TA0CTL - 16-битный, со всеми вытекающими. Сформулируйте вопрос более кратко: "Я пишу в TA0CTL_H, а значение попадает в TA0CTL_L. Какого фига?" Вопрос о байтовости отпадет сам. Можете сослаться на таблицу 12-3 усер гада. "К черту подробности" о том, что это части одного 16-битного регистра.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.