/****************************************************************************************************************************************** * 文件名称: SWM341_qei.c * 功能说明: SWM341单片机的正交编码器接口QEI功能驱动库 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1 * 注意事项: * 版本日期: V1.0.0 2013年06月30日 * 升级记录: * * ******************************************************************************************************************************************* * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN- * -ECTION WITH THEIR PRODUCTS. * * COPYRIGHT 2012 Synwit Technology *******************************************************************************************************************************************/ #include "SWM341.h" #include "SWM341_qei.h" /****************************************************************************************************************************************** * 函数名称: QEI_Init() * 功能说明: 正交编码器接口QEI初始化 * 输 入: QEI_TypeDef * QEIx 指定要被设置的正交编码器接口,有效值包括QEI * QEI_InitStructure * initStruct 包含正交编码器接口相关设定值的结构体 * 输 出: 无 * 注意事项: 无 ******************************************************************************************************************************************/ void QEI_Init(QEI_TypeDef * QEIx,QEI_InitStructure * initStruct) { switch((uint32_t)QEIx) { case ((uint32_t)QEI): SYS->CLKEN1 |= (1 << SYS_CLKEN1_QEI_Pos); break; } QEI_Stop(QEIx); //配置前关闭QEI模块 QEIx->CR = (initStruct->swapAB << QEI_CR_ABSWAP_Pos) | (initStruct->mode << QEI_CR_X2X4_Pos) | (1 << QEI_CR_RSTSRC_Pos) | (1 << QEI_CR_MODE_Pos); QEIx->POSCNT = 0; QEIx->MAXCNT = initStruct->maxcnt; QEIx->IC = 0x0F; QEIx->IE = 0x0F; QEIx->IM = (initStruct->intINDEXEn << QEI_IM_INDEX_Pos) | (initStruct->intMATCHEn << QEI_IM_MATCH_Pos) | (initStruct->intCNTOVEn << QEI_IM_CNTOV_Pos) | (initStruct->intERROREn << QEI_IM_ERROR_Pos); if(initStruct->intINDEXEn | initStruct->intMATCHEn | initStruct->intCNTOVEn | initStruct->intERROREn) { NVIC_EnableIRQ(QEI_IRQn); } } /****************************************************************************************************************************************** * 函数名称: QEI_Start() * 功能说明: 启动指定QEI * 输 入: QEI_TypeDef * QEIx 指定要被设置的正交编码器接口,有效值包括QEI * 输 出: 无 * 注意事项: 无 ******************************************************************************************************************************************/ void QEI_Start(QEI_TypeDef * QEIx) { QEIx->CR |= (1 << QEI_CR_ENA_Pos); } /****************************************************************************************************************************************** * 函数名称: QEI_Stop() * 功能说明: 关闭指定QEI * 输 入: QEI_TypeDef * QEIx 指定要被设置的正交编码器接口,有效值包括QEI * 输 出: 无 * 注意事项: 无 ******************************************************************************************************************************************/ void QEI_Stop(QEI_TypeDef * QEIx) { QEIx->CR &= ~(1 << QEI_CR_ENA_Pos); } /****************************************************************************************************************************************** * 函数名称: QEI_IntEn() * 功能说明: QEI中断使能 * 输 入: QEI_TypeDef * QEIx 指定要被设置的正交编码器接口,有效值包括QEI * uint32_t it interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或 * 输 出: 无 * 注意事项: 无 ******************************************************************************************************************************************/ void QEI_IntEn(QEI_TypeDef * QEIx, uint32_t it) { QEIx->IM |= it; switch((uint32_t)QEIx) { case ((uint32_t)QEI): NVIC_EnableIRQ(QEI_IRQn); break; } } /****************************************************************************************************************************************** * 函数名称: QEI_IntDis() * 功能说明: QEI中断关闭 * 输 入: QEI_TypeDef * QEIx 指定要被设置的正交编码器接口,有效值包括QEI * uint32_t it interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或 * 输 出: 无 * 注意事项: 无 ******************************************************************************************************************************************/ void QEI_IntDis(QEI_TypeDef * QEIx, uint32_t it) { QEIx->IM &= ~it; } /****************************************************************************************************************************************** * 函数名称: QEI_IntClr() * 功能说明: QEI中断标志清除 * 输 入: QEI_TypeDef * QEIx 指定要被设置的正交编码器接口,有效值包括QEI * uint32_t it interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或 * 输 出: 无 * 注意事项: 无 ******************************************************************************************************************************************/ void QEI_IntClr(QEI_TypeDef * QEIx, uint32_t it) { QEIx->IC = it; } /****************************************************************************************************************************************** * 函数名称: QEI_IntStat() * 功能说明: QEI中断状态查询 * 输 入: QEI_TypeDef * QEIx 指定要被设置的正交编码器接口,有效值包括QEI * uint32_t it interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或 * 输 出: uint32_t 0 没有中断发生 非0值 有中断发生 * 注意事项: 无 ******************************************************************************************************************************************/ uint32_t QEI_IntStat(QEI_TypeDef * QEIx, uint32_t it) { return (QEIx->IF & it); }