21ic问答首页 - 各位大佬,有HC32F460的EC11旋转编码器的实现没?
各位大佬,有HC32F460的EC11旋转编码器的实现没?
uint8_t state = 100;
static void TimeraUnit1Over_IrqCallback(void)
{
state--; //ʹLED0µçƽ½øÐз´×ª
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagOverflow); //Çå³ýÖжϱê־λ
}
/**
*******************************************************************************
** \brief Timera unit 1 count underflow callback function
**
** \param [in] None
**
** \retval None
**
******************************************************************************/
static void TimeraUnit1Under_IrqCallback(void)
{
state++;
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagUnderflow); //Çå³ýÖжϱê־λ
}
void Timera_Config(void)
{
stc_timera_base_init_t stcTimeraInit; //¶¨Òå TimerA µÄ³õʼ»¯½á¹¹Ìå
stc_irq_regi_conf_t stcIrqRegiConf; //¶¨Ò嶨ʱÆ÷Òç³öÖжÏÅäÖýṹÌå
stc_timera_orthogonal_coding_init_t stcTimeraCondingInit; //¶¨Òå±àÂë¼ÆÊý³õʼ»¯½á¹¹Ìå
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcTimeraInit); //¶Ô½á¹¹ÌåÇåÁã
MEM_ZERO_STRUCT(stcIrqRegiConf); //¶Ô½á¹¹ÌåÇåÁã
MEM_ZERO_STRUCT(stcTimeraCondingInit); //¶Ô½á¹¹ÌåÇåÁã
/* Configuration peripheral clock */
PWC_Fcg2PeriphClockCmd(TIMERA_UNIT1_CLOCK, Enable); //ʹÄÜTimerA1µÄʱÖÓ
/* Configuration TIMERA coding pin */
PORT_SetFunc(TIMERA_UNIT1_CLKA_PORT, TIMERA_UNIT1_CLKA_PIN, TIMERA_UNIT1_CLKA_FUNC, Disable); //ÅäÖö˿ڵĸ´Óù¦ÄÜ£¬¸±¹¦Äܲ»ÆôÓÃ
PORT_SetFunc(TIMERA_UNIT1_CLKB_PORT, TIMERA_UNIT1_CLKB_PIN, TIMERA_UNIT1_CLKB_FUNC, Disable); //ÅäÖö˿ڵĸ´Óù¦ÄÜ£¬¸±¹¦Äܲ»ÆôÓÃ
/* Configuration timera unit 1 structure */
stcTimeraInit.enCntMode = TimeraCountModeSawtoothWave; //ÅäÖÃΪ¾â³Ý²¨Ä£Ê½ ÅäÖÿØÖÆ×´Ì¬¼Ä´æÆ÷ TMRA_BCSTR Bit[2] Mode
stcTimeraInit.enSyncStartupEn = Disable; //ÅäÖÃÓëµ¥Ôª1ͬ²½Æô¶¯ ÅäÖÿØÖÆ×´Ì¬¼Ä´æÆ÷ TMRA_BCSTR Bit[3] SYNST
stcTimeraInit.u16PeriodVal = 1000u; //ÅäÖüÆÊýÆ÷µÄÖÜÆÚ ÖÜÆÚ»ù×¼Öµ¼Ä´æÆ÷ TMRA_PERAR Bit[15:0]
TIMERA_BaseInit(TIMERA_UNIT1, &stcTimeraInit); //³õʼ»¯ÅäÖÃ
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqOverflow, Enable); //ʹÄÜÏòÉϼÆÊýÒç³öÖжÏʹÄÜ
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqUnderflow, Enable); //ʹÄÜÏòϼÆÊýÒç³öÖжÏʹÄÜ
/* Configure coding count structure */
stcTimeraCondingInit.enIncClkBHighAndClkARisingEn = Enable; //µ± ClkB Ϊ¸ßµçƽʱ ClkA ÉÏÉýÑØÊ±Ó²¼þµÝ¼ÓÓÐЧ
stcTimeraCondingInit.enDecClkBLowAndClkARisingEn = Enable; //µ± ClkB ΪµÍµçƽʱ ClkA ÉÏÉýÑØÊ±Ó²¼þµÝ¼õÓÐЧ
stcTimeraCondingInit.enClkAFilterEn = Enable; //ʹÄÜ ClkA ÊäÈë¶Ë¿ÚÂ˲¨¹¦ÄÜʹÄÜ
stcTimeraCondingInit.enClkAClkDiv = TimeraFilterPclkDiv4; //Â˲¨²ÉÑù»ù׼ʱÖÓÑ¡ÔñCA
stcTimeraCondingInit.enClkBFilterEn = Enable; //ʹÄÜ ClkB ÊäÈë¶Ë¿ÚÂ˲¨¹¦ÄÜʹÄÜ
stcTimeraCondingInit.enClkBClkDiv = TimeraFilterPclkDiv4; //Â˲¨²ÉÑù»ù׼ʱÖÓÑ¡ÔñCB
TIMERA_OrthogonalCodingInit(TIMERA_UNIT1, &stcTimeraCondingInit); //ÅäÖà TimerA µÄµ¥Ôª1
/* Configure count overflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_OVERFLOW_INT; //ÅäÖÃΪTimerAµ¥Ôª1Òç³öÖжÏ
stcIrqRegiConf.enIRQn = Int006_IRQn; //ÅäÖÃÖжÏÏòÁ¿
stcIrqRegiConf.pfnCallback = &TimeraUnit1Over_IrqCallback; //ÅäÖÃÖжϻص÷º¯Êý
enIrqRegistration(&stcIrqRegiConf); //³õʼ»¯ÖжÏÅäÖÃ
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //Çå³ý¹ÒÆðÖжÏ
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //ÅäÖÃÖжÏÓÅÏȼ¶
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ʹÄܶÔÓ¦µÄÖжÏÅäÖÃ
/* Configure count underflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_UPDATE_INT; //ÅäÖÃΪTimerAµ¥Ôª1¸üÐÂÖжÏ
stcIrqRegiConf.enIRQn = Int007_IRQn; //ÅäÖÃÖжÏÏòÁ¿
stcIrqRegiConf.pfnCallback = &TimeraUnit1Under_IrqCallback; //ÅäÖÃÖжϻص÷º¯Êý
enIrqRegistration(&stcIrqRegiConf); //³õʼ»¯ÖжÏÅäÖÃ
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //Çå³ý¹ÒÆðÖжÏ
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //ÅäÖÃÖжÏÓÅÏȼ¶
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ʹÄܶÔÓ¦µÄÖжÏÅäÖÃ
/* Timera unit 1 startup */
TIMERA_Cmd(TIMERA_UNIT1, Enable); //ʹÄÜTimerAµÄµ¥Ôª1
}
这个是现在的配置
static void TimeraUnit1Over_IrqCallback(void)
{
state--; //ʹLED0µçƽ½øÐз´×ª
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagOverflow); //Çå³ýÖжϱê־λ
}
/**
*******************************************************************************
** \brief Timera unit 1 count underflow callback function
**
** \param [in] None
**
** \retval None
**
******************************************************************************/
static void TimeraUnit1Under_IrqCallback(void)
{
state++;
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagUnderflow); //Çå³ýÖжϱê־λ
}
void Timera_Config(void)
{
stc_timera_base_init_t stcTimeraInit; //¶¨Òå TimerA µÄ³õʼ»¯½á¹¹Ìå
stc_irq_regi_conf_t stcIrqRegiConf; //¶¨Ò嶨ʱÆ÷Òç³öÖжÏÅäÖýṹÌå
stc_timera_orthogonal_coding_init_t stcTimeraCondingInit; //¶¨Òå±àÂë¼ÆÊý³õʼ»¯½á¹¹Ìå
/* configuration structure initialization */
MEM_ZERO_STRUCT(stcTimeraInit); //¶Ô½á¹¹ÌåÇåÁã
MEM_ZERO_STRUCT(stcIrqRegiConf); //¶Ô½á¹¹ÌåÇåÁã
MEM_ZERO_STRUCT(stcTimeraCondingInit); //¶Ô½á¹¹ÌåÇåÁã
/* Configuration peripheral clock */
PWC_Fcg2PeriphClockCmd(TIMERA_UNIT1_CLOCK, Enable); //ʹÄÜTimerA1µÄʱÖÓ
/* Configuration TIMERA coding pin */
PORT_SetFunc(TIMERA_UNIT1_CLKA_PORT, TIMERA_UNIT1_CLKA_PIN, TIMERA_UNIT1_CLKA_FUNC, Disable); //ÅäÖö˿ڵĸ´Óù¦ÄÜ£¬¸±¹¦Äܲ»ÆôÓÃ
PORT_SetFunc(TIMERA_UNIT1_CLKB_PORT, TIMERA_UNIT1_CLKB_PIN, TIMERA_UNIT1_CLKB_FUNC, Disable); //ÅäÖö˿ڵĸ´Óù¦ÄÜ£¬¸±¹¦Äܲ»ÆôÓÃ
/* Configuration timera unit 1 structure */
stcTimeraInit.enCntMode = TimeraCountModeSawtoothWave; //ÅäÖÃΪ¾â³Ý²¨Ä£Ê½ ÅäÖÿØÖÆ×´Ì¬¼Ä´æÆ÷ TMRA_BCSTR Bit[2] Mode
stcTimeraInit.enSyncStartupEn = Disable; //ÅäÖÃÓëµ¥Ôª1ͬ²½Æô¶¯ ÅäÖÿØÖÆ×´Ì¬¼Ä´æÆ÷ TMRA_BCSTR Bit[3] SYNST
stcTimeraInit.u16PeriodVal = 1000u; //ÅäÖüÆÊýÆ÷µÄÖÜÆÚ ÖÜÆÚ»ù×¼Öµ¼Ä´æÆ÷ TMRA_PERAR Bit[15:0]
TIMERA_BaseInit(TIMERA_UNIT1, &stcTimeraInit); //³õʼ»¯ÅäÖÃ
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqOverflow, Enable); //ʹÄÜÏòÉϼÆÊýÒç³öÖжÏʹÄÜ
TIMERA_IrqCmd(TIMERA_UNIT1, TimeraIrqUnderflow, Enable); //ʹÄÜÏòϼÆÊýÒç³öÖжÏʹÄÜ
/* Configure coding count structure */
stcTimeraCondingInit.enIncClkBHighAndClkARisingEn = Enable; //µ± ClkB Ϊ¸ßµçƽʱ ClkA ÉÏÉýÑØÊ±Ó²¼þµÝ¼ÓÓÐЧ
stcTimeraCondingInit.enDecClkBLowAndClkARisingEn = Enable; //µ± ClkB ΪµÍµçƽʱ ClkA ÉÏÉýÑØÊ±Ó²¼þµÝ¼õÓÐЧ
stcTimeraCondingInit.enClkAFilterEn = Enable; //ʹÄÜ ClkA ÊäÈë¶Ë¿ÚÂ˲¨¹¦ÄÜʹÄÜ
stcTimeraCondingInit.enClkAClkDiv = TimeraFilterPclkDiv4; //Â˲¨²ÉÑù»ù׼ʱÖÓÑ¡ÔñCA
stcTimeraCondingInit.enClkBFilterEn = Enable; //ʹÄÜ ClkB ÊäÈë¶Ë¿ÚÂ˲¨¹¦ÄÜʹÄÜ
stcTimeraCondingInit.enClkBClkDiv = TimeraFilterPclkDiv4; //Â˲¨²ÉÑù»ù׼ʱÖÓÑ¡ÔñCB
TIMERA_OrthogonalCodingInit(TIMERA_UNIT1, &stcTimeraCondingInit); //ÅäÖà TimerA µÄµ¥Ôª1
/* Configure count overflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_OVERFLOW_INT; //ÅäÖÃΪTimerAµ¥Ôª1Òç³öÖжÏ
stcIrqRegiConf.enIRQn = Int006_IRQn; //ÅäÖÃÖжÏÏòÁ¿
stcIrqRegiConf.pfnCallback = &TimeraUnit1Over_IrqCallback; //ÅäÖÃÖжϻص÷º¯Êý
enIrqRegistration(&stcIrqRegiConf); //³õʼ»¯ÖжÏÅäÖÃ
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //Çå³ý¹ÒÆðÖжÏ
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //ÅäÖÃÖжÏÓÅÏȼ¶
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ʹÄܶÔÓ¦µÄÖжÏÅäÖÃ
/* Configure count underflow interrupt of timera unit 1 */
stcIrqRegiConf.enIntSrc = TIMERA_UNIT1_UPDATE_INT; //ÅäÖÃΪTimerAµ¥Ôª1¸üÐÂÖжÏ
stcIrqRegiConf.enIRQn = Int007_IRQn; //ÅäÖÃÖжÏÏòÁ¿
stcIrqRegiConf.pfnCallback = &TimeraUnit1Under_IrqCallback; //ÅäÖÃÖжϻص÷º¯Êý
enIrqRegistration(&stcIrqRegiConf); //³õʼ»¯ÖжÏÅäÖÃ
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //Çå³ý¹ÒÆðÖжÏ
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15); //ÅäÖÃÖжÏÓÅÏȼ¶
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //ʹÄܶÔÓ¦µÄÖжÏÅäÖÃ
/* Timera unit 1 startup */
TIMERA_Cmd(TIMERA_UNIT1, Enable); //ʹÄÜTimerAµÄµ¥Ôª1
}
这个是现在的配置
您需要登录后才可以回复 登录 | 注册