Jelajahi Sumber

Работает передача счетчиков и направления.

unknown 2 minggu lalu
induk
melakukan
d6147ac2a7

+ 40 - 11
desk/modules/uart_bridge/uart_bridge.cpp

@@ -4,10 +4,9 @@
 #include "cmsis_os.h"
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 
-#define RX_BUF_SIZE     20 
-
 UART_HandleTypeDef huart_bridge;
 osMessageQId mb_rx_queue;
 
@@ -15,9 +14,12 @@ osThreadId ub_task_handle;
 void vUartBridge(void const *params);
 
 static uint8_t rx_byte;
-static uint32_t rx_byte_cnt = 0;
 static uint32_t error_cnt = 0;
-static char tx_buf[RX_BUF_SIZE];
+static char rx_buf[DATA_BUF_SIZE];
+
+uint32_t forw_turns;
+uint32_t back_turns;
+uint32_t direction;
 
 //
 void init_usart(void)
@@ -76,8 +78,7 @@ void vUartBridge(void const *params)
     osEvent event;
     uint8_t cnt = 0;
     bool begin = false;
-    uint32_t value = 0;
-    
+        
     for (;;)
     {
         event = osMessageGet(mb_rx_queue, 1000);
@@ -85,21 +86,31 @@ void vUartBridge(void const *params)
         if (event.status == osEventMessage) {
             printf("%c", event.value.v);
             if (event.value.v == '{') {
+                rx_buf[cnt++] = event.value.v;
                 begin = true;
                 continue;
             }
             if (begin)
-                tx_buf[cnt++] = event.value.v;
+                rx_buf[cnt++] = event.value.v;
             
             if ((event.value.v == '\n') && (begin)) {
-                value = atoi(tx_buf);
+                
+                forw_turns = get_uint_param(rx_buf, 0);
+                back_turns = get_uint_param(rx_buf, 1);
+                direction = get_uint_param(rx_buf, 2);
+
                 begin = false;
                 cnt = 0;
-                printf("Value: %u\r\n", value);
+
                 
+#if 0              
+                s_len = strlen(rx_buf);
+                value = atoi(rx_buf);
+                printf("Value: %u\r\n", value);
+#endif                
             }
             
-            if (cnt == RX_BUF_SIZE) {
+            if (cnt == DATA_BUF_SIZE) {
                 cnt = 0;
             }
             
@@ -109,10 +120,28 @@ void vUartBridge(void const *params)
     }
 }
 
+//
+uint32_t get_uint_param(char* buf, uint8_t index)
+{
+    char str_val[10] = {0};
+    char *end, *begin;
+        
+    if (index == 0) {
+        end = strchr(buf, ',');
+        memcpy(str_val, &buf[1], end - buf - 1);
+    }
+    else {
+        begin = strchr(buf, ',');
+        *begin = ' ';
+        end = strchr(buf, ',');
+        memcpy(str_val, begin + 1, end - begin - 1);
+    }
+    return atoi(str_val);
+}
+
 //
 void usart_bridge_rx_cb(void)
 {
-    //rx_byte_cnt++;
     //printf("%c", rx_byte);
     osMessagePut(mb_rx_queue, rx_byte, 0);
     HAL_UART_Receive_IT(&huart_bridge, &rx_byte, 1);

+ 3 - 0
desk/modules/uart_bridge/uart_bridge.h

@@ -7,6 +7,9 @@ void init_usart(void);
 //
 void ub_init_os(void);
 
+//
+uint32_t get_uint_param(char* buf, uint8_t index);
+
 //
 void usart_bridge_rx_cb(void);
 

File diff ditekan karena terlalu besar
+ 10 - 3
project/ewarm/settings/tuber.wsdt


+ 52 - 74
robot/modules/sc60224/encoder.cpp

@@ -1,21 +1,34 @@
 #include "stm32g0xx_hal.h"
 #include "encoder.h"
+#include "uart_bridge.h"
+#include <stdio.h>
+#include <string.h>
 
 
 TIM_HandleTypeDef htim1;
 
-#define TEST_BUF_LEN    256
-uint32_t test_index;
-uint32_t test_buf[TEST_BUF_LEN];
+#define TX_BUF_SIZE     60 
 
 #define RESOLUTION      1024
 
-uint8_t direction;
-uint32_t forw_cnt;
-uint32_t back_cnt;
-uint32_t forw_turns;
-uint32_t back_turns;
+static uint8_t tx_buf[TX_BUF_SIZE];
 
+uint32_t forw_cnt_irq;
+uint32_t back_cnt_irq;
+
+uint8_t direction_irq;
+uint32_t forw_turns_irq;
+uint32_t back_turns_irq;
+
+uint8_t direction = 1;
+uint32_t forw_turns = 123456789;
+uint32_t back_turns = 987654321;
+
+bool access_turns = true;
+
+//
+static void create_data_pack_encoder(void);
+static void init_gpio_encoder(void);
 
 //
 void init_encoder(void)
@@ -55,19 +68,10 @@ void init_encoder(void)
     
     HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
     
-    //HAL_NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 6, 0);
-    //HAL_NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);
-    
-    //__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
-    
     HAL_NVIC_SetPriority(TIM1_CC_IRQn, 6, 0);
     HAL_NVIC_EnableIRQ(TIM1_CC_IRQn);
     
-    //HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
-    //HAL_TIM_Encoder_Start_IT(&htim1, TIM_CHANNEL_ALL);
     HAL_TIM_Encoder_Start_IT(&htim1, TIM_CHANNEL_1);
-    
-    
 }
 
 //
@@ -91,81 +95,55 @@ void init_gpio_encoder(void)
     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
     GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-    
-#if 0    
-    GPIO_InitStruct.Pin = GPIO_PIN_0;
-    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
-    GPIO_InitStruct.Pull = GPIO_PULLUP;
-    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
-    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; //GPIO_AF2_TIM1;
-    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-    
-    GPIO_InitStruct.Pin = GPIO_PIN_3;
-    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
-    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-#endif    
-}
-
-void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
-{
-    static uint32_t cnt = 0;
-    
-    cnt++;
 }
 
