fdsaf
hallsensor_hardware_decoder.h
- Committer:
- bobolee1239
- Date:
- 2019-03-13
- Revision:
- 0:0532a6e10a23
File content as of revision 0:0532a6e10a23:
#ifndef _HALLSENSOR_HARDWARE_DECODER_H #define _HALLSENSOR_HARDWARE_DECODER_H #include "mbed.h" // Hardware Quadrature Encoder ABZ for Nucleo F401RE // Output on debug port to host PC @ 9600 baud /* Connections PA_0 = Encoder A PA_1 = Encoder B PA_4 = Encoder Z */ InterruptIn ZPulse(PA_4) ; // Setup Interrupt for Z Pulse void EncoderInitialise(void) { // configure GPIO PA0 & PA1 as inputs for Encoder RCC->AHB1ENR |= 0x00000001; // Enable clock for GPIOA GPIOA->MODER |= 0x0000000A;//GPIO_MODER_MODER0_1 | GPIO_MODER_MODER1_1 ; //PA0 & PA1 as Alternate Function /*!< GPIO port mode register, Address offset: 0x00 */ GPIOA->OTYPER |= 0x00000003;//GPIO_OTYPER_OT_0 | GPIO_OTYPER_OT_1 ; //PA0 & PA1 as Inputs /*!< GPIO port output type register, Address offset: 0x04 */ GPIOA->OSPEEDR |= 0x0000000F;//high speed //GPIO_OSPEEDER_OSPEEDR0 | GPIO_OSPEEDER_OSPEEDR1 ; // Low speed /*!< GPIO port output speed register, Address offset: 0x08 */ GPIOA->PUPDR |= 0x00000005;//pull high //GPIO_PUPDR_PUPDR0_1 | GPIO_PUPDR_PUPDR1_1 ; // Pull Down /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ GPIOA->AFR[0] |= 0x00000011 ; // AF01 for PA0 & PA1 /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ GPIOA->AFR[1] |= 0x00000000 ; // /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ // configure TIM2 as Encoder input RCC->APB1ENR |= 0x00000001; // Enable clock for TIM2 TIM2->CR1 = 0x0001; // CEN(Counter ENable)='1' < TIM control register 1 TIM2->SMCR = 0x0003; // SMS='011' (Encoder mode 3) < TIM slave mode control register TIM2->CCMR1 = 0xF1F1; // CC1S='01' CC2S='01' < TIM capture/compare mode register 1 TIM2->CCMR2 = 0x0000; // < TIM capture/compare mode register 2 TIM2->CCER = 0x0011; // CC1P CC2P < TIM capture/compare enable register TIM2->PSC = 0x0000; // Prescaler = (0+1) < TIM prescaler TIM2->ARR = 0xffffffff; // reload at 0xfffffff < TIM auto-reload register TIM2->CNT = 0x0000; //reset the counter before we use it } void EncoderInitialise_HAL(void) { // init structure TIM_HandleTypeDef htim2; TIM_Encoder_InitTypeDef sConfig; TIM_MasterConfigTypeDef sMasterConfig; GPIO_InitTypeDef GPIO_InitStruct; // timer GPIO setup __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;//pin num PA "0" GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; //timer HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //port P"A"0 // basic timer setup __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; //timer htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0x000fffff; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //encoder mode setup sConfig.EncoderMode = TIM_ENCODERMODE_TI12; sConfig.IC1Polarity = TIM_ICPOLARITY_FALLING; sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC1Prescaler = TIM_ICPSC_DIV1; sConfig.IC1Filter = 2; sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; sConfig.IC2Prescaler = TIM_ICPSC_DIV1; sConfig.IC2Filter = 2; HAL_TIM_Encoder_Init(&htim2, &sConfig); // timer mode setup sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); // timer start HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL); } // Z Pulse routine void ZeroEncoderCount() { TIM2->CNT=0 ; //reset count to zero } #endif