Преглед изворни кода

1. 加入精确延时函数task_udelay
2.SP600新协议接收到数据后延时250us再处理,给PS200的485足够的时间切换到接收模式

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui пре 4 година
родитељ
комит
2ef60b0678
4 измењених фајлова са 47 додато и 0 уклоњено
  1. 2 0
      Application/bsp/bsp.c
  2. 5 0
      Application/bsp/uart.c
  3. 36 0
      Application/libs/shark_task.c
  4. 4 0
      Application/libs/shark_task.h

+ 2 - 0
Application/bsp/bsp.c

@@ -6,6 +6,7 @@
 #include "bsp/clock.h"
 #include "bsp/fmc_flash.h"
 #include "libs/logger.h"
+#include "libs/shark_task.h"
 #include "version.h"
 #include <string.h>
 
@@ -36,6 +37,7 @@ void bsp_init(void){
 	system_clock_config(); //after dcdc open, MCU can run on full speed
 	SystemCoreClockUpdate();
 	rcu_all_reset_flag_clear();
+	task_ticks_enable();
 	gpio_init();
 	set_log_level(MOD_SYSTEM, L_debug);
 	shark_uart_init(SHARK_UART0);

+ 5 - 0
Application/bsp/uart.c

@@ -2,6 +2,7 @@
 #include "bsp/shark_bsp.h"
 #include "bsp/gpio.h"
 #include "libs/shark_libs.h"
+#include "libs/shark_task.h"
 
 #define SHARK_UART_BAUDRATE				38400
 
@@ -65,6 +66,10 @@ static bool shark_uart_on_rx_frame(shark_uart_t *uart)
 		health_add_uart_error(1, 0, 0);
 		return false;
 	}
+#if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600)
+    //wait 250us to give the time for PS200 485 switch to rx mode
+	task_udelay(250);
+#endif
 	protocol_recv_frame(_uart_index(uart->uart_com), (char *)uart->rx_frame, uart->rx_length);
 	return true;
 }

+ 36 - 0
Application/libs/shark_task.c

@@ -32,6 +32,42 @@ u32 shark_get_seconds(void){
 	return shark_mseconds/1000 + get_system_sleep_time();
 }
 
+void task_ticks_enable(void)
+{
+	CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
+	DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
+}
+
+u32 task_ticks_abs(void)
+{
+	return DWT->CYCCNT;
+}
+
+u32 task_ticks_rel(u32 start)
+{
+	u32 ticks = DWT->CYCCNT;
+
+	if (ticks >= start) {
+		return ticks - start;
+	}
+
+	return 0xFFFFFFFF - start + ticks + 1;
+}
+
+void task_ticks_delay(u32 ticks)
+{
+	u32 start;
+
+	start = task_ticks_abs();
+	while (task_ticks_rel(start) < ticks);
+}
+
+void task_udelay(u32 delay)
+{
+	task_ticks_delay(delay * (SystemCoreClock / 1000000));
+}
+
+
 static inline void shark_timer_sync(void)
 {
 	shark_task_head.time = shark_timer_head.next->time;

+ 4 - 0
Application/libs/shark_task.h

@@ -21,3 +21,7 @@ void shark_timer_post(shark_timer_t *timer, u32 delay);
 void shark_timer_cancel(shark_timer_t *timer);
 void shark_task_add(shark_task_t *task);
 void shark_task_run(void);
+void task_ticks_enable(void);
+void task_udelay(u32 delay); /* 精确延时, 必须在bsp_init后才能使用 */
+
+