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