syoma, большое спасибо за исходный текст! Есть ещё парочку вопросов
Ваша текущая реализация драйверов таймера:
CODE
...
/* Compute the prescaler value APB1 divided by two, but this is fixed by timer itself */
PrescalerValue = (uint16_t) ((SystemCoreClock) / 125000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_PrescalerConfig(TIM2, PrescalerValue, TIM_PSCReloadMode_Immediate);
...
Какое значение у SystemCoreClock? 72MHz?
формула вычисления шага:
Tick := SystemCoreClock / (TIM_Prescaler+1) / TIM_Period
Как я понял TIM_Period у вас в формулу не берется. Это из-за "Output Compare Timing Mode configuration"?
Цитата
Systick я настроил на прерывание каждые 1мс чисто для своих нужд - например каждую мс входы опрашивать и т.д. в Canfestival он не учавствует.
Тогда где у вас в программе этот блок стоит:
if (canReceive(&m)) canDispatch(Obj_Data, &m);
в "инфинити луп"?
Запустил МК с вашими реализациами. USART2 interrupt работает стабильно, а вот функция ConfigureSlaveNode(тут находится CanFestival-3\examples\DS401_Master\TestMasterMicroMod.c) теряется. Обнаружил вот такой феномен: ставлю ТIМ2 на большой шаг ~2с, выполняю ConfigureSlaveNode(доходит до конца), ставлю ТIМ2 шаг обратно и колёсики начинают крутится. Можно ли решить эту проблему по другому?