89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
#include "hdl_encoder.h"
|
|
|
|
static volatile uint8_t a_level = 0;
|
|
static volatile int16_t encoder_cnt = 0;
|
|
|
|
static void hdl_encoder_a_callback(void)
|
|
{
|
|
if (SET == EXTINT_GetExtIntStatus(ENCODER_A_EX_CH)) {
|
|
if(RESET == ENCODER_A_GET)
|
|
{
|
|
a_level = 0;
|
|
if(SET == ENCODER_B_GET)
|
|
a_level = 1;
|
|
}
|
|
if(SET == ENCODER_A_GET)
|
|
{
|
|
if((a_level == 1) && (RESET == ENCODER_B_GET))
|
|
{
|
|
encoder_cnt++;
|
|
}
|
|
if((a_level == 0) && (SET == ENCODER_B_GET))
|
|
{
|
|
encoder_cnt--;
|
|
}
|
|
}
|
|
|
|
EXTINT_ClearExtIntStatus(ENCODER_A_EX_CH);
|
|
}
|
|
}
|
|
|
|
static void hdl_encoder_b_callback(void)
|
|
{
|
|
if (SET == EXTINT_GetExtIntStatus(ENCODER_B_EX_CH)) {
|
|
|
|
// while (PIN_RESET == GPIO_ReadInputPins(KEY10_PORT, KEY10_PIN)) {
|
|
// ;
|
|
// }
|
|
EXTINT_ClearExtIntStatus(ENCODER_B_EX_CH);
|
|
}
|
|
}
|
|
|
|
void hdl_encoder_init(void)
|
|
{
|
|
stc_gpio_init_t stcGpioInit;
|
|
stc_extint_init_t stcExtIntInit;
|
|
stc_irq_signin_config_t stcIrqSignConfig;
|
|
|
|
LL_PERIPH_WE(LL_PERIPH_GPIO);
|
|
|
|
/* 配置引脚 */
|
|
(void)GPIO_StructInit(&stcGpioInit);
|
|
stcGpioInit.u16PullUp = PIN_PU_ON; //上拉输入
|
|
stcGpioInit.u16ExtInt = PIN_EXTINT_ON; //外部中断
|
|
(void)GPIO_Init(ENCODER_SW_PORT, ENCODER_SW_PIN, &stcGpioInit);
|
|
(void)GPIO_Init(ENCODER_A_PORT, ENCODER_A_PIN, &stcGpioInit);
|
|
(void)GPIO_Init(ENCODER_B_PORT, ENCODER_B_PIN, &stcGpioInit);
|
|
|
|
/* 配置中断 */
|
|
(void)EXTINT_StructInit(&stcExtIntInit);
|
|
stcExtIntInit.u32Filter = EXTINT_FILTER_ON;
|
|
stcExtIntInit.u32FilterClock = EXTINT_FCLK_DIV8;
|
|
stcExtIntInit.u32Edge = EXTINT_TRIG_BOTH; //双边沿中断
|
|
(void)EXTINT_Init(ENCODER_A_EX_CH, &stcExtIntInit);
|
|
(void)EXTINT_Init(ENCODER_B_EX_CH, &stcExtIntInit);
|
|
|
|
/* 配置中断源 */
|
|
stcIrqSignConfig.enIntSrc = ENCODER_A_INT_SRC;
|
|
stcIrqSignConfig.enIRQn = ENCODER_A_INT_IRQn;
|
|
stcIrqSignConfig.pfnCallback = &hdl_encoder_a_callback;
|
|
(void)INTC_IrqSignIn(&stcIrqSignConfig);
|
|
NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
|
|
NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
|
|
NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);
|
|
|
|
stcIrqSignConfig.enIntSrc = ENCODER_B_INT_SRC;
|
|
stcIrqSignConfig.enIRQn = ENCODER_B_INT_IRQn;
|
|
stcIrqSignConfig.pfnCallback = &hdl_encoder_b_callback;
|
|
(void)INTC_IrqSignIn(&stcIrqSignConfig);
|
|
NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
|
|
NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
|
|
NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);
|
|
}
|
|
|
|
int16_t hdl_encoder_cnt_get(void)
|
|
{
|
|
return encoder_cnt;
|
|
}
|
|
|