STM32F429I-DISCO (STM32F429ZIT6U) + датчик угла наклона. Осциллографом вижу, что при 0 градусов идут импульсы с периодом 1кгц, и шириной около 0,5кгц. При изменении угла наклона, ширина имульса меняется. Используя даташит накидал код, представленный ниже. Занимаюсь с этим микроконтроллером две недели, да и вообще занимаюсь с микроконтроллерами две недели, да и радиоэлектроникой... Ну вы поняли.
Мне не удается получить ширину импульса в CCR2, лишь его период в CCR1. В CCR2 чаще всего период, иногда проскакивают 0 или 1.
И ещё, почему то не могу обнулить ни один бит регистра SR, соответственно вот эти условия if (TIM2_SR & 2) и if (TIM2_SR & 4) не имеют никакого смысла.
Как же получить в CCR2 ширину импульса?
Очень нужна помощь. Уже хочется выть и биться головой об стену.
Код
#include "define.h" //адреса и значения регистров (не пользуюсь cmsis, hal)
volatile int up;
volatile int down;
void main(void){
RCC_AHB1ENR |= RCC_AHB1ENR_GPIOA; //GPIOA clocking
RCC_APB1ENR |= RCC_APB1ENR_TIM2; //TIM2 clocking
GPIOA_MODER |= GPIOA_MODER_AF_P0; //GPIOA0 alternate function
GPIOA_AFRL |= GPIOA_AFRL_AF1_P0 //GPIOA0 TIM2_CH1
TIM2_PSC = 16-1; //Prescaler 16
TIM2_CCMR1 |= TIM2_CCMR1_CC1S_0_1; //Select TI1 active input for TIM2_CCR1
TIM2_CCER &= ~TIM2_CCER_CC1P &
~TIM2_CCER_CC1NP; //TI1FP1 rising edge
TIM2_CCMR1 |= TIM2_CCMR1_CC2S_1_0; //Select TI1 active input for TIM2_CCR2
TIM2_CCER |= TIM2_CCER_CC2P &
~TIM2_CCER_CC2NP; //TI1FP2 falling edge
TIM2_SMCR |= TIM2_SMCR_TS_1_0_1; //Select TI1FP1 valid trigger input
TIM2_SMCR |= TIM2_SMCR_SMS_1_0_0; //Reset mode
TIM2_CCER |= TIM2_CCER_CC1E; //Enable the capture CC1
TIM2_CCER |= TIM2_CCER_CC2E; //Enable the capture CC2
TIM2_DIER |= TIM2_DIER_CC1IE; //Enable the interrupt CC1
TIM2_DIER |= TIM2_DIER_CC2IE; //Enable the interrupt CC2
TIM2_CR1 |= TIM2_CR1_CEN; //Counter enabled
NVIC_ISER0 |= NVIC_ISER0_TIM2; //TIM2 Interrupt
while(1);
}
//обработчик прерывания (startup.c)
void interrupt(void){
if(TIM2_SR & 2) up=TIM2_CCR1;
if(TIM2_SR & 4) down=TIM2_CCR2;
TIM2_SR = 0;
}