#include "stm32f1xx_hal.h" #include "defines.h" #include "setup.h" #include "config.h" #include #include TIM_HandleTypeDef TimHandle; uint8_t ppm_count = 0; //uint32_t timeout = 100; uint32_t timeout = 0; //start with 0, because if once timeout>TIMEOUT board will stay disabled uint8_t nunchuck_data[6] = {0}; uint8_t i2cBuffer[2]; extern I2C_HandleTypeDef hi2c2; DMA_HandleTypeDef hdma_i2c2_rx; DMA_HandleTypeDef hdma_i2c2_tx; #ifdef CONTROL_PPM uint16_t ppm_captured_value[PPM_NUM_CHANNELS + 1] = {500, 500}; uint16_t ppm_captured_value_buffer[PPM_NUM_CHANNELS+1] = {500, 500}; uint32_t ppm_timeout = 0; bool ppm_valid = true; #define IN_RANGE(x, low, up) (((x) >= (low)) && ((x) <= (up))) void PPM_ISR_Callback() { // Dummy loop with 16 bit count wrap around uint16_t rc_delay = TIM2->CNT; TIM2->CNT = 0; if (rc_delay > 3000) { if (ppm_valid && ppm_count == PPM_NUM_CHANNELS) { ppm_timeout = 0; memcpy(ppm_captured_value, ppm_captured_value_buffer, sizeof(ppm_captured_value)); } ppm_valid = true; ppm_count = 0; } else if (ppm_count < PPM_NUM_CHANNELS && IN_RANGE(rc_delay, 900, 2100)){ timeout = 0; ppm_captured_value_buffer[ppm_count++] = CLAMP(rc_delay, 1000, 2000) - 1000; } else { ppm_valid = false; } } // SysTick executes once each ms void PPM_SysTick_Callback() { ppm_timeout++; // Stop after 500 ms without PPM signal if(ppm_timeout > 500) { int i; for(i = 0; i < PPM_NUM_CHANNELS; i++) { ppm_captured_value[i] = 500; } ppm_timeout = 0; } } void PPM_Init() { GPIO_InitTypeDef GPIO_InitStruct; /*Configure GPIO pin : PA3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); __HAL_RCC_TIM2_CLK_ENABLE(); TimHandle.Instance = TIM2; TimHandle.Init.Period = UINT16_MAX; TimHandle.Init.Prescaler = (SystemCoreClock/DELAY_TIM_FREQUENCY_US)-1;; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&TimHandle); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI3_IRQn); HAL_TIM_Base_Start(&TimHandle); } #endif void Nunchuck_Init() { //-- START -- init WiiNunchuck i2cBuffer[0] = 0xF0; i2cBuffer[1] = 0x55; HAL_I2C_Master_Transmit(&hi2c2,0xA4,(uint8_t*)i2cBuffer, 2, 100); HAL_Delay(10); i2cBuffer[0] = 0xFB; i2cBuffer[1] = 0x00; HAL_I2C_Master_Transmit(&hi2c2,0xA4,(uint8_t*)i2cBuffer, 2, 100); HAL_Delay(10); } void Nunchuck_Read() { i2cBuffer[0] = 0x00; HAL_I2C_Master_Transmit(&hi2c2,0xA4,(uint8_t*)i2cBuffer, 1, 100); HAL_Delay(5); if (HAL_I2C_Master_Receive(&hi2c2,0xA4,(uint8_t*)nunchuck_data, 6, 100) == HAL_OK) { timeout = 0; } if (timeout > 3) { HAL_Delay(50); Nunchuck_Init(); } //setScopeChannel(0, (int)nunchuck_data[0]); //setScopeChannel(1, (int)nunchuck_data[1]); //setScopeChannel(2, (int)nunchuck_data[5] & 1); //setScopeChannel(3, ((int)nunchuck_data[5] >> 1) & 1); }