|
побайтный доступ к регистрам периферии, он есть или нет? |
|
|
|
Jan 4 2010, 10:13
|

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

|
Здравствуйте. Работаю с 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 писать ровно такими же командами, то все хорошо. Спасибо.
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Jan 4 2010, 21:48
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Код //UINT8* p = (UINT8*)0x341; //*p = 0x1; Может воспользоваться мнемоническими именами регмстров из заголовочного файла. Работаю с 5437. Проблем не было, были проблемы с оптимизирующим компилятором от IAR. Таймер B работает строго по описанию. Прочитайте errata а кристалл, там много про отладку. Я дебагер использовал с осторожностью.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jan 11 2010, 07:44
|
Частый гость
 
Группа: Свой
Сообщений: 125
Регистрация: 21-03-07
Из: Санкт-Петербург
Пользователь №: 26 371

|
Цитата(jorikdima @ Jan 4 2010, 13:54)  Вообще с 5418 я тут так пляшу сейчас... какие то непонятные вещи он творит вообще. А если не секрет, с чем именно возникли сложности? Я тоже с 5418 работал, использовал только таймера, АЦП (без ДМА), УАРТ и еще во флэш писал (как в инфо-мемори так и в другие сектора), все работало в адекватно и в соответствии с мануалом. А у Вас с какой периферией трудности?
|
|
|
|
|
Jan 11 2010, 08:03
|

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

|
Цитата(Юрий Санвальд @ Jan 11 2010, 10:44)  А если не секрет, с чем именно возникли сложности? Я тоже с 5418 работал, использовал только таймера, АЦП (без ДМА), УАРТ и еще во флэш писал (как в инфо-мемори так и в другие сектора), все работало в адекватно и в соответствии с мануалом. А у Вас с какой периферией трудности? Да в общем ляпнул не поделу  На вышеупомянутой проблемме все и ограничилось. Сейчас в поддержку ТИ пишу, о результатах сообщу. Все сложности были по моей причине (прерывание приходило, котороя я не ждал  ) и по причине наличия ассемблерного модуля софтового RTC (из древних примеров ТИ), которые надо тоже портировать на MSP430X, а я этого не сделал. В общем софт свой портировал - вроде живет (UART, SPI, DMA, ADC12, TimerA, WDT, MPY).
|
|
|
|
|
Jan 22 2010, 12:45
|

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

|
Переписываюсь с саппортом. То ли я чего то не понимаю, то ли саппорт, рассудите плиз. Вот наша переписка: Я: Цитата 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 разрядного регистра). Я правильно понимаю термин? Спасибо.
|
|
|
|
|
Jan 22 2010, 13:11
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(jorikdima @ Jan 22 2010, 14:45)  Почему мне говорят, что я для побайтного доступа должен пользоваться mov.w а не mov.b??? Потому что вы в первом письме вывалили на него слишком много информации, которую он просмотрел по диагонали. Зацепился глазом за TA0CTL и 8 бит и теперь пытается донести до вас, что TA0CTL - 16-битный, со всеми вытекающими. Сформулируйте вопрос более кратко: "Я пишу в TA0CTL_H, а значение попадает в TA0CTL_L. Какого фига?" Вопрос о байтовости отпадет сам. Можете сослаться на таблицу 12-3 усер гада. "К черту подробности" о том, что это части одного 16-битного регистра.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|