From 58fbffd0cf5ec9e8e0d75f3b561e5eda9ab746de Mon Sep 17 00:00:00 2001 From: Mysteo91 Date: Tue, 1 Aug 2023 14:38:32 +0300 Subject: [PATCH] ---vl6180dr --- App/app.cpp | 73 ++++++++++++++---------------- main_prog/Core/Inc/uart_bridge.hpp | 13 ++++-- main_prog/Core/Src/gpio.c | 6 +-- main_prog/Core/Src/tim.c | 4 +- main_prog/Core/Src/uart_bridge.cpp | 25 ++++++---- main_prog/gm60.ioc | 35 +++++++------- 6 files changed, 75 insertions(+), 81 deletions(-) diff --git a/App/app.cpp b/App/app.cpp index 7d8a1ea..581a583 100644 --- a/App/app.cpp +++ b/App/app.cpp @@ -72,12 +72,14 @@ void AppInit(void) ** \return none. ** ****************************************************************************************/ -uint8_t temp[2]; + uint32_t controlPinMs = 0; uint8_t controlPinFlag = 0; uint32_t controlPinDetectedMs = 0; uint8_t updateMode = 0; + + void zummerOff (void) { HAL_TIM_Base_Stop(&htimZummer); @@ -107,75 +109,67 @@ void proximityMessureCompleted (void) VL6180_RangeData_t VL6180_Range; -uint32_t waitAnsweredMs = 0; +uint32_t waitAnswerFromReaderMs = 0; #define MAX_WAIT_ANSWER_FROM_GM60 10000 #define DATA_TIMEOUT 500 uint32_t lightStartMs = 0; - uint8_t uartTask (void) // return 0 if data received , otherwise return 1 { - if (waitAnsweredMs != 0) + + if (waitAnswerFromReaderMs != 0) { - if (HAL_GetTick() - waitAnsweredMs >= MAX_WAIT_ANSWER_FROM_GM60 ) + if (HAL_GetTick() - waitAnswerFromReaderMs >= MAX_WAIT_ANSWER_FROM_GM60 ) { HAL_GPIO_WritePin(READER_EN_GPIO_Port, READER_EN_Pin, GPIO_PIN_SET ); HAL_Delay(500); HAL_GPIO_WritePin(READER_EN_GPIO_Port, READER_EN_Pin, GPIO_PIN_RESET ); - waitAnsweredMs = 0; + waitAnswerFromReaderMs = 0; } } if (!bridge.uart1Buf->is_empty() && (__HAL_UART_GET_FLAG(bridge.getHuart2(), UART_FLAG_TC))) { - waitAnsweredMs = HAL_GetTick(); - temp[1] = bridge.uart1Buf->dequeue(); - HAL_UART_Transmit_IT(bridge.getHuart2(), &temp[1], 1); + waitAnswerFromReaderMs = HAL_GetTick(); + std::string_view stringView{bridge.uart1Buf->dequeue()}; + if (stringView.find("FIRMWARE_UPDATE") != std::string::npos) + { + HAL_UART_DeInit(&huart1); + BootComInit(); + zummerOff(); + lightingOff(); + } + else if (stringView.find("ZOOMER_ON") != std::string::npos) + { + zummerOn(); + } + else if (stringView.find("ZOOMER_OFF") != std::string::npos) + { + zummerOff(); + } + else + HAL_UART_Transmit_IT(bridge.getHuart2(), (const uint8_t*) std::string(stringView).c_str(), stringView.size()); + return 0; } if (!bridge.uart2Buf->is_empty() && (__HAL_UART_GET_FLAG(bridge.getHuart1(), UART_FLAG_TC))) { - temp[2] = bridge.uart2Buf->dequeue(); - HAL_UART_Transmit_IT(bridge.getHuart1(), &temp[2], 1); + waitAnswerFromReaderMs = 0; + std::string_view stringView{bridge.uart2Buf->dequeue()}; + HAL_UART_Transmit_IT(bridge.getHuart1(), (const uint8_t*) std::string(stringView).c_str(), stringView.size()); return 0; } - + return 1; } void AppTask(void) { if (!updateMode) { - if (uartTask() == 0) - { - - } + uartTask(); if (HAL_GetTick() - lightStartMs >= 10000 && lightStartMs > 0) { lightStartMs = 0; lightingOff(); } - if (HAL_GPIO_ReadPin(CONTROL_PIN_GPIO_Port, CONTROL_PIN_Pin) == GPIO_PIN_RESET && controlPinFlag == 0) { - controlPinDetectedMs = HAL_GetTick(); - controlPinFlag = 1; - } else if (controlPinFlag == 1 && HAL_GPIO_ReadPin(CONTROL_PIN_GPIO_Port, CONTROL_PIN_Pin) == GPIO_PIN_SET ) { - controlPinFlag = 0; - uint32_t ms = 0; - if (controlPinDetectedMs != 0) - ms = HAL_GetTick() - controlPinDetectedMs; - controlPinDetectedMs = 0; - if (ms >= 5000 && ms < 5200) { - ////////Update mode - HAL_UART_DeInit(&huart1); - BootComInit(); - zummerOff(); - lightingOff(); - } else if (ms >= 100 && ms < 150) { - zummerOn(); - //////ZUMMER ON - } else if (ms >= 200 && ms < 250) { - zummerOff(); - //////ZUMMER OFF - } - } if (bridge.uart1Buf->is_empty() && bridge.uart2Buf->is_empty()) { if (proximityCompleteMessure == 1) @@ -201,7 +195,6 @@ void AppTask(void) /*** end of AppTask ***/ - /*********************************** end of app.c **************************************/ //////////// FINALLY NEED TO UNCOMMENT BootComCheckActivationRequest and BootComInit for success firmwaare update from HOST \ No newline at end of file diff --git a/main_prog/Core/Inc/uart_bridge.hpp b/main_prog/Core/Inc/uart_bridge.hpp index 3c113f3..0de079e 100644 --- a/main_prog/Core/Inc/uart_bridge.hpp +++ b/main_prog/Core/Inc/uart_bridge.hpp @@ -7,18 +7,20 @@ #include "circular_buffer.hpp" #include "usart.h" +#define BUF_SIZE 1024U +#define MAX_QUEUE 16 class UartBridge{ public: UartBridge(bool isOn, USART_TypeDef *uart1, USART_TypeDef *uart2, uint16_t baudRate1, uint16_t baudRate2); - Circular_Buffer *uart1Buf; - Circular_Buffer *uart2Buf; + Circular_Buffer *uart1Buf; + Circular_Buffer *uart2Buf; bool isTurnOn() const; void setTurnOn(bool isTurnOn); - volatile uint8_t dataFromUart1; - volatile uint8_t dataFromUart2; + volatile uint8_t dataFromUart1[BUF_SIZE]; + volatile uint8_t dataFromUart2[BUF_SIZE]; void init(void); private: @@ -28,7 +30,8 @@ protected: UART_HandleTypeDef uart1Handle, uart2Handle; public: UART_HandleTypeDef* getHuart1() ; - + bool receiveStarted; + bool receiveTimeout = true; UART_HandleTypeDef* getHuart2() ; protected: diff --git a/main_prog/Core/Src/gpio.c b/main_prog/Core/Src/gpio.c index 5f957ce..24d203a 100644 --- a/main_prog/Core/Src/gpio.c +++ b/main_prog/Core/Src/gpio.c @@ -71,11 +71,7 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - /*Configure GPIO pin : PtPin */ - GPIO_InitStruct.Pin = CONTROL_PIN_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLUP; - HAL_GPIO_Init(CONTROL_PIN_GPIO_Port, &GPIO_InitStruct); + /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_1_IRQn, 1, 0); diff --git a/main_prog/Core/Src/tim.c b/main_prog/Core/Src/tim.c index b83ccbc..1e7100a 100644 --- a/main_prog/Core/Src/tim.c +++ b/main_prog/Core/Src/tim.c @@ -98,7 +98,7 @@ void MX_TIM14_Init(void) htimLighitng.Instance = TIM14; htimLighitng.Init.Prescaler = 1; htimLighitng.Init.CounterMode = TIM_COUNTERMODE_UP; - htimLighitng.Init.Period = 63999; + htimLighitng.Init.Period = 100; htimLighitng.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htimLighitng.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htimLighitng) != HAL_OK) @@ -110,7 +110,7 @@ void MX_TIM14_Init(void) Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; - sConfigOC.Pulse = 32000; + sConfigOC.Pulse = 1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htimLighitng, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) diff --git a/main_prog/Core/Src/uart_bridge.cpp b/main_prog/Core/Src/uart_bridge.cpp index 4710399..8d80ff8 100644 --- a/main_prog/Core/Src/uart_bridge.cpp +++ b/main_prog/Core/Src/uart_bridge.cpp @@ -3,27 +3,31 @@ // extern "C" { #include "usart.h" +#include "tim.h" + } #include "uart_bridge.hpp" UartBridge* bridgePnt; -uint8_t data[2]; -extern "C" void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ +extern "C" void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){ if (huart == bridgePnt->getHuart1()) { - bridgePnt->uart1Buf->enqueue(bridgePnt->dataFromUart1); - HAL_UART_Receive_IT(bridgePnt->getHuart1(), (uint8_t*)&bridgePnt->dataFromUart1, 1); + std::string_view stringView{(const char *) bridgePnt->dataFromUart1, Size}; + bridgePnt->uart1Buf->enqueue(stringView); + HAL_UARTEx_ReceiveToIdle_IT(bridgePnt->getHuart1(),(uint8_t*)bridgePnt->dataFromUart1, BUF_SIZE ); + } else if (huart == bridgePnt->getHuart2()) { - bridgePnt->uart2Buf->enqueue(bridgePnt->dataFromUart2); - HAL_UART_Receive_IT(bridgePnt->getHuart2(), (uint8_t*)&bridgePnt->dataFromUart2, 1); + std::string_view stringView{(const char *) bridgePnt->dataFromUart2, Size}; + bridgePnt->uart2Buf->enqueue(stringView); + HAL_UARTEx_ReceiveToIdle_IT(bridgePnt->getHuart2(),(uint8_t*)bridgePnt->dataFromUart2, BUF_SIZE ); } } @@ -34,8 +38,8 @@ UartBridge::UartBridge(bool isOn, USART_TypeDef *uart1, USART_TypeDef *uart2, ui uart2(uart2) { bridgePnt = this; - UartBridge::uart1Buf = new Circular_Buffer(1024); - UartBridge::uart2Buf = new Circular_Buffer(1024); + UartBridge::uart1Buf = new Circular_Buffer(MAX_QUEUE); + UartBridge::uart2Buf = new Circular_Buffer(MAX_QUEUE); uart1Handle.Instance = uart1; uart1Handle.Init.BaudRate = baudRate1; uart1Handle.Init.WordLength = UART_WORDLENGTH_8B; @@ -91,8 +95,8 @@ UART_HandleTypeDef* UartBridge::getHuart2() { void UartBridge::init(void) { uartInit(&uart1Handle); uartInit(&uart2Handle); - HAL_UART_Receive_IT(&uart1Handle, (uint8_t*)&dataFromUart1, 1); - HAL_UART_Receive_IT(&uart2Handle, (uint8_t*)&dataFromUart2, 1); + HAL_UARTEx_ReceiveToIdle_IT(&uart1Handle,(uint8_t*)dataFromUart1, BUF_SIZE ); + HAL_UARTEx_ReceiveToIdle_IT(&uart2Handle,(uint8_t*)dataFromUart2, BUF_SIZE ); } @@ -121,3 +125,4 @@ extern "C" void USART2_IRQHandler(void) /* USER CODE END USART2_IRQn 1 */ } + diff --git a/main_prog/gm60.ioc b/main_prog/gm60.ioc index b04e7ff..36b6be4 100644 --- a/main_prog/gm60.ioc +++ b/main_prog/gm60.ioc @@ -4,8 +4,6 @@ CAD.pinconfig= CAD.provider= File.Version=6 GPIO.groupedBy=Group By Peripherals -I2C2.IPParameters=Timing -I2C2.Timing=0x10707DBC KeepUserPlacement=false Mcu.CPN=STM32G070CBT6 Mcu.Family=STM32G0 @@ -136,34 +134,33 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=STM32CubeIDE ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_I2C2_Init-I2C2-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_TIM3_Init-TIM3-false-HAL-true -RCC.ADCFreq_Value=64000000 -RCC.AHBFreq_Value=64000000 -RCC.APBFreq_Value=64000000 -RCC.APBTimFreq_Value=64000000 -RCC.CortexFreq_Value=64000000 +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_I2C2_Init-I2C2-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_TIM3_Init-TIM3-false-HAL-true,7-MX_TIM14_Init-TIM14-false-HAL-true,8-MX_TIM16_Init-TIM16-false-HAL-true +RCC.ADCFreq_Value=16000000 +RCC.AHBFreq_Value=16000000 +RCC.APBFreq_Value=16000000 +RCC.APBTimFreq_Value=16000000 +RCC.CortexFreq_Value=16000000 RCC.EXTERNAL_CLOCK_VALUE=48000 -RCC.FCLKCortexFreq_Value=64000000 +RCC.FCLKCortexFreq_Value=16000000 RCC.FamilyName=M -RCC.HCLKFreq_Value=64000000 +RCC.HCLKFreq_Value=16000000 RCC.HSE_VALUE=8000000 RCC.HSI_VALUE=16000000 -RCC.I2C1Freq_Value=64000000 -RCC.I2S1Freq_Value=64000000 -RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APBFreq_Value,APBTimFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2S1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLRCLKFreq_Value,PLLSourceVirtual,PWRFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USART2Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.I2C1Freq_Value=16000000 +RCC.I2S1Freq_Value=16000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APBFreq_Value,APBTimFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2S1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLRCLKFreq_Value,PLLSourceVirtual,PWRFreq_Value,SYSCLKFreq_VALUE,USART1Freq_Value,USART2Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value RCC.LSCOPinFreq_Value=32000 RCC.LSE_VALUE=32768 RCC.LSI_VALUE=32000 -RCC.MCO1PinFreq_Value=64000000 +RCC.MCO1PinFreq_Value=16000000 RCC.PLLN=16 RCC.PLLPoutputFreq_Value=64000000 RCC.PLLRCLKFreq_Value=64000000 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -RCC.PWRFreq_Value=64000000 -RCC.SYSCLKFreq_VALUE=64000000 -RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.USART1Freq_Value=64000000 -RCC.USART2Freq_Value=64000000 +RCC.PWRFreq_Value=16000000 +RCC.SYSCLKFreq_VALUE=16000000 +RCC.USART1Freq_Value=16000000 +RCC.USART2Freq_Value=16000000 RCC.VCOInputFreq_Value=8000000 RCC.VCOOutputFreq_Value=128000000 SH.GPXTI0.0=GPIO_EXTI0