Я пытался работать с кодировщиком на своем чипе ARM STM32F0, и мне не повезло.
Сначала я прошел InputCapture, используя CaptureCallback и некоторое вычитание, но это дало почти случайные результаты. Поскольку я узнал, что внутри кода HAL есть библиотека кодировщика, я должен просто иметь возможность похлопать ее и счастливых дней. Пример 1 2 3
Я реализовал каждый из этих разных методов, и все они наносят вред одному и тому же факту. TIMx->CNT
не возвращает какой-либо счетный регистр, а вместо этого возвращает состояние вывода. Как будто библиотека HAL неправильно настраивает внутренний счетчик, но также возможно, что я просто делаю ошибку. Если бы кто-то мог направить меня, я был бы очень признателен. Ниже я вставил некоторые из моих конфигураций/примеров, чтобы показать, что я делаю.
Настраивать
Tim_ENCHandle.Instance = TIMENC;
Tim_ENCHandle.Init.Period = 0xFFFF;
Tim_ENCHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
Tim_ENCHandle.Init.Prescaler = 0;
Tim_ENCHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
encConfig.EncoderMode = TIM_ENCODERMODE_TI12;
encConfig.IC1Filter = 0x0F;
encConfig.IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING;
encConfig.IC1Prescaler = TIM_ICPSC_DIV1;
encConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
encConfig.IC2Filter = 0x0F;
encConfig.IC2Polarity = TIM_INPUTCHANNELPOLARITY_FALLING;
encConfig.IC2Prescaler = TIM_ICPSC_DIV1;
encConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
if (HAL_TIM_Encoder_Init(&Tim_ENCHandle, &encConfig) != HAL_OK) {
Error_Handler();
}
if(HAL_TIM_Encoder_Start_IT(&Tim_ENCHandle,TIM_CHANNEL_ALL)!=HAL_OK){
Error_Handler();
}
определяет:
/* Definition for TIMENC clock resources */
#define TIMENC TIM2
#define TIMENC_CLK_ENABLE() __HAL_RCC_TIM2_CLK_ENABLE()
#define TIMENC_CHANNEL_GPIO_PORT() __HAL_RCC_GPIOA_CLK_ENABLE()
#define TIMENC_GPIO_PORT GPIOA
#define TIMENC_GPIO_PIN_CHANNEL1 GPIO_PIN_1
#define TIMENC_GPIO_AF_TIMx GPIO_AF2_TIM2
#define TIMENC_IRQn TIM2_IRQn
#define TIMENC_IRQHandler TIM2_IRQHandler
MSP:
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) {
GPIO_InitTypeDef GPIO_InitStruct;
TIMENC_CLK_ENABLE();
TIMENC_CHANNEL_GPIO_PORT();
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = TIMENC_GPIO_AF_TIMx;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(TIMENC_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(TIMENC_IRQn);
}
Захватить данные, которые возвращают только состояние контакта
transmitBufferSize = snprintf((char *)aTxBuffer, 64, "cnt: %d\n\r", TIMENC->CNT);
Техническое описание моего конкретного чипа