EC11E編碼器接在STM32F103上可以正常使用,在CH32F103上左右旋轉(zhuǎn)沒反應(yīng)
#include?"ch32f10x.h"???????????????????//?Device?header int16_t?Encoder_Count;?//?全局變量,用于計數(shù)旋轉(zhuǎn)編碼器的增量值 /** ?*?函????數(shù):旋轉(zhuǎn)編碼器初始化 ?*?參????數(shù):無 ?*?返?回?值:無 ?*/ void?Encoder_Init(void) { ????/*開啟時鐘*/ ????RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,?ENABLE);?//?開啟GPIOB的時鐘 ????RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,?ENABLE);??//?開啟AFIO的時鐘,外部中斷必須開啟AFIO的時鐘 ????/*GPIO初始化*/ ????GPIO_InitTypeDef?GPIO_InitStructure; ????GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_IPU; ????GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_10?|?GPIO_Pin_11; ????GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_50MHz; ????GPIO_Init(GPIOB,?&GPIO_InitStructure);?//?將PB0和PB1引腳初始化為上拉輸入 ????/*AFIO選擇中斷引腳*/ ????GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,?GPIO_PinSource10);?//?將外部中斷的10號線映射到GPIOB,即選擇PB10為外部中斷引腳 ????GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,?GPIO_PinSource11);?//?將外部中斷的11號線映射到GPIOB,即選擇PB11為外部中斷引腳 ????/*EXTI初始化*/ ????EXTI_InitTypeDef?EXTI_InitStructure;????????????????????//?定義結(jié)構(gòu)體變量 ????EXTI_InitStructure.EXTI_Line?=?EXTI_Line0?|?EXTI_Line1;?//?選擇配置外部中斷的0號線和1號線 ????EXTI_InitStructure.EXTI_LineCmd?=?ENABLE;???????????????//?指定外部中斷線使能 ????EXTI_InitStructure.EXTI_Mode?=?EXTI_Mode_Interrupt;?????//?指定外部中斷線為中斷模式 ????EXTI_InitStructure.EXTI_Trigger?=?EXTI_Trigger_Falling;?//?指定外部中斷線為下降沿觸發(fā) ????EXTI_Init(&EXTI_InitStructure);?????????????????????????//?將結(jié)構(gòu)體變量交給EXTI_Init,配置EXTI外設(shè) ????/*NVIC中斷分組*/ ????NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);?//?配置NVIC為分組2 ????//?即搶占優(yōu)先級范圍:0~3,響應(yīng)優(yōu)先級范圍:0~3 ????//?此分組配置在整個工程中僅需調(diào)用一次 ????//?若有多個中斷,可以把此代碼放在main函數(shù)內(nèi),while循環(huán)之前 ????//?若調(diào)用多次配置分組的代碼,則后執(zhí)行的配置會覆蓋先執(zhí)行的配置 ????/*NVIC配置*/ ????NVIC_InitTypeDef?NVIC_InitStructure;??????????????????????//?定義結(jié)構(gòu)體變量 ????NVIC_InitStructure.NVIC_IRQChannel?=?EXTI0_IRQn;??????????//?選擇配置NVIC的EXTI0線 ????NVIC_InitStructure.NVIC_IRQChannelCmd?=?ENABLE;???????????//?指定NVIC線路使能 ????NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority?=?1;?//?指定NVIC線路的搶占優(yōu)先級為1 ????NVIC_InitStructure.NVIC_IRQChannelSubPriority?=?1;????????//?指定NVIC線路的響應(yīng)優(yōu)先級為1 ????NVIC_Init(&NVIC_InitStructure);???????????????????????????//?將結(jié)構(gòu)體變量交給NVIC_Init,配置NVIC外設(shè) ????NVIC_InitStructure.NVIC_IRQChannel?=?EXTI1_IRQn;??????????//?選擇配置NVIC的EXTI1線 ????NVIC_InitStructure.NVIC_IRQChannelCmd?=?ENABLE;???????????//?指定NVIC線路使能 ????NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority?=?1;?//?指定NVIC線路的搶占優(yōu)先級為1 ????NVIC_InitStructure.NVIC_IRQChannelSubPriority?=?2;????????//?指定NVIC線路的響應(yīng)優(yōu)先級為2 ????NVIC_Init(&NVIC_InitStructure);???????????????????????????//?將結(jié)構(gòu)體變量交給NVIC_Init,配置NVIC外設(shè) } /** ?*?函????數(shù):旋轉(zhuǎn)編碼器獲取增量值 ?*?參????數(shù):無 ?*?返?回?值:自上此調(diào)用此函數(shù)后,旋轉(zhuǎn)編碼器的增量值 ?*/ int16_t?Encoder_Get(void) { ????/*使用Temp變量作為中繼,目的是返回Encoder_Count后將其清零*/ ????/*在這里,也可以直接返回Encoder_Count ??????但這樣就不是獲取增量值的操作方法了 ??????也可以實現(xiàn)功能,只是思路不一樣*/ ????int16_t?Temp; ????Temp?=?Encoder_Count; ????Encoder_Count?=?0; ????return?Temp; } /** ?*?函????數(shù):EXTI0外部中斷函數(shù) ?*?參????數(shù):無 ?*?返?回?值:無 ?*?注意事項:此函數(shù)為中斷函數(shù),無需調(diào)用,中斷觸發(fā)后自動執(zhí)行 ?*???????????函數(shù)名為預(yù)留的指定名稱,可以從啟動文件復(fù)制 ?*???????????請確保函數(shù)名正確,不能有任何差異,否則中斷函數(shù)將不能進(jìn)入 ?*/ void?EXTI0_IRQHandler(void) { ????if?(EXTI_GetITStatus(EXTI_Line0)?==?SET)?//?判斷是否是外部中斷0號線觸發(fā)的中斷 ????{ ????????/*如果出現(xiàn)數(shù)據(jù)亂跳的現(xiàn)象,可再次判斷引腳電平,以避免抖動*/ ????????if?(GPIO_ReadInputDataBit(GPIOB,?GPIO_Pin_11)?==?0) ????????{ ????????????if?(GPIO_ReadInputDataBit(GPIOB,?GPIO_Pin_10)?==?0)?//?PB10的下降沿觸發(fā)中斷,此時檢測另一相PB11的電平,目的是判斷旋轉(zhuǎn)方向 ????????????{ ????????????????Encoder_Count?+=5;?//?此方向定義為反轉(zhuǎn),計數(shù)變量自減 ????????????} ????????} ????????EXTI_ClearITPendingBit(EXTI_Line0);?//?清除外部中斷0號線的中斷標(biāo)志位 ????????//?中斷標(biāo)志位必須清除 ????????//?否則中斷將連續(xù)不斷地觸發(fā),導(dǎo)致主程序卡死 ????} } /** ?*?函????數(shù):EXTI1外部中斷函數(shù) ?*?參????數(shù):無 ?*?返?回?值:無 ?*?注意事項:此函數(shù)為中斷函數(shù),無需調(diào)用,中斷觸發(fā)后自動執(zhí)行 ?*???????????函數(shù)名為預(yù)留的指定名稱,可以從啟動文件復(fù)制 ?*???????????請確保函數(shù)名正確,不能有任何差異,否則中斷函數(shù)將不能進(jìn)入 ?*/ void?EXTI1_IRQHandler(void) { ????if?(EXTI_GetITStatus(EXTI_Line1)?==?SET)?//?判斷是否是外部中斷1號線觸發(fā)的中斷 ????{ ????????/*如果出現(xiàn)數(shù)據(jù)亂跳的現(xiàn)象,可再次判斷引腳電平,以避免抖動*/ ????????if?(GPIO_ReadInputDataBit(GPIOB,?GPIO_Pin_10)?==?0) ????????{ ????????????if?(GPIO_ReadInputDataBit(GPIOB,?GPIO_Pin_11)?==?0)?//?PB11的下降沿觸發(fā)中斷,此時檢測另一相PB10的電平,目的是判斷旋轉(zhuǎn)方向 ????????????{ ????????????????Encoder_Count?-=5;?//?此方向定義為正轉(zhuǎn),計數(shù)變量自增 ????????????} ????????} ????????EXTI_ClearITPendingBit(EXTI_Line1);?//?清除外部中斷1號線的中斷標(biāo)志位 ????????//?中斷標(biāo)志位必須清除 ????????//?否則中斷將連續(xù)不斷地觸發(fā),導(dǎo)致主程序卡死 ????} }
熱門產(chǎn)品 :
CH592: RISC-V內(nèi)核BLE5.4無線MCU