Apтём (29.10.2014 17:03, просмотров: 2128)
Не могу понять что не так делаю...Задача такая: МК - STM32F2xx или STM32F4xx. МК периодически посылает по SPI 16 слов по 16 бит (обновление данных MBI5042). Клок SPI заведён на вход таймера (ETR2), по спаду на CLK таймер инкрементируется и при совпадении с TIM1->CCR1 должен выдать одиночный импульс. Но не выдаёт.
Инициализация таймера:
typedef Pin<'E', 7> LCLK_IN;
typedef Pin<'E', 9, 'H', PIN_SPEED_100MHZ> LE;
INLINE static void InitTimer1()
{
TIM1->SMCR=0
| TIM_SMCR_ECE
| TIM_SMCR_ETP
;
TIM1->CCER=0
| TIM_CCER_CC1E
;
TIM1->ARR=0x0F;
TIM1->DIER=0
| TIM_DIER_CC1IE
| TIM_DIER_UIE
;
TIM1->CCMR1=0
| TIM_CCMR1_OC1M_0
| TIM_CCMR1_OC1M_1
| TIM_CCMR1_OC1M_2
;
LE::Mode(ALT_OUTPUT);
LE::Alternate(ALT_FUNC_TIM1);
LCLK_IN::Mode(ALT_INPUT);
LCLK_IN::Alternate(ALT_FUNC_TIM1);
NVIC_EnableIRQ(TIM1_CC_IRQn);
NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
}
Запуск таймера:
INLINE static void StartTimer1(uint16_t compare_value)
{
TIM1->SR=0;
TIM1->CCR1=compare_value;
TIM1->CR1=0
| TIM_CR1_OPM
| TIM_CR1_CEN
;
}
volatile unsigned char SpiWordCounter;
volatile unsigned short SpiWord=20000;
int main()
{
RCC->APB2ENR|=0
| RCC_APB2ENR_TIM1EN
| RCC_APB2ENR_SPI1EN
;
__DSB();
InitTimer1();
SysTick_Config(168000-1);
InitSpi1();
while (1) {
if (TickFlag) {
TickFlag=false;
SpiWordCounter=0;
StartTimer1(2);
SPI1->DR=0x1FF;
}
}
}
// обработчик переполнения таймера
extern "C" void TIM1_UP_TIM10_IRQHandler()
{
TIM1->SR=0;
if (++SpiWordCounter==3)
TIM1->CCR1=8;
if (SpiWordCounter<4) {
TIM1->CR1|=TIM_CR1_CEN;
SPI1->DR=0x3001;
}
__DSB();
}
Что я не учитываю?