Начал пробовать uC/OSII для 430F5xx. Как обычно начал с мигания светодиода. Сразу затык. Не совпадает частота мигания светодиода с расчетной. Итак по порядку: компилятор IAR C/C++ Compiler for MSP430 4.20.1 [Evaluation] (4.20.1.20017) Операционка: uC/OS-II Version : V2.87 Тики считаются от WDT. Исходный код - пример порта для MSP430F5438 с сайта uC/OSII.
В файле MSP430x54x.h ввел строки: #define WDT_ADLY_1000_wad (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS__64+WDTSSEL__ACLK) /*wad 1.95ms */ т.е. тактируем от ACLK, делим на 64 = получаем 512 Гц.
В файле os_cfg.h ввел строки: #define OS_TICKS_PER_SEC 512 /*wad тики берем с кварца 32768 Гц */ т.е. 512 тиков в секунду
В файле bsp.c ввел строки: в процедуре TMR_TickInit: WDTCTL = WDT_ADLY_1000_wad; //от ACLK 32 кГц - т.е запускаются тики таймера
В файле app.c ввел строки: в процедуре AppTaskStart: while (1) { /* Task body, always written as an infinite loop. */ AppDispUpdate(); OSTimeDlyHMSM(0, 0, 1, 0); P1OUT ^= 0x1;//wad - добавленная строка - мигания светодиода. }
Результат: мигание светодиода с периодом 6,488с вместо 2 секунд! Далее играл с настройкой периода WDT и константой OS_TICKS_PER_SEC: -- вместо WDTIS__64 поставил WDTIS__32K (/32768) и OS_TICKS_PER_SEC=1 Результат: Период 4,000 сек вместо 2сек -- поставил WDTIS__8192 (/8192) и OS_TICKS_PER_SEC=4 Результат: Период 5,000 сек вместо 2сек -- поставил WDTIS__512 (/512) и OS_TICKS_PER_SEC=64 Результат: Период 5,250 сек вместо 2сек
Внимание, вопрос. Кто-нибудь не натыкался на глюки с таймерам WDT - к примеру несоответствие документации в части коэф-тов деления? Кто-нибудь не натыкался на глюки с тиками в операционке?
|