1 /******************************************************************************************************************************************
2 * 文件名称: SWM341_qei.c
3 * 功能说明: SWM341单片机的正交编码器接口QEI功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.0.0      2013年06月30日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM341.h"
22 #include "SWM341_qei.h"
23 
24 
25 /******************************************************************************************************************************************
26 * 函数名称: QEI_Init()
27 * 功能说明: 正交编码器接口QEI初始化
28 * 输    入: QEI_TypeDef * QEIx        指定要被设置的正交编码器接口,有效值包括QEI
29 *           QEI_InitStructure * initStruct      包含正交编码器接口相关设定值的结构体
30 * 输    出: 无
31 * 注意事项: 无
32 ******************************************************************************************************************************************/
QEI_Init(QEI_TypeDef * QEIx,QEI_InitStructure * initStruct)33 void QEI_Init(QEI_TypeDef * QEIx,QEI_InitStructure * initStruct)
34 {
35     switch((uint32_t)QEIx)
36     {
37     case ((uint32_t)QEI):
38         SYS->CLKEN1 |= (1 << SYS_CLKEN1_QEI_Pos);
39         break;
40     }
41 
42     QEI_Stop(QEIx);     //配置前关闭QEI模块
43 
44     QEIx->CR = (initStruct->swapAB << QEI_CR_ABSWAP_Pos) |
45                (initStruct->mode   << QEI_CR_X2X4_Pos)   |
46                (1                  << QEI_CR_RSTSRC_Pos) |
47                (1                  << QEI_CR_MODE_Pos);
48 
49     QEIx->POSCNT = 0;
50     QEIx->MAXCNT = initStruct->maxcnt;
51 
52     QEIx->IC = 0x0F;
53     QEIx->IE = 0x0F;
54     QEIx->IM = (initStruct->intINDEXEn << QEI_IM_INDEX_Pos) |
55                (initStruct->intMATCHEn << QEI_IM_MATCH_Pos) |
56                (initStruct->intCNTOVEn << QEI_IM_CNTOV_Pos) |
57                (initStruct->intERROREn << QEI_IM_ERROR_Pos);
58 
59     if(initStruct->intINDEXEn | initStruct->intMATCHEn | initStruct->intCNTOVEn | initStruct->intERROREn)
60     {
61         NVIC_EnableIRQ(QEI_IRQn);
62     }
63 }
64 
65 /******************************************************************************************************************************************
66 * 函数名称: QEI_Start()
67 * 功能说明: 启动指定QEI
68 * 输    入: QEI_TypeDef * QEIx        指定要被设置的正交编码器接口,有效值包括QEI
69 * 输    出: 无
70 * 注意事项: 无
71 ******************************************************************************************************************************************/
QEI_Start(QEI_TypeDef * QEIx)72 void QEI_Start(QEI_TypeDef * QEIx)
73 {
74     QEIx->CR |= (1 << QEI_CR_ENA_Pos);
75 }
76 
77 /******************************************************************************************************************************************
78 * 函数名称: QEI_Stop()
79 * 功能说明: 关闭指定QEI
80 * 输    入: QEI_TypeDef * QEIx        指定要被设置的正交编码器接口,有效值包括QEI
81 * 输    出: 无
82 * 注意事项: 无
83 ******************************************************************************************************************************************/
QEI_Stop(QEI_TypeDef * QEIx)84 void QEI_Stop(QEI_TypeDef * QEIx)
85 {
86     QEIx->CR &= ~(1 << QEI_CR_ENA_Pos);
87 }
88 
89 /******************************************************************************************************************************************
90 * 函数名称: QEI_IntEn()
91 * 功能说明: QEI中断使能
92 * 输    入: QEI_TypeDef * QEIx        指定要被设置的正交编码器接口,有效值包括QEI
93 *           uint32_t it             interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或
94 * 输    出: 无
95 * 注意事项: 无
96 ******************************************************************************************************************************************/
QEI_IntEn(QEI_TypeDef * QEIx,uint32_t it)97 void QEI_IntEn(QEI_TypeDef * QEIx, uint32_t it)
98 {
99     QEIx->IM |= it;
100 
101     switch((uint32_t)QEIx)
102     {
103     case ((uint32_t)QEI):
104         NVIC_EnableIRQ(QEI_IRQn);
105         break;
106     }
107 }
108 
109 /******************************************************************************************************************************************
110 * 函数名称: QEI_IntDis()
111 * 功能说明: QEI中断关闭
112 * 输    入: QEI_TypeDef * QEIx        指定要被设置的正交编码器接口,有效值包括QEI
113 *           uint32_t it             interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或
114 * 输    出: 无
115 * 注意事项: 无
116 ******************************************************************************************************************************************/
QEI_IntDis(QEI_TypeDef * QEIx,uint32_t it)117 void QEI_IntDis(QEI_TypeDef * QEIx, uint32_t it)
118 {
119     QEIx->IM &= ~it;
120 }
121 
122 /******************************************************************************************************************************************
123 * 函数名称: QEI_IntClr()
124 * 功能说明: QEI中断标志清除
125 * 输    入: QEI_TypeDef * QEIx        指定要被设置的正交编码器接口,有效值包括QEI
126 *           uint32_t it             interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或
127 * 输    出: 无
128 * 注意事项: 无
129 ******************************************************************************************************************************************/
QEI_IntClr(QEI_TypeDef * QEIx,uint32_t it)130 void QEI_IntClr(QEI_TypeDef * QEIx, uint32_t it)
131 {
132     QEIx->IC = it;
133 }
134 
135 /******************************************************************************************************************************************
136 * 函数名称: QEI_IntStat()
137 * 功能说明: QEI中断状态查询
138 * 输    入: QEI_TypeDef * QEIx        指定要被设置的正交编码器接口,有效值包括QEI
139 *           uint32_t it             interrupt type,取值QEI_INT_INDEX、QEI_INT_MATCH、QEI_INT_CNTOV、QEI_INT_ERROR 及其或
140 * 输    出: uint32_t              0 没有中断发生    非0值 有中断发生
141 * 注意事项: 无
142 ******************************************************************************************************************************************/
QEI_IntStat(QEI_TypeDef * QEIx,uint32_t it)143 uint32_t QEI_IntStat(QEI_TypeDef * QEIx, uint32_t it)
144 {
145     return (QEIx->IF & it);
146 }
147