21ic问答首页 - 各位大佬,有HC32F460的EC11旋转编码器的实现没?
各位大佬,有HC32F460的EC11旋转编码器的实现没?
uint8_t state = 100;
static void TimeraUnit1Over_IrqCallback(void)
{
state--; //ê1LED0μ?????DD·′×a
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagOverflow); //??3y?D??±ê????
}
/**
*******************************************************************************
** \brief Timera unit 1 count underflow callback function
**
** \param [in] None
**
** \retval None
**
******************************************************************************/
static void TimeraUnit1Under_IrqCallback(void)
{
state++;
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagUnderflow); //??3y?D??±ê????
}
void Timera_Config(void)
{
stc_timera_base_init_t stcTimeraInit; //?¨ò? TimerA μ?3?ê??ˉ?á11ì?
stc_irq_regi_conf_t stcIrqRegiConf; //?¨ò??¨ê±?÷ò?3??D???????á11ì?
stc_timera_orthogonal_coding_init_t stcTimeraCondingInit; //?¨ò?±à????êy3?ê??ˉ?á11ì?
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcTimeraInit); //???á11ì???á?
MEM_ZERO_STRUCT(stcIrqRegiConf); //???á11ì???á?
MEM_ZERO_STRUCT(stcTimeraCondingInit); //???á11ì???á?
/* Configuration peripheral clock */
PWC_Fcg2PeriphClockCmd(TIMERA_UNIT1_CLOCK, Enable); //ê1?üTimerA1μ?ê±?ó
/* Configuration TIMERA coding pin */
PORT_SetFunc(TIMERA_UNIT1_CLKA_PORT, TIMERA_UNIT1_CLKA_PIN, TIMERA_UNIT1_CLKA_FUNC, Disable); //???????úμ??′ó?1|?ü£??±1|?ü2???ó?
PORT_SetFunc(TIMERA_UNIT1_CLKB_PORT, TIMERA_UNIT1_CLKB_PIN, TIMERA_UNIT1_CLKB_FUNC, Disable); //???????úμ??′ó?1|?ü£??±1|?ü2???ó?
/* Configuration timera unit 1 structure */
stcTimeraInit.enCntMode = TimeraCountModeSawtoothWave; //?????a?a3Y2¨?£ê? ????????×′ì???′??÷ TMRA_BCSTR Bit[2] Mode
stcTimeraInit.enSyncStartupEn = Disable; //????ó?μ¥?a1í?2????ˉ ????????×′ì???′??÷ TMRA_BCSTR Bit[3] SYNST
stcTimeraInit.u16PeriodVal = 1000u; //??????êy?÷μ??ü?ú ?ü?ú?ù×??μ??′??÷ TMRA_PERAR Bit[15:0]
TIMERA_BaseInit(TIMERA_UNIT1, &stcTimeraInit); //3?ê??ˉ????
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqOverflow, Enable); //ê1?ü?òé???êyò?3??D??ê1?ü
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqUnderflow, Enable); //ê1?ü?ò????êyò?3??D??ê1?ü
/* Configure coding count structure */
stcTimeraCondingInit.enIncClkBHighAndClkARisingEn = Enable; //μ± ClkB ?a??μ???ê± ClkA é?éy??ê±ó2?tμY?óóDD§
stcTimeraCondingInit.enDecClkBLowAndClkARisingEn = Enable; //μ± ClkB ?aμíμ???ê± ClkA é?éy??ê±ó2?tμY??óDD§
stcTimeraCondingInit.enClkAFilterEn = Enable; //ê1?ü ClkA ê?è????ú??2¨1|?üê1?ü
stcTimeraCondingInit.enClkAClkDiv = TimeraFilterPclkDiv4; //??2¨2é?ù?ù×?ê±?ó????CA
stcTimeraCondingInit.enClkBFilterEn = Enable; //ê1?ü ClkB ê?è????ú??2¨1|?üê1?ü
stcTimeraCondingInit.enClkBClkDiv = TimeraFilterPclkDiv4; //??2¨2é?ù?ù×?ê±?ó????CB
TIMERA_OrthogonalCodingInit(TIMERA_UNIT1, &stcTimeraCondingInit); //???? TimerA μ?μ¥?a1
/* Configure count overflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_OVERFLOW_INT; //?????aTimerAμ¥?a1ò?3??D??
stcIrqRegiConf.enIRQn = Int006_IRQn; //?????D???òá?
stcIrqRegiConf.pfnCallback = &TimeraUnit1Over_IrqCallback; //?????D????μ÷oˉêy
enIrqRegistration(&stcIrqRegiConf); //3?ê??ˉ?D??????
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //??3y1ò?e?D??
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //?????D??ó??è??
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ê1?ü??ó|μ??D??????
/* Configure count underflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_UPDATE_INT; //?????aTimerAμ¥?a1?üD??D??
stcIrqRegiConf.enIRQn = Int007_IRQn; //?????D???òá?
stcIrqRegiConf.pfnCallback = &TimeraUnit1Under_IrqCallback; //?????D????μ÷oˉêy
enIrqRegistration(&stcIrqRegiConf); //3?ê??ˉ?D??????
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //??3y1ò?e?D??
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //?????D??ó??è??
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ê1?ü??ó|μ??D??????
/* Timera unit 1 startup */
TIMERA_Cmd(TIMERA_UNIT1, Enable); //ê1?üTimerAμ?μ¥?a1
}
这个是现在的配置
static void TimeraUnit1Over_IrqCallback(void)
{
state--; //ê1LED0μ?????DD·′×a
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagOverflow); //??3y?D??±ê????
}
/**
*******************************************************************************
** \brief Timera unit 1 count underflow callback function
**
** \param [in] None
**
** \retval None
**
******************************************************************************/
static void TimeraUnit1Under_IrqCallback(void)
{
state++;
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagUnderflow); //??3y?D??±ê????
}
void Timera_Config(void)
{
stc_timera_base_init_t stcTimeraInit; //?¨ò? TimerA μ?3?ê??ˉ?á11ì?
stc_irq_regi_conf_t stcIrqRegiConf; //?¨ò??¨ê±?÷ò?3??D???????á11ì?
stc_timera_orthogonal_coding_init_t stcTimeraCondingInit; //?¨ò?±à????êy3?ê??ˉ?á11ì?
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcTimeraInit); //???á11ì???á?
MEM_ZERO_STRUCT(stcIrqRegiConf); //???á11ì???á?
MEM_ZERO_STRUCT(stcTimeraCondingInit); //???á11ì???á?
/* Configuration peripheral clock */
PWC_Fcg2PeriphClockCmd(TIMERA_UNIT1_CLOCK, Enable); //ê1?üTimerA1μ?ê±?ó
/* Configuration TIMERA coding pin */
PORT_SetFunc(TIMERA_UNIT1_CLKA_PORT, TIMERA_UNIT1_CLKA_PIN, TIMERA_UNIT1_CLKA_FUNC, Disable); //???????úμ??′ó?1|?ü£??±1|?ü2???ó?
PORT_SetFunc(TIMERA_UNIT1_CLKB_PORT, TIMERA_UNIT1_CLKB_PIN, TIMERA_UNIT1_CLKB_FUNC, Disable); //???????úμ??′ó?1|?ü£??±1|?ü2???ó?
/* Configuration timera unit 1 structure */
stcTimeraInit.enCntMode = TimeraCountModeSawtoothWave; //?????a?a3Y2¨?£ê? ????????×′ì???′??÷ TMRA_BCSTR Bit[2] Mode
stcTimeraInit.enSyncStartupEn = Disable; //????ó?μ¥?a1í?2????ˉ ????????×′ì???′??÷ TMRA_BCSTR Bit[3] SYNST
stcTimeraInit.u16PeriodVal = 1000u; //??????êy?÷μ??ü?ú ?ü?ú?ù×??μ??′??÷ TMRA_PERAR Bit[15:0]
TIMERA_BaseInit(TIMERA_UNIT1, &stcTimeraInit); //3?ê??ˉ????
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqOverflow, Enable); //ê1?ü?òé???êyò?3??D??ê1?ü
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqUnderflow, Enable); //ê1?ü?ò????êyò?3??D??ê1?ü
/* Configure coding count structure */
stcTimeraCondingInit.enIncClkBHighAndClkARisingEn = Enable; //μ± ClkB ?a??μ???ê± ClkA é?éy??ê±ó2?tμY?óóDD§
stcTimeraCondingInit.enDecClkBLowAndClkARisingEn = Enable; //μ± ClkB ?aμíμ???ê± ClkA é?éy??ê±ó2?tμY??óDD§
stcTimeraCondingInit.enClkAFilterEn = Enable; //ê1?ü ClkA ê?è????ú??2¨1|?üê1?ü
stcTimeraCondingInit.enClkAClkDiv = TimeraFilterPclkDiv4; //??2¨2é?ù?ù×?ê±?ó????CA
stcTimeraCondingInit.enClkBFilterEn = Enable; //ê1?ü ClkB ê?è????ú??2¨1|?üê1?ü
stcTimeraCondingInit.enClkBClkDiv = TimeraFilterPclkDiv4; //??2¨2é?ù?ù×?ê±?ó????CB
TIMERA_OrthogonalCodingInit(TIMERA_UNIT1, &stcTimeraCondingInit); //???? TimerA μ?μ¥?a1
/* Configure count overflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_OVERFLOW_INT; //?????aTimerAμ¥?a1ò?3??D??
stcIrqRegiConf.enIRQn = Int006_IRQn; //?????D???òá?
stcIrqRegiConf.pfnCallback = &TimeraUnit1Over_IrqCallback; //?????D????μ÷oˉêy
enIrqRegistration(&stcIrqRegiConf); //3?ê??ˉ?D??????
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //??3y1ò?e?D??
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //?????D??ó??è??
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ê1?ü??ó|μ??D??????
/* Configure count underflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_UPDATE_INT; //?????aTimerAμ¥?a1?üD??D??
stcIrqRegiConf.enIRQn = Int007_IRQn; //?????D???òá?
stcIrqRegiConf.pfnCallback = &TimeraUnit1Under_IrqCallback; //?????D????μ÷oˉêy
enIrqRegistration(&stcIrqRegiConf); //3?ê??ˉ?D??????
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //??3y1ò?e?D??
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //?????D??ó??è??
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ê1?ü??ó|μ??D??????
/* Timera unit 1 startup */
TIMERA_Cmd(TIMERA_UNIT1, Enable); //ê1?üTimerAμ?μ¥?a1
}
这个是现在的配置
您需要登录后才可以回复 登录 | 注册