+//
 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
 {
     if (htim->Instance->CR1 & TIM_CR1_DIR) {
-        direction = 1;
-        back_cnt++;
-        if (back_cnt >= RESOLUTION) {
-            back_cnt = 0;
-            back_turns++;
+        direction_irq = 1;
+        back_cnt_irq++;
+        if (back_cnt_irq >= RESOLUTION) {
+            back_cnt_irq = 0;
+            back_turns_irq++;
         }
     }
     else {
-        direction = 0;
-        forw_cnt++;
-        if (forw_cnt >= RESOLUTION) {
-            forw_cnt = 0;
-            forw_turns++;
+        direction_irq = 0;
+        forw_cnt_irq++;
+        if (forw_cnt_irq >= RESOLUTION) {
+            forw_cnt_irq = 0;
+            forw_turns_irq++;
         }
     }
     
+    while (!access_turns) {}
+
 #if 0    
-    //test_buf[test_index++] = (uint16_t)TIM1->CNT;
-    test_buf[test_index++] = (uint16_t)TIM1->CCR1;
-    
-    if (test_index == TEST_BUF_LEN)
-        test_index = 0;
-#endif
+    direction = direction_irq;
+    forw_turns = forw_turns_irq;
+    back_turns = forw_turns_irq;
+#endif    
 }
 
+//
+static void create_data_pack_encoder(void)
+{
+    access_turns = false;
+    sprintf((char*)tx_buf, "{%u,%u,%u,}\n", forw_turns, back_turns, direction);
+    access_turns = true;
+}
 
-extern "C" {
-void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
+//
+void send_data_pack_encoder(void)
 {
-    HAL_TIM_IRQHandler(&htim1);
-    
-#if 0  
-    if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
-    {
-        TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
-        
-        
-        //encDir = (TIM1->CR1 & TIM_CR1_DIR ? true : false);
-
-#if 0        
-        if (!encInit)
-            return;
-        
-        xSemaphoreGiveFromISR(semphEncoder, &xHigherPriorityTaskWoken);
-#endif        
-    }
-#endif    
-    //HAL_TIM_IRQHandler(&htim1);
+    create_data_pack_encoder();
+    ub_send_turns_pack(tx_buf, strlen((char*)tx_buf));
 }
 
+
+extern "C" {
+
 void TIM1_CC_IRQHandler(void)
 {
     HAL_TIM_IRQHandler(&htim1);

+ 1 - 2
robot/modules/sc60224/encoder.h

@@ -6,7 +6,6 @@
 void init_encoder(void);
 
 //
-void init_gpio_encoder(void);
-
+void send_data_pack_encoder(void);
 
 #endif // __ENCODER_H

+ 9 - 1
robot/modules/uart_bridge/uart_bridge.cpp

@@ -4,7 +4,7 @@
 #include <stdio.h>
 #include <string.h>
 
-#define TX_BUF_SIZE     20 
+#define TX_BUF_SIZE     60 
 
 UART_HandleTypeDef huart_bridge;
 //DMA_HandleTypeDef hdma_ub_rx;
@@ -14,6 +14,7 @@ DMA_HandleTypeDef hdma_ub_tx;
 static char tx_buf[TX_BUF_SIZE];
 
 
+//
 void init_usart(void)
 {
     GPIO_InitTypeDef GPIO_InitStruct = {0};
@@ -106,4 +107,11 @@ void ub_send_uint(uint32_t val)
 {
     sprintf(tx_buf, "{%u}\n", val);
     HAL_UART_Transmit_DMA(&huart_bridge, (uint8_t *)tx_buf, strlen(tx_buf));
+    
+}
+
+//
+void ub_send_turns_pack(uint8_t *buf, uint32_t len)
+{
+    HAL_UART_Transmit_DMA(&huart_bridge, (uint8_t *)buf, len);
 }

+ 3 - 0
robot/modules/uart_bridge/uart_bridge.h

@@ -10,6 +10,9 @@ void init_dma_usart(void);
 //
 void ub_send_test_byte(void);
 
+//
+void ub_send_turns_pack(uint8_t *buf, uint32_t len);
+
 //
 void ub_send_uint(uint32_t val);
 

+ 37 - 39
robot/user/main.cpp

@@ -21,8 +21,9 @@ int main()
     
     while (true)
     {
-        ub_send_uint(38548723);
-        HAL_Delay(1000);
+        send_data_pack_encoder();
+        
+        HAL_Delay(100);
     }
     
     //MX_GPIO_Init();
@@ -33,43 +34,40 @@ int main()
 
 void SystemClock_Config(void)
 {
-  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
-  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
-
-  /** Configure the main internal regulator output voltage
-  */
-  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
-
-  /** Initializes the RCC Oscillators according to the specified parameters
-  * in the RCC_OscInitTypeDef structure.
-  */
-  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
-  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
-  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
-  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
-  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
-  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
-  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
-  RCC_OscInitStruct.PLL.PLLN = 16;
-  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
-  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
-  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
-  {
-    Error_Handler();
-  }
-
-  /** Initializes the CPU, AHB and APB buses clocks
-  */
-  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
-                              |RCC_CLOCKTYPE_PCLK1;
-  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
-  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
-  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
-
-  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
-  {
-    Error_Handler();
-  }
+    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+    
+    // Configure the main internal regulator output voltage
+    HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
+    
+    // Initializes the RCC Oscillators according to the specified parameters
+    // in the RCC_OscInitTypeDef structure.
+    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
+    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
+    RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
+    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
+    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
+    RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
+    RCC_OscInitStruct.PLL.PLLN = 16;
+    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+    RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV4;
+    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+    {
+        Error_Handler();
+    }
+    
+    // Initializes the CPU, AHB and APB buses clocks
+    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+                                |RCC_CLOCKTYPE_PCLK1;
+    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
+    
+    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
+    {
+        Error_Handler();
+    }
 }
 
 

+ 1 - 0
share/uart_bridge_cfg.h

@@ -4,5 +4,6 @@
 
 #define UB_BAUDRATE     115200
 
+#define DATA_BUF_SIZE   60
 
 #endif // __UART_BRIDGE_CFG_H

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini