Files
QDAC-firmware/libraries/zf_driver/zf_driver_encoder.c

262 lines
13 KiB
C
Raw Permalink Normal View History

2023-12-11 21:45:06 +08:00
/*********************************************************************************************************************
* CH32V307VCT6 Opensourec Library <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹٷ<EFBFBD> SDK <EFBFBD>ӿڵĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>
* Copyright (c) 2022 SEEKFREE <EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* CH32V307VCT6 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GPL<EFBFBD><EFBFBD>GNU General Public License<EFBFBD><EFBFBD><EFBFBD><EFBFBD> GNUͨ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> GPL <EFBFBD>ĵ<EFBFBD>3<EFBFBD><EFBFBD><EFBFBD> GPL3.0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>κκ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κεı<EFBFBD>֤
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD>ʺ<EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD>;<EFBFBD>ı<EFBFBD>֤
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> GPL
*
* <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<EFBFBD>յ<EFBFBD>һ<EFBFBD><EFBFBD> GPL <EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><https://www.gnu.org/licenses/>
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> GPL3.0 <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤Э<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>İ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӣ<EFBFBD>İ<EFBFBD><EFBFBD><EFBFBD> libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> GPL3_permission_statement.txt <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> libraries <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> LICENSE <EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD>ӭ<EFBFBD><EFBFBD>λʹ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD>İ<EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> zf_driver_encoder
* <EFBFBD><EFBFBD>˾<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾
* <EFBFBD><EFBFBD><EFBFBD>Ϣ <EFBFBD> libraries/doc <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> version <EFBFBD>ļ<EFBFBD> <EFBFBD>˵<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MounRiver Studio V1.8.1
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ̨ CH32V307VCT6
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> https://seekfree.taobao.com/
*
* <EFBFBD>޸ļ<EFBFBD>¼
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ע
* 2022-09-15 <EFBFBD><EFBFBD>W first version
********************************************************************************************************************/
#include "zf_driver_gpio.h"
#include "zf_driver_timer.h"
#include "zf_driver_encoder.h"
static volatile uint8 encoder_dir_pin[10] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵ
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> timer_ch <20><>ʱ<EFBFBD><CAB1>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// <20><>ע<EFBFBD><D7A2>Ϣ
// ʹ<><CAB9>ʾ<EFBFBD><CABE> encoder_get_count(TIM2_ENCOEDER) // <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1>2<EFBFBD>IJɼ<C4B2><C9BC><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
int16 encoder_get_count(encoder_index_enum encoder_n)
{
int16 result = 0;
int16 return_value = 0;
switch(encoder_n)
{
case TIM1_ENCOEDER: result = TIM1->CNT; break;
case TIM2_ENCOEDER: result = TIM2->CNT; break;
case TIM3_ENCOEDER: result = TIM3->CNT; break;
case TIM4_ENCOEDER: result = TIM4->CNT; break;
case TIM5_ENCOEDER: result = TIM5->CNT; break;
case TIM8_ENCOEDER: result = TIM8->CNT; break;
case TIM9_ENCOEDER: result = TIM9->CNT; break;
case TIM10_ENCOEDER: result = TIM10->CNT; break;
default: result = 0; break;
}
if(0xFF == encoder_dir_pin[encoder_n])
{
return_value = result;
}
else
{
if(!gpio_get_level((gpio_pin_enum)encoder_dir_pin[encoder_n]))
{
return_value = -result;
}
else
{
return_value = result;
}
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ʱ<EFBFBD><CAB1><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> timer_ch <20><>ʱ<EFBFBD><CAB1>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// <20><>ע<EFBFBD><D7A2>Ϣ
// ʹ<><CAB9>ʾ<EFBFBD><CABE> encoder_clear_count(TIM1_ENCOEDER) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>1<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void encoder_clear_count(encoder_index_enum encoder_n)
{
switch(encoder_n)
{
case TIM1_ENCOEDER: TIM1->CNT = 0; break;
case TIM2_ENCOEDER: TIM2->CNT = 0; break;
case TIM3_ENCOEDER: TIM3->CNT = 0; break;
case TIM4_ENCOEDER: TIM4->CNT = 0; break;
case TIM5_ENCOEDER: TIM5->CNT = 0; break;
case TIM8_ENCOEDER: TIM8->CNT = 0; break;
case TIM9_ENCOEDER: TIM9->CNT = 0; break;
case TIM10_ENCOEDER: TIM10->CNT = 0; break;
default: break;
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> timer_ch <20><>ʱ<EFBFBD><CAB1>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> phaseA ͨ<><CDA8>A<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> phaseB ͨ<><CDA8>B<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// <20><>ע<EFBFBD><D7A2>Ϣ <20>Ƽ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> encoder_init_quad(TIM1_ENCOEDER, TIM1_CH1_ENCOEDER_E9, TIM1_CH2_ENCOEDER_E11)
// // ʹ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬 ͨ<><CDA8>1<EFBFBD><31><EFBFBD>ź<EFBFBD>E9<45><39>ͨ<EFBFBD><CDA8>2<EFBFBD><32><EFBFBD>ź<EFBFBD>E11
//-------------------------------------------------------------------------------------------------------------------
void encoder_quad_init(encoder_index_enum encoder_n, encoder_channel_enum ch1_pin, encoder_channel_enum ch2_pin)
{
uint32 register_temp = 0;
TIM_TypeDef *tim_index;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȥ<EFBFBD><EFBFBD><E9BFB4><EFBFBD><EFBFBD>ʲô<CAB2>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ظ<EFBFBD>ʹ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD> TIM1_PWM Ȼ<><C8BB><EFBFBD>ֳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD> TIM1_ENCODER <20><><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
zf_assert(timer_funciton_check((timer_index_enum)encoder_n, TIMER_FUNCTION_ENCODER));
zf_assert((ch1_pin >> 12) == (encoder_n)); // ch1_pin <20><> ch2_pin <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> encoder_n ƥ<><C6A5>
zf_assert((ch2_pin >> 12) == (encoder_n)); // ch1_pin <20><> ch2_pin <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> encoder_n ƥ<><C6A5>
timer_clock_enable(encoder_n); // <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>
gpio_init((gpio_pin_enum)(ch1_pin & 0xFF), GPI, 0, GPI_PULL_UP); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gpio_init((gpio_pin_enum)(ch2_pin & 0xFF), GPI, 0, GPI_PULL_UP); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//encoder_dir_pin[encoder_n] = (ch1_pin &0xFF); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źŴ<C5BA><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch(encoder_n)
{
case TIM1_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM1_BASE); break;
case TIM2_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM2_BASE); break;
case TIM3_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM3_BASE); break;
case TIM4_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM4_BASE); break;
case TIM5_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM5_BASE); break;
case TIM8_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM8_BASE); break;
case TIM9_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM9_BASE); break;
case TIM10_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM10_BASE); break;
default: register_temp = 1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
if((ch1_pin >> 8) == 0x03) GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);
else if((ch1_pin >> 8) == 0x11) GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
else if((ch1_pin >> 8) == 0x22) GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
else if((ch1_pin >> 8) == 0x23) GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
else if((ch1_pin >> 8) == 0x31) GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);
else if((ch1_pin >> 8) == 0x71) GPIO_PinRemapConfig(GPIO_Remap_TIM8, ENABLE);
else if((ch1_pin >> 8) == 0x83) GPIO_PinRemapConfig(GPIO_FullRemap_TIM9, ENABLE);
else if((ch1_pin >> 8) == 0x91) GPIO_PinRemapConfig(GPIO_PartialRemap_TIM10, ENABLE);
else if((ch1_pin >> 8) == 0x93) GPIO_PinRemapConfig(GPIO_FullRemap_TIM10, ENABLE);
if(!register_temp)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // ʹ<><CAB9>AFIO<49><4F><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>ģ<EFBFBD><C4A3>ʱ<EFBFBD><CAB1>
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0};
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0; // Ԥ<><D4A4>Ƶ<EFBFBD><C6B5>
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // <20><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װֵ
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // ѡ<><D1A1>ʱ<EFBFBD>ӷ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM<49><4D><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // <20>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIM_TimeBaseInit(tim_index, &TIM_TimeBaseStructure); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><E1B9B9>
TIM_ITRxExternalClockConfig(tim_index, TIM_TS_TI2FP2); // <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻻<EFBFBD><F2B2BBBB><EFBFBD><EFBFBD><EFBFBD>
TIM_Cmd(tim_index, ENABLE); // <20><>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>
TIM_EncoderInterfaceConfig(
tim_index,
TIM_EncoderMode_TI2 ,
TIM_ICPolarity_Rising,
TIM_ICPolarity_Rising); // ʹ<>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>ģʽ, T2<54><32><EFBFBD><EFBFBD> ,T1<54>жϷ<D0B6><CFB7><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
TIM_Cmd(tim_index, ENABLE); // <20><>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>
}
}
//-------------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> timer_ch <20><>ʱ<EFBFBD><CAB1>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> phaseA ͨ<><CDA8>A<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> phaseB ͨ<><CDA8>B<EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD> void
// <20>Ƽ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ʹ<><CAB9>ʾ<EFBFBD><CABE> encoder_init_dir(TIM1_ENCOEDER, TIM1_CH1_ENCOEDER_E9, TIM1_CH2_ENCOEDER_E11)
// // ʹ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룬 ͨ<><CDA8>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>E9<45><39>ͨ<EFBFBD><CDA8>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>E11
//-------------------------------------------------------------------------------------------------------------------
void encoder_dir_init(encoder_index_enum encoder_n, encoder_channel_enum ch1_pin, encoder_channel_enum ch2_pin)
{
uint32 register_temp = 0;
TIM_TypeDef *tim_index;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD>Ϣ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȥ<EFBFBD><EFBFBD><E9BFB4><EFBFBD><EFBFBD>ʲô<CAB2>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ظ<EFBFBD>ʹ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD> TIM1_PWM Ȼ<><C8BB><EFBFBD>ֳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD> TIM1_ENCODER <20><><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
zf_assert(timer_funciton_check((timer_index_enum)encoder_n, TIMER_FUNCTION_ENCODER));
zf_assert((ch1_pin & (encoder_n << 12)) == (encoder_n << 12)); // ch1_pin <20><> ch2_pin <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> encoder_n ƥ<><C6A5>
zf_assert((ch2_pin & (encoder_n << 12)) == (encoder_n << 12)); // ch1_pin <20><> ch2_pin <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> encoder_n ƥ<><C6A5>
timer_clock_enable(encoder_n); // <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>
gpio_init((gpio_pin_enum)(ch1_pin & 0xFF), GPI, 0, GPI_PULL_UP); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gpio_init((gpio_pin_enum)(ch2_pin & 0xFF), GPI, 0, GPI_PULL_UP); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
encoder_dir_pin[encoder_n] = (ch1_pin &0xFF); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źŴ<C5BA><C5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
switch(encoder_n)
{
case TIM1_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM1_BASE); break;
case TIM2_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM2_BASE); break;
case TIM3_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM3_BASE); break;
case TIM4_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM4_BASE); break;
case TIM5_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM5_BASE); break;
case TIM8_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM8_BASE); break;
case TIM9_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM9_BASE); break;
case TIM10_ENCOEDER: tim_index = ((TIM_TypeDef *)TIM10_BASE); break;
default: register_temp = 1;
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // ʹ<><CAB9>AFIO<49><4F><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>ģ<EFBFBD><C4A3>ʱ<EFBFBD><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>
if((ch1_pin >> 8) == 0x03) GPIO_PinRemapConfig(GPIO_FullRemap_TIM1, ENABLE);
else if((ch1_pin >> 8) == 0x11) GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
else if((ch1_pin >> 8) == 0x22) GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
else if((ch1_pin >> 8) == 0x23) GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
else if((ch1_pin >> 8) == 0x31) GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);
else if((ch1_pin >> 8) == 0x71) GPIO_PinRemapConfig(GPIO_Remap_TIM8, ENABLE);
else if((ch1_pin >> 8) == 0x83) GPIO_PinRemapConfig(GPIO_FullRemap_TIM9, ENABLE);
else if((ch1_pin >> 8) == 0x91) GPIO_PinRemapConfig(GPIO_PartialRemap_TIM10, ENABLE);
else if((ch1_pin >> 8) == 0x93) GPIO_PinRemapConfig(GPIO_FullRemap_TIM10, ENABLE);
if(!register_temp)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0};
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 0; // Ԥ<><D4A4>Ƶ<EFBFBD><C6B5>
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // <20><EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װֵ
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // ѡ<><D1A1>ʱ<EFBFBD>ӷ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM<49><4D><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // <20>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIM_TimeBaseInit(tim_index, &TIM_TimeBaseStructure); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><E1B9B9>
TIM_ITRxExternalClockConfig(tim_index, TIM_TS_TI2FP2); // <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻻<EFBFBD><F2B2BBBB><EFBFBD><EFBFBD><EFBFBD>
TIM_ETRConfig(tim_index, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 15); // <20><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>Fsampling=Fdts/32<33><32>N=8<><38>
TIM_Cmd(tim_index, ENABLE); // <20><>ʱ<EFBFBD><CAB1>ʹ<EFBFBD><CAB9>
}
}