Хочу померить длительность сигнала stm32f429i-disco. Как я вижу решение по заднему фронту сигнала происходит (обнуление ) запуск счетчика по переднему конец счета и вызов вектора прерывание в котором можно считать данные длительности. Из даташита понял, что данную операцию аппаратно можно решить с помощью таймера TIM9. Написал функции настройки таймера, порта, обработчика прерывания. Прошу проверить код (сам пока не могу т.к нет железа на руках). Только начал работать с stm32f429zi пока еще не знаю всех его тонкостей. Использую проект для тач панели. Вывожу данные на lcd.
Код: Выделить всё
#include "main.h"
#include <stdio.h>
void TIM1_BRK_TIM9_IRQHandler (void);
uint16_t result_measurement_duration;
//static void TP_Config(void);
void TIMERInit (void);
void PORT_CAPTUR_init(void);
int main(void)
{
char array[15];
LCD_Init();
LCD_LayerInit();
TIMERInit();
PORT_CAPTUR_init();
LTDC_Cmd(ENABLE);
LCD_SetLayer(LCD_FOREGROUND_LAYER);
LCD_Clear(LCD_COLOR_WHITE);
LCD_SetTextColor(LCD_COLOR_BLUE2);
LCD_SetFont(&Font8x8);
__enable_irq ();
while (1)
{
sprintf(array, "%s %d ", "duration=",result_measurement_duration);
LCD_DisplayStringLine(LINE(1), (uint8_t*)"array");
}
}
void TIMERInit (void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM9, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM9, TIM_TS_TI2FP2);
TIM_SelectSlaveMode(TIM9, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM9, TIM_MasterSlaveMode_Enable);
TIM_ITConfig(TIM9, TIM_IT_CC1, ENABLE);
NVIC_EnableIRQ( TIM1_BRK_TIM9_IRQn);
TIM_Cmd(TIM9, ENABLE);
NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 1);
}
void PORT_CAPTUR_init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_TIM9);
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void TIM1_BRK_TIM9_IRQHandler (void)
{
result_measurement_duration = TIM9->CCR1;
} 