Перейти к содержанию
    

Глюк компилятора в CCS v3.3

Пришлось скачать даташит. Угу. MCU 32-битный, но у него Гарвардская, а не фон Немановская архитектура. Так что нечетные адреса периферии вполне имеют право существовать. Но насколько правомочно при этом использовать 32-х битный int при обращении к 16-и битным периферийным регистрам? Это вопрос для меня не совсем ясный. Может все же 16-и битный unsigned char для этого корректнее было бы использовать? Думаю что при обращении с помощью int к нечетным 16-и битным адресам компилятор может автоматически оптимизировать, выравнивая их на границу 32-х битного слова. Поэтому и происходит промашка с адресацией регистров. Попробуйте все же char использовать.

Про резервирование таймера. Везде указано, что только Timer2 зарезервирован для DSP/BIOS. Где вы про резервирование Timer1 увидели?

Кстати, при внимательном рассматривании таблицы адресов видно, что все 32-х разрядные регистры таймеров расположены по четным адресам. По нечетным расположены только 16-и битные "половинки" этих регистров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но насколько правомочно при этом использовать 32-х битный int при обращении к 16-и битным периферийным регистрам? Это вопрос для меня не совсем ясный. Может все же 16-и битный unsigned char для этого корректнее было бы использовать? Думаю что при обращении с помощью int к нечетным 16-и битным адресам компилятор может автоматически оптимизировать, выравнивая их на границу 32-х битного слова.

Во первых, на скриншоте виден асм код. Адреса там именно те, которые нужно.

Во вторых, unsigned int 16ти битный.

А вот char обычно 8ми, это в CCS он 16ти битный, что тоже вписывается в стандарт.

Везде указано, что только Timer2 зарезервирован для DSP/BIOS. Где вы про резервирование Timer1 увидели?

Дока TMS320x2833x, 2823x System Control and Interrupts see page 132

Кстати, при внимательном рассматривании таблицы адресов видно, что все 32-х разрядные регистры таймеров расположены по четным адресам. По нечетным расположены только 16-и битные "половинки" этих регистров.

Для объединения некоторых с их половинками, я и использовал unsigned long, который уже 32х битный.

Проблема в том, что я пишу в TIMER2TCR с адресом 0x0C14(чётный!!!!)!

Но почему-то значение TIMER2TPR с адресом 0x0C16(тоже чётный) получается равным тому-же TIMER2TCR!

При присвоении TIMER2TPR=0 - ничего не происходит. А мне нужно, чтобы в нём был именно 0! Иначе ниего не работает.

 

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

 

Я считаю, что это либо ошибка документации, либо самого чипа..Хотя верить в это не хочется!

Нужен взгляд со стороны. Может я действительно что-то упустил!?!?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если использовать #define аппарат, то документированное объявление регистров выглядит следующим образом (SPRAA85A):

#define DEF_REG (volatile Unit16 *) 0x5A5A // 0x5A5A       Def_reg register

Да и вообще зачем этот #define аппарат, неужели в TI еще lib с битовыми полями под Ваш проц не выпустили?

Нет. Посмотрел. Выпустили: sprc530

Качайте смотрите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то у Вас вроде все легально (относительно C) написано. Однако смотрю пример из либов от TI

там

// Initialize timer period to maximum:
    CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;
    CpuTimer2Regs.PRD.all  = 0xFFFFFFFF;
    // Make sure timers are stopped:
    CpuTimer1Regs.TCR.bit.TSS = 1;             
    CpuTimer2Regs.TCR.bit.TSS = 1;             
    // Reload all counter register with period value:
    CpuTimer1Regs.TCR.bit.TRB = 1;             
    CpuTimer2Regs.TCR.bit.TRB = 1;

Смотрите третью строчку снизу. Иными словами сначала уст. период, затем делаем релоад.

Хотя, опять поторопился похоже...

Все у Вас вроде тип топ. Смущает только то, что вы обращаетесь к PRD по 16 битным половинкам.

Изменено пользователем PhX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил. На 2812 все нормально работает.

Проверял как с помощью #define (пример прилагается), так и спомощью аппарата битовых полей.

timers.zip

Изменено пользователем PhX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил. На 2812 все нормально работает.

Проверял как с помощью #define (пример прилагается), так и спомощью аппарата битовых полей.

Всё дело в том, что timer0 работает отлично! И именно с таким-же подходом к нему!

timers.c

