打印

各位大佬,有HC32F460的EC11旋转编码器的实现没?

[复制链接]
1097|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leoeric|  楼主 | 2025-7-26 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
}
这个是现在的配置

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