初始版本
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user