void _InitCpuTimer(int tmr)
//Инициализирует соответствующий таймер
{
    // CPU Timer 0
    if(tmr==0){
        // Период на максимум
        TIMER0PRD32 =0xFFFFFFFF;
        //Частоту SYSCLKOUT пока далить не на что не будем
        TIMER0TPR=0;
        TIMER0TPRH=0;
        //Таймер пока должен стоять!
        TIMER0TCR|=BIT4; //TSS в еденицу!
        //Перезагрузить регистры таймера(применить вышепроведенные настройки)
        TIMER0TCR|=BIT5; //TRB = 1
        #ifdef DEBUGMD
            TIMER0TCR&=BIT10+BIT11 ^ 0xFFFF;  //Поставим в HARD STOP режим
        #endif
    }
    if(tmr==1){
        // Период на максимум
        TIMER1PRD32 =0xFFFFFFFF;
        //Частоту SYSCLKOUT пока далить не на что не будем
        TIMER1TPR=0;
        TIMER1TPRH=0;
        //Таймер пока должен стоять!
        TIMER1TCR|=BIT4; //TSS в еденицу!
        //Перезагрузить регистры таймера(применить вышепроведенные настройки)
        TIMER1TCR|=BIT5; //TRB = 1
        #ifdef DEBUGMD
            TIMER1TCR&=BIT10+BIT11 ^ 0xFFFF;  //HARD STOP
        #endif
    }
    if(tmr==2){
        // Период на максимум
        TIMER2PRD32 =0xFFFFFFFF;
//        TIMER2PRDH=0xFFFF;   
        //Частоту SYSCLKOUT пока далить не на что не будем
        TIMER2TPR=0;
        TIMER2TPRH=0;
        //Таймер пока должен стоять!
        TIMER2TCR|=BIT4; //TSS в еденицу!
        //Перезагрузить регистры таймера(применить вышепроведенные настройки)
        TIMER2TCR|=BIT5; //TRB = 1
        TIMER2TPR=0; // [b]а это для проверки[/b] но он всё равно не хочет быть 0
        #ifdef DEBUGMD
            TIMER2TCR&=BIT10+BIT11 ^ 0xFFFF;  //HARD STOP 
        #endif
    }
}

Битовые поля не использую, можно сказать, из религиозных соображений :)

Ваш пример у меня работает. watch показывает, что всё хорошо.

Странно всё это. Буду копать дальше...в чём может быть дело.....

Просто я в #define делаю разименование указателя, а у вас по тексту * ставится.

Разницы быть не должно никакой, но я попробую и так...

Вроде асм код ведь нормальный генерится! Почему-же не работает-то?!?!

Вот что напрягает!

Все у Вас вроде тип топ. Смущает только то, что вы обращаетесь к PRD по 16 битным половинкам.

Да нет же. Я PRD наоборот объявил как unsigned long и обозвал его TIMER2PRD32, чтоб не маяться с половинками.

TIMER2TPR(TIMER2TPRH) мне не нужны - я их оставил int'ами....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил. На 2812 все нормально работает.

Проверял как с помощью #define (пример прилагается), так и спомощью аппарата битовых полей.

Я ничего не понимаю :05:

ПОСМОТРИТЕ НА ЭТО БЕЗОБРАЗИЕ!post-35751-1211286335_thumb.jpg

Когда создаю новый проект(или открываю пример) - всё работает!

Как только всё то-же самое проделываю в существующем проекте, то вообще ничего не фурычит ))

Даже уже первым оператором в main() поставил присвоение - и всё равно результат потрясает!

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

HEEEELP!!!!! :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно в железе!

Причем я же говорю - это проявляется только на этом проекте.

Я уже build options все перепроверил, codeStartBranch.asm стандартный, далее main() и на тебе!

Нужно как-то разобраться со всем этим.

Могу выложить доп. скрины, .map, исходники - всё, что нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да дался Вам этот нулевой бит в TIMERxTCR. В http://www.ti.com/litv/pdf/sprufb0a черным по белому написано:

с 3-го по 0-й бит reserved, это значит тьфу на них пусть с ними железяка че хочет то и делает, нам на это наплевать, она же вам четвертый бит не меняет, таймер в стопе, что еще нужно-то. :)

 

Анекдот в тему:

Сын подходит к отцу програмеру. Отец находится в крутом дебаге.

Сын - "Пап, а почему солнце встает всегда на востоке?".

Папа - "Точно всегда...? Точно на востоке...?".

Сын - "Да".

Папа - "Значит все работает нормально, ничего сынок не трогай.".

Изменено пользователем PhX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Анегдот классный.

Про то, что с нулевого по третий reserved - я как-то не подумал.

Значит на данный момент ситуация такая: если всё делать в самом начале, в main() - всё работает. Если в функции timerInit - не работает.

В регистрах(через один) одинаковое значение, которое не выбить ничем.

Конечно, я буду проверять, но какие могут быть ошибки?

Сами регистры задефайнены в одном хидере и просто используются в разных местах... При этом timer0 работает нормально, а timer1 и 2 не хотят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит на данный момент ситуация такая: если всё делать в самом начале, в main() - всё работает. Если в функции timerInit - не работает.

В регистрах(через один) одинаковое значение, которое не выбить ничем.

Конечно, я буду проверять, но какие могут быть ошибки?

Сами регистры задефайнены в одном хидере и просто используются в разных местах... При этом timer0 работает нормально, а timer1 и 2 не хотят.

Выложите все файлы проекта в архиве. Поглядим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался.

У меня в проекте, отключаются клоки ненужной переферии. В этот список попали и таймеры 1 и 2.

Включил - всё заработало! )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...