EC11E編碼器接在STM32F103上可以正常使用,在CH32F103上左右旋轉(zhuǎn)沒反應(yīng)

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)致主程序卡死
????}
}


您好,PB10 PB11 對應(yīng)的外部中斷線為EXTI10 EXTI11,對應(yīng)的中斷函數(shù)為? EXTI15_10_IRQHandler ,應(yīng)該是用錯中斷線導(dǎo)致,可以更換成EXTI10 EXTI11再試一下,后續(xù)有問題可以郵箱聯(lián)系:kx@wch.cn


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频