Просмотр исходного кода

1、再次对比了编译后的bin文件,确定app就是从0x3000+offset开始,编译出来的bin文件是相对于链接文件里的起始地址为0x80000400,那0x400字节是保留段。
2、验证了spi flash驱动、验证sd驱动,修改了drv_uart驱动,现在头疼的点就是没有串口接收空闲中断,按理说频率600MHZ以上影响不大,如果交付的话,这些串口也都是没意义的。电台(X)、sbus(X)、imu(无)、422(√).要接收惯导的数据,不要空闲中断+DMA可以吗?
3、目前差关于标志位等的flash分配,完善串口驱动

zhuts 1 неделя назад
Родитель
Сommit
9fc3600796
23 измененных файлов с 1384 добавлено и 1163 удалено
  1. 1 1
      controller_yy_app/controlware/my_math.c
  2. 5 6
      controller_yy_app/controlware/pilot_init.c
  3. 1 1
      controller_yy_app/controlware/pilot_navigation.c
  4. 1 0
      controller_yy_app/hardware/hard_flash_at45db.c
  5. 540 45
      controller_yy_app/hardware/hard_flash_gd25q16.c
  6. 9 1
      controller_yy_app/hardware/hard_hdma_int.c
  7. 3 2
      controller_yy_app/hardware/hard_inc/hard_flash_gd25q16.h
  8. 5 1
      controller_yy_app/hardware/hard_inc/hard_hdma_int.h
  9. 0 32
      controller_yy_app/hardware/hard_inc/hard_sdio_sd.h
  10. 175 93
      controller_yy_app/hardware/hard_sdio_sd.c
  11. 431 829
      controller_yy_app/software/drv_usart.c
  12. 2 0
      controller_yy_app/user_src/inc/test.h
  13. 96 90
      controller_yy_app/user_src/main.c
  14. 1 1
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/CMakeCache.txt
  15. 3 2
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/build.ninja
  16. 0 0
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/compile_commands.json
  17. 10 1
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/iar_embedded_workbench/controlware_yy_app.ewp
  18. 0 0
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/iar_embedded_workbench/controlware_yy_app.json
  19. 50 37
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/segger_embedded_studio/controlware_yy_app.emProject
  20. 44 7
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/segger_embedded_studio/controlware_yy_app.emSession
  21. 0 0
      controller_yy_app_controller_yy_board_flash_sdram_xip_debug/segger_embedded_studio/controlware_yy_app.json
  22. 1 6
      controller_yy_board/board.c
  23. 6 8
      controller_yy_board/board.h

+ 1 - 1
controller_yy_app/controlware/my_math.c

@@ -1,5 +1,5 @@
 #include "my_math.h"
-#include "arm_math.h"
+#include "hpm_math.h"
 #include <float.h>
 
 /*

+ 5 - 6
controller_yy_app/controlware/pilot_init.c

@@ -21,7 +21,6 @@
 #include "soft_timer.h"
 #include "soft_voltage.h"
 #include "stdio.h"
-#include "stm32f4xx.h"
 #include "ver_config.h"
 
 #define GCS_UART_Baudrate 115200 // 与地面站通信波特率
@@ -32,11 +31,11 @@ void auto_pilot_init(void)
 {
     /*****************************************************系统初始化**************************************************/
     // 配置系统时钟为168M 使用外部8M晶体+PLL
-    SystemInit();
-    // 中断向量表偏移
-    SCB->VTOR = FLASH_BASE | 0x10000;
-    // 设置中断向量组,1抢占优先级,3响应优先级
-    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
+    //SystemInit();
+    //// 中断向量表偏移
+    //SCB->VTOR = FLASH_BASE | 0x10000;
+    //// 设置中断向量组,1抢占优先级,3响应优先级
+    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
     // 延时初始化,并启动开机时间。
     system_delay_initial(168);
     // 启动系统主定时器 1us 总计数时间为0xffffffff * 0.000001

+ 1 - 1
controller_yy_app/controlware/pilot_navigation.c

@@ -1,5 +1,5 @@
 #include "pilot_navigation.h"
-#include "arm_math.h"
+#include "hpm_math.h"
 #include "auto_pilot.h"
 #include "common.h"
 #include "control_attitude.h"

+ 1 - 0
controller_yy_app/hardware/hard_flash_at45db.c

@@ -73,6 +73,7 @@ void at45db_init(void)
     format_config.common_config.cpol = spi_sclk_low_idle;  /* CPOL=0:空闲时低电平 */
     format_config.common_config.cpha = spi_sclk_sampling_odd_clk_edges; /* CPHA=0:第一个边沿采样 */
     spi_format_init(AT45DB_SPI_BASE, &format_config);
+    
 }
 
 /**

+ 540 - 45
controller_yy_app/hardware/hard_flash_gd25q16.c

@@ -1,37 +1,36 @@
-#include "hard_flash_gd25q16.h"
 #include "board.h"
+#include "hard_flash_gd25q16.h"
 #include "hpm_spi_drv.h"
 #include "hpm_clock_drv.h"
 #include "hpm_gpio_drv.h"
-
+#include "hpm_gpio_drv.h"
+#include "hpm_gpiom_drv.h"
+#include "test.h"
 #ifdef GD25Q16_FLASH
 
 /* 使用 SPI2 作为示例,你可以根据需要修改 */
 #define AT45DB_SPI_BASE          HPM_SPI2
 /******************SPI时钟频率*******************/
-#define AT45DB_CLK_FRE           21000000
+#define AT45DB_CLK_FRE           (42000000UL)
 /* GPIO 参数定义 - 根据实际硬件修改 */
-#define AT45DB_CS_GPIO_PTR       HPM_GPIO0    /* GPIO 控制器基地址 */
-#define AT45DB_CS_PORT           1            /* GPIOB = 1 */
-#define AT45DB_CS_PIN            12           /* PIN12 */
+#define AT45DB_CS_GPIO_PTR       HPM_GPIO0      /* GPIO 控制器基地址 */
+#define AT45DB_CS_PORT           GPIO_DO_GPIOB  /* GPIOB = 1 */
+#define AT45DB_CS_PIN            24             /* PIN24 */
 /* CS 控制宏 - 完全保留原名 */
 #define AT45db161_SPI_SELECT()   gpio_write_pin(AT45DB_CS_GPIO_PTR, AT45DB_CS_PORT, AT45DB_CS_PIN, 0)
 #define AT45db161_SPI_DESELECT() gpio_write_pin(AT45DB_CS_GPIO_PTR, AT45DB_CS_PORT, AT45DB_CS_PIN, 1)
-void gd25q16_cs_high()
+void gd25q16_cs_high(void)
 {
-  AT45db161_SPI_DESELECT();
+   AT45db161_SPI_DESELECT();
 }
 
-void gd25q16_cs_low()
+void gd25q16_cs_low(void)
 {
-  AT45db161_SPI_SELECT();
+   AT45db161_SPI_SELECT();
 }
 
-/* 静态变量 */
-static uint32_t spi_clk_freq;
-
 /**
- * @brief SPI 读写一个字节 - 保留原名
+ * @brief SPI 读写一个字节 
  */
 uint8_t SPI2_ReadWrite_Byte(uint8_t byte)
 {
@@ -55,7 +54,7 @@ uint8_t SPI2_ReadWrite_Byte(uint8_t byte)
 }
 
 /**
- * @brief 写使能 - 保留为静态函数,不暴露给外部
+ * @brief 写使能 
  */
 static void GD25Q16_WriteEnable(void)
 {
@@ -65,7 +64,7 @@ static void GD25Q16_WriteEnable(void)
 }
 
 /**
- * @brief 扇区擦除 - 保留原名
+ * @brief 扇区擦除 
  */
 static void GD25Q16_Erase_Sector(uint32_t addr)
 {
@@ -81,39 +80,71 @@ static void GD25Q16_Erase_Sector(uint32_t addr)
     while(AT45DB_IS_BUSY() == 0);
 }
 
+static void spi2_clk_config(void)
+{
+
+    /* SPI2 clock configure */
+    clock_add_to_group(clock_spi2, 0);
+    clock_set_source_divider(clock_spi2, clk_src_pll1_clk1, 5U); /* 80MHz */
+
+    printf("spi2 clock is %d\r\n", clock_get_frequency(clock_spi2));
+
+}
+
+static void spi2_gpio_config(void)
+{
+  
+    HPM_IOC->PAD[IOC_PAD_PB25].FUNC_CTL = IOC_PB25_FUNC_CTL_SPI2_MISO;
+
+    HPM_IOC->PAD[IOC_PAD_PB22].FUNC_CTL = IOC_PB22_FUNC_CTL_SPI2_MOSI;
+
+    HPM_IOC->PAD[IOC_PAD_PB21].FUNC_CTL = IOC_PB21_FUNC_CTL_SPI2_SCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+
+    // HPM_IOC->PAD[IOC_PAD_PB24].FUNC_CTL = IOC_PB24_FUNC_CTL_SPI2_CSN;
+    // 软件控制CS
+    gpiom_set_pin_controller(HPM_GPIOM, GPIOM_ASSIGN_GPIOB, 24, gpiom_soc_gpio0);
+    gpio_set_pin_output(HPM_GPIO0, GPIO_OE_GPIOB, 24);
+    gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOB, 24, 1);
+}
 /**
- * @brief 初始化 SPI 接口 - 保留原名
+ * @brief 初始化 SPI 接口 
  */
 void AT45db161_SPI_Configuration(void)
 {
     spi_timing_config_t timing_config = {0};
     spi_format_config_t format_config = {0};
     
-    /* 1. 初始化 SPI 时钟和引脚 */
-    spi_clk_freq = board_init_spi_clock(AT45DB_SPI_BASE);
-    board_init_spi_pins(AT45DB_SPI_BASE);
-    
-    /* 2. 配置 CS 引脚为输出 */
-    gpio_set_pin_output(AT45DB_CS_GPIO_PTR, AT45DB_CS_PORT, AT45DB_CS_PIN);
-    AT45db161_SPI_DESELECT();  /* CS 默认高电平 */
+    /* 初始化 SPI2 时钟和引脚 软件片选 IO对应硬件CS 可换成硬件*/
+
+    spi2_clk_config();
+
+    spi2_gpio_config(); /*软件CS  CS 默认高电平 */
     
-    /* 3. 配置 SPI 时序(主模式)*/
+    /* 配置 SPI 时序(主模式)*/
     spi_master_get_default_timing_config(&timing_config);
-    timing_config.master_config.clk_src_freq_in_hz = spi_clk_freq;
-    timing_config.master_config.sclk_freq_in_hz = AT45DB_CLK_FRE;
-    spi_master_timing_init(AT45DB_SPI_BASE, &timing_config);
-    
-    /* 4. 配置 SPI 格式 */
+    timing_config.master_config.clk_src_freq_in_hz =  clock_get_frequency(clock_spi2);
+    timing_config.master_config.sclk_freq_in_hz = AT45DB_CLK_FRE; // 20000000UL 20M 后续调整到42M
+    if (status_success != spi_master_timing_init(HPM_SPI2, &timing_config)) {
+        printf("SPI master timming init failed\n");
+      
+    }
+    printf("SPI-Master transfer timing is configured.\n");
+    printf("SPI-Master transfer source clock frequency: %dHz\n", timing_config.master_config.clk_src_freq_in_hz);
+    printf("SPI-Master transfer sclk frequency: %dHz\n", timing_config.master_config.sclk_freq_in_hz);
+
+    /* 配置 SPI 格式 */
     spi_master_get_default_format_config(&format_config);
     format_config.common_config.data_len_in_bits = 8;      /* 8位数据 */
     format_config.common_config.mode = spi_master_mode;    /* 主机模式 */
     format_config.common_config.cpol = spi_sclk_low_idle;  /* CPOL=0 */
     format_config.common_config.cpha = spi_sclk_sampling_odd_clk_edges; /* CPHA=0 */
     spi_format_init(AT45DB_SPI_BASE, &format_config);
+    printf("SPI-Master transfer format is configured.\n");
+
 }
 
 /**
- * @brief 初始化 flash 接口 - 保留原名
+ * @brief 初始化 flash 接口 
  */
 void flash_at45db_init(void)
 {
@@ -121,7 +152,7 @@ void flash_at45db_init(void)
 }
 
 /**
- * @brief 查询是否准备好 - 保留原名
+ * @brief 查询是否准备好 
  */
 uint8_t AT45DB_IS_BUSY(void)
 {
@@ -140,27 +171,56 @@ uint8_t AT45DB_IS_BUSY(void)
 }
 
 /**
- * @brief 检查芯片是否存在 - 保留原名
+ * @brief 检查芯片是否存在 
  */
 uint8_t AT45DB_Check(void)
 {
     uint8_t buf[3];
     
+     //printf("AT45DB_Check: 开始读取JEDEC ID\n");
+    
+    // 检查CS引脚控制
+    //printf("  CS引脚状态(读取前): %d\n", 
+          // gpio_read_pin(AT45DB_CS_GPIO_PTR, AT45DB_CS_PORT, AT45DB_CS_PIN));
+    
     AT45db161_SPI_SELECT();
-    SPI2_ReadWrite_Byte(0x9F); /* 读JEDEC ID */
+    //printf("  CS引脚状态(选中后): %d\n", 
+          // gpio_read_pin(AT45DB_CS_GPIO_PTR, AT45DB_CS_PORT, AT45DB_CS_PIN));
+    
+    // 发送读ID命令
+    SPI2_ReadWrite_Byte(0x9F);
+    
+    // 读取ID
     buf[0] = SPI2_ReadWrite_Byte(0);
     buf[1] = SPI2_ReadWrite_Byte(0);
     buf[2] = SPI2_ReadWrite_Byte(0);
+    
     AT45db161_SPI_DESELECT();
+   // printf("  CS引脚状态(取消选中后): %d\n", 
+          // gpio_read_pin(AT45DB_CS_GPIO_PTR, AT45DB_CS_PORT, AT45DB_CS_PIN));
     
+   // printf("  读取到的JEDEC ID: 0x%02X 0x%02X 0x%02X\n", buf[0], buf[1], buf[2]);
+    /* 厂商ID是 第一个字节 第二个字节是存储类型SPI FLASH 第三个字节是容量*/
     /* GD25Q16 的 ID 是 0xC8, 0x40, 0x15 */
-    if ((buf[0] == 0xC8) && (buf[1] == 0x40) && (buf[2] == 0x15))
+    /* W25Q64 的ID 是 0xEF 0x40 0x17 */
+    if ((buf[0] == 0xC8) && (buf[1] == 0x40) && (buf[2] == 0x15)) {
+        printf("  ID匹配成功!\n");
         return 1;
+    }
+    //if ((buf[0] == 0xEF) && (buf[1] == 0x40) && (buf[2] == 0x15)) {
+    //    printf("  ID匹配成功!\n");
+    //    return 1;
+    //}
+    // if ((buf[0] == 0xEF) && (buf[1] == 0x40) && (buf[2] == 0x17)) {
+    //    printf("  ID匹配成功!\n");
+    //    return 1;
+    //}
+    printf("  ID不匹配!期望: 0xC8 0x40 0x15\n");
     return 0;
 }
 
 /**
- * @brief 读一页数据 - 保留原名
+ * @brief 读一页数据 
  */
 void AT45DB_ReadPage(uint16_t Page_Add, uint8_t *pdata)
 {
@@ -185,7 +245,7 @@ void AT45DB_ReadPage(uint16_t Page_Add, uint8_t *pdata)
 }
 
 /**
- * @brief 写一页数据 - 保留原名
+ * @brief 写一页数据 
  */
 void AT45DB_WritePage(uint16_t page, uint8_t *Data)
 {
@@ -215,7 +275,7 @@ void AT45DB_WritePage(uint16_t page, uint8_t *Data)
 }
 
 /**
- * @brief 在一页内写入部分数据 - 保留原名
+ * @brief 在一页内写入部分数据 
  */
 void AT45DB_WriteBytes_OnOnePage(uint16_t page, uint8_t *Data, uint16_t len)
 {
@@ -249,7 +309,7 @@ void AT45DB_WriteBytes_OnOnePage(uint16_t page, uint8_t *Data, uint16_t len)
 }
 
 /**
- * @brief 从任意地址读取多个字节 - 保留原名
+ * @brief 从任意地址读取多个字节 
  */
 void AT45DB_Read_Bytes(uint32_t add, uint8_t *pdata, uint16_t len)
 {
@@ -287,7 +347,7 @@ void AT45DB_Read_Bytes(uint32_t add, uint8_t *pdata, uint16_t len)
 }
 
 /**
- * @brief 从任意地址写入多个字节 - 保留原名
+ * @brief 从任意地址写入多个字节 
  */
 void AT45DB_Write_Bytes(uint32_t add, uint8_t *pdata, uint16_t len)
 {
@@ -330,7 +390,7 @@ void AT45DB_Write_Bytes(uint32_t add, uint8_t *pdata, uint16_t len)
 }
 
 /**
- * @brief 写入浮点数 - 保留原名
+ * @brief 写入浮点数 
  */
 void AT45DB_Write_float(uint32_t add, float wvalue)
 {
@@ -340,7 +400,7 @@ void AT45DB_Write_float(uint32_t add, float wvalue)
 }
 
 /**
- * @brief 读取浮点数 - 保留原名
+ * @brief 读取浮点数 
  */
 float AT45DB_Read_float(uint32_t add)
 {
@@ -351,7 +411,7 @@ float AT45DB_Read_float(uint32_t add)
 }
 
 /**
- * @brief 写入16位整数 - 保留原名
+ * @brief 写入16位整数
  */
 void AT45DB_Write_int16(uint32_t add, int16_t wvalue)
 {
@@ -361,7 +421,7 @@ void AT45DB_Write_int16(uint32_t add, int16_t wvalue)
 }
 
 /**
- * @brief 读取16位整数 - 保留原名
+ * @brief 读取16位整数 
  */
 int16_t AT45DB_Read_int16(uint32_t add)
 {
@@ -371,4 +431,439 @@ int16_t AT45DB_Read_int16(uint32_t add)
     return data.value;
 }
 
-#endif /* GD25Q16_FLASH */
+#endif /* GD25Q16_FLASH */
+/* 20260322 spi flash test pass 测试了W25Q64与Q16; note:ai 写测试例程太全面了*/
+#ifdef GD25Q16_TEST
+
+/**
+ * @file test_gd25q16.c
+ * @brief GD25Q16 SPI Flash 驱动测试程序
+ * 
+ * 测试内容:
+ * 1. 芯片 ID 读取和存在性检查
+ * 2. 状态寄存器读取
+ * 3. 页写入和页读取
+ * 4. 任意地址写入和读取(跨页)
+ * 5. 浮点数和整数读写
+ * 6. 擦除功能验证
+ */
+
+/* 测试缓冲区大小 */
+#define TEST_BUFFER_SIZE    512
+#define TEST_PAGE_NUM       100     /* 测试用的页号,范围 0-8191 */
+#define TEST_SECTOR_ADDR    (TEST_PAGE_NUM * 256)  /* 测试用的扇区起始地址 */
+
+/* 测试用的数据模式 */
+static const uint8_t test_pattern[] = {
+    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
+    0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
+    0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
+};
+
+/**
+ * @brief 打印内存数据(十六进制格式)
+ */
+static void print_hex_data(const uint8_t *data, uint16_t len, const char *title)
+{
+    uint16_t i;
+    
+    printf("\n========== %s ==========\n", title);
+    for (i = 0; i < len; i++) {
+        printf("%02X ", data[i]);
+        if ((i + 1) % 16 == 0) {
+            printf("\n");
+        }
+    }
+    if (len % 16 != 0) {
+        printf("\n");
+    }
+    printf("========== 结束 ==========\n\n");
+}
+
+/**
+ * @brief 比较两个内存块是否相等
+ */
+static uint8_t compare_memory(const uint8_t *expected, const uint8_t *actual, uint16_t len)
+{
+    uint16_t i;
+    uint8_t match = 1;
+    
+    for (i = 0; i < len; i++) {
+        if (expected[i] != actual[i]) {
+            printf(" 数据不匹配 @ 偏移 %d: 期望 0x%02X, 实际 0x%02X\n", 
+                   i, expected[i], actual[i]);
+            match = 0;
+        }
+    }
+    return match;
+}
+
+/**
+ * @brief 测试 1:芯片检测和 ID 读取
+ */
+static uint8_t test_chip_detection(void)
+{
+    uint8_t result;
+    
+    printf("\n========================================\n");
+    printf("测试 1:芯片检测\n");
+    printf("========================================\n");
+    
+    result = AT45DB_Check();
+    if (result) {
+        printf("✅ 芯片检测成功!GD25Q16 存在\n");
+        
+        /* 手动读取 JEDEC ID 用于显示 */
+        uint8_t buf[3];
+        AT45db161_SPI_SELECT();
+        SPI2_ReadWrite_Byte(0x9F);
+        buf[0] = SPI2_ReadWrite_Byte(0);
+        buf[1] = SPI2_ReadWrite_Byte(0);
+        buf[2] = SPI2_ReadWrite_Byte(0);
+        AT45db161_SPI_DESELECT();
+        
+        printf("   JEDEC ID: 0x%02X 0x%02X 0x%02X\n", buf[0], buf[1], buf[2]);
+        printf("   制造商: 0x%02X (GigaDevice)\n", buf[0]);
+        printf("   型号: 0x%02X%02X (GD25Q16)\n", buf[1], buf[2]);
+        printf("   容量: 16Mbit (2MByte)\n");
+        
+        return 1;
+    } else {
+        printf("❌ 芯片检测失败!请检查硬件连接\n");
+        return 0;
+    }
+}
+
+/**
+ * @brief 测试 2:页写入和页读取
+ */
+static uint8_t test_page_write_read(void)
+{
+    uint8_t write_buf[256];
+    uint8_t read_buf[256];
+    uint16_t i;
+    
+    printf("\n========================================\n");
+    printf("测试 2:页写入和页读取\n");
+    printf("========================================\n");
+    printf("测试页号: %d (地址: 0x%06X)\n", TEST_PAGE_NUM, TEST_PAGE_NUM * 256);
+    
+    /* 准备测试数据 */
+    for (i = 0; i < 256; i++) {
+        write_buf[i] = (uint8_t)(i + TEST_PAGE_NUM);
+    }
+    print_hex_data(write_buf, 32, "写入数据(前32字节)");
+    
+    /* 写入一页 */
+    printf("正在写入数据...\n");
+    AT45DB_WritePage(TEST_PAGE_NUM, write_buf);
+    printf("✅ 页写入完成\n");
+    
+    /* 读取一页 */
+    printf("正在读取数据...\n");
+    AT45DB_ReadPage(TEST_PAGE_NUM, read_buf);
+    printf("✅ 页读取完成\n");
+    print_hex_data(read_buf, 32, "读取数据(前32字节)");
+    
+    /* 验证数据 */
+    if (compare_memory(write_buf, read_buf, 256)) {
+        printf("✅ 页写入/读取测试通过!\n");
+        return 1;
+    } else {
+        printf("❌ 页写入/读取测试失败!\n");
+        return 0;
+    }
+}
+
+/**
+ * @brief 测试 3:任意地址写入和读取(跨页)
+ */
+static uint8_t test_random_address_write_read(void)
+{
+    uint8_t write_buf[TEST_BUFFER_SIZE];
+    uint8_t read_buf[TEST_BUFFER_SIZE];
+    uint16_t i;
+    uint32_t start_addr = TEST_SECTOR_ADDR + 100;  /* 从页内偏移 100 开始 */
+    
+    printf("\n========================================\n");
+    printf("测试 3:任意地址写入和读取(跨页测试)\n");
+    printf("========================================\n");
+    printf("起始地址: 0x%06X (页 %d, 偏移 %d)\n", 
+           start_addr, start_addr / 256, start_addr % 256);
+    printf("数据长度: %d 字节 (跨页: %d 页)\n", 
+           TEST_BUFFER_SIZE, (start_addr + TEST_BUFFER_SIZE - 1) / 256 - start_addr / 256 + 1);
+    
+    /* 准备测试数据 */
+    for (i = 0; i < TEST_BUFFER_SIZE; i++) {
+        write_buf[i] = (uint8_t)(i % 256);
+    }
+    print_hex_data(write_buf, 32, "写入数据(前32字节)");
+    
+    /* 写入数据 */
+    printf("正在写入数据...\n");
+    AT45DB_Write_Bytes(start_addr, write_buf, TEST_BUFFER_SIZE);
+    printf(" 数据写入完成\n");
+    
+    /* 读取数据 */
+    printf("正在读取数据...\n");
+    AT45DB_Read_Bytes(start_addr, read_buf, TEST_BUFFER_SIZE);
+    printf(" 数据读取完成\n");
+    print_hex_data(read_buf, 32, "读取数据(前32字节)");
+    
+    /* 验证数据 */
+    if (compare_memory(write_buf, read_buf, TEST_BUFFER_SIZE)) {
+        printf(" 任意地址写入/读取测试通过!\n");
+        return 1;
+    } else {
+        printf(" 任意地址写入/读取测试失败!\n");
+        return 0;
+    }
+}
+
+/**
+ * @brief 测试 4:浮点数读写
+ */
+static uint8_t test_float_read_write(void)
+{
+    uint32_t addr = TEST_SECTOR_ADDR + 400;
+    float test_values[] = {3.14159f, 2.71828f, -123.456f, 0.0f, 999.999f};
+    float read_value;
+    uint8_t i;
+    uint8_t all_pass = 1;
+    
+    printf("\n========================================\n");
+    printf("测试 4:浮点数读写\n");
+    printf("========================================\n");
+    printf("测试地址: 0x%06X\n", addr);
+    
+    for (i = 0; i < sizeof(test_values) / sizeof(test_values[0]); i++) {
+        printf("\n[测试 %d] 写入值: %f\n", i + 1, test_values[i]);
+        
+        AT45DB_Write_float(addr + i * 4, test_values[i]);
+        read_value = AT45DB_Read_float(addr + i * 4);
+        
+        printf("        读取值: %f\n", read_value);
+        
+        /* 浮点数比较,使用误差范围 */
+        if ((test_values[i] - read_value) < 0.0001f && 
+            (read_value - test_values[i]) < 0.0001f) {
+            printf("        验证通过\n");
+        } else {
+            printf("        验证失败\n");
+            all_pass = 0;
+        }
+    }
+    
+    if (all_pass) {
+        printf("\n 浮点数读写测试通过!\n");
+        return 1;
+    } else {
+        printf("\n 浮点数读写测试失败!\n");
+        return 0;
+    }
+}
+
+/**
+ * @brief 测试 5:16位整数读写
+ */
+static uint8_t test_int16_read_write(void)
+{
+    uint32_t addr = TEST_SECTOR_ADDR + 500;
+    int16_t test_values[] = {12345, -5678, 0, 32767, -32768};
+    int16_t read_value;
+    uint8_t i;
+    uint8_t all_pass = 1;
+    
+    printf("\n========================================\n");
+    printf("测试 5:16位整数读写\n");
+    printf("========================================\n");
+    printf("测试地址: 0x%06X\n", addr);
+    
+    for (i = 0; i < sizeof(test_values) / sizeof(test_values[0]); i++) {
+        printf("\n[测试 %d] 写入值: %d\n", i + 1, test_values[i]);
+        
+        AT45DB_Write_int16(addr + i * 2, test_values[i]);
+        read_value = AT45DB_Read_int16(addr + i * 2);
+        
+        printf("        读取值: %d\n", read_value);
+        
+        if (test_values[i] == read_value) {
+            printf("         验证通过\n");
+        } else {
+            printf("         验证失败\n");
+            all_pass = 0;
+        }
+    }
+    
+    if (all_pass) {
+        printf("\n 16位整数读写测试通过!\n");
+        return 1;
+    } else {
+        printf("\n 16位整数读写测试失败!\n");
+        return 0;
+    }
+}
+
+/**
+ * @brief 测试 6:擦除功能验证
+ */
+static uint8_t test_erase_verify(void)
+{
+    uint8_t read_buf[256];
+    uint16_t i;
+    uint8_t all_erased = 1;
+    uint32_t test_addr = TEST_SECTOR_ADDR;
+    
+    printf("\n========================================\n");
+    printf("测试 6:擦除功能验证\n");
+    printf("========================================\n");
+    printf("擦除扇区地址: 0x%06X (页 %d)\n", test_addr, test_addr / 256);
+    
+    /* 先写入已知数据 */
+    printf("步骤 1: 写入测试数据...\n");
+    for (i = 0; i < 256; i++) {
+        read_buf[i] = (uint8_t)(0xAA);
+    }
+    AT45DB_WritePage(TEST_PAGE_NUM, read_buf);
+    
+    /* 验证写入成功 */
+    AT45DB_ReadPage(TEST_PAGE_NUM, read_buf);
+    for (i = 0; i < 256; i++) {
+        if (read_buf[i] != 0xAA) {
+            printf(" 数据写入验证失败\n");
+            return 0;
+        }
+    }
+    printf("测试数据写入成功\n");
+    
+    /* 执行扇区擦除 */
+    printf("步骤 2: 执行扇区擦除...\n");
+    GD25Q16_Erase_Sector(test_addr);
+    printf("扇区擦除完成\n");
+    
+    /* 验证擦除结果(擦除后应该是 0xFF) */
+    printf("步骤 3: 验证擦除结果...\n");
+    AT45DB_ReadPage(TEST_PAGE_NUM, read_buf);
+    
+    for (i = 0; i < 256; i++) {
+        if (read_buf[i] != 0xFF) {
+            printf(" 地址 0x%06X: 期望 0xFF, 实际 0x%02X\n", 
+                   test_addr + i, read_buf[i]);
+            all_erased = 0;
+        }
+    }
+    
+    if (all_erased) {
+        printf(" 所有字节验证为 0xFF\n");
+        printf(" 擦除功能测试通过!\n");
+        return 1;
+    } else {
+        printf(" 擦除功能测试失败!\n");
+        return 0;
+    }
+}
+
+/**
+ * @brief 主测试函数
+ */
+void test_gd25q16(void)
+{
+    uint8_t test_result[6];
+    uint8_t all_pass = 1;
+    uint32_t start_time, end_time;
+    
+    printf("\n");
+    printf("╔══════════════════════════════════════════════════════════╗\n");
+    printf("║         GD25Q16 SPI Flash 驱动测试程序                   ║\n");
+    printf("╚══════════════════════════════════════════════════════════╝\n");
+    
+    /* 初始化 Flash */
+    printf("\n正在初始化 SPI Flash...\n");
+    flash_at45db_init();
+    printf(" SPI Flash 初始化完成\n");
+    
+    /* 运行所有测试 */
+    test_result[0] = test_chip_detection();
+    if (!test_result[0]) {
+        printf("\n 芯片检测失败,终止后续测试!\n");
+        return;
+    }
+    
+    test_result[1] = test_page_write_read();
+    test_result[2] = test_random_address_write_read();
+    test_result[3] = test_float_read_write();
+    test_result[4] = test_int16_read_write();
+    test_result[5] = test_erase_verify();
+    
+    /* 打印测试总结 */
+    printf("\n");
+    printf("╔══════════════════════════════════════════════════════════╗\n");
+    printf("║                      测试总结                             ║\n");
+    printf("╠══════════════════════════════════════════════════════════╣\n");
+    
+    const char *test_names[] = {
+        "芯片检测",
+        "页写入/读取",
+        "任意地址写入/读取",
+        "浮点数读写",
+        "16位整数读写",
+        "擦除功能验证"
+    };
+    
+    for (int i = 0; i < 6; i++) {
+        printf("║ 测试 %d: %-20s : %s\n", 
+               i + 1, 
+               test_names[i],
+               test_result[i] ? " 通过" : " 失败");
+        if (!test_result[i]) all_pass = 0;
+    }
+    
+    printf("╠══════════════════════════════════════════════════════════╣\n");
+    if (all_pass) {
+        printf("║ 最终结果:  所有测试通过!驱动工作正常 🎉              ║\n");
+    } else {
+        printf("║ 最终结果:  部分测试失败,请检查硬件或驱动 ⚠️          ║\n");
+    }
+    printf("╚══════════════════════════════════════════════════════════╝\n");
+}
+
+/**
+ * @brief 简化的快速测试(仅测试基本功能)
+ */
+void test_gd25q16_quick(void)
+{
+    printf("\n=== GD25Q16 快速测试 ===\n");
+    
+    flash_at45db_init();
+    
+    /* 测试芯片存在 */
+    if (AT45DB_Check()) {
+        printf(" 芯片检测通过\n");
+    } else {
+        printf(" 芯片检测失败\n");
+        return;
+    }
+    
+    /* 简单读写测试 */
+    uint8_t write_buf[32];
+    uint8_t read_buf[32];
+    
+    for (int i = 0; i < 32; i++) {
+        write_buf[i] = i;
+    }
+    
+    AT45DB_Write_Bytes(0, write_buf, 32);
+    AT45DB_Read_Bytes(0, read_buf, 32);
+    
+    if (memcmp(write_buf, read_buf, 32) == 0) {
+        printf(" 读写测试通过\n");
+    } else {
+        printf(" 读写测试失败\n");
+    }
+    
+    printf("=== 快速测试结束 ===\n");
+
+    test_gd25q16();
+}
+#endif

+ 9 - 1
controller_yy_app/hardware/hard_hdma_int.c

@@ -1,9 +1,15 @@
 #include "hard_hdma_int.h"
 #include "hpm_dma_drv.h"
 #include "board.h"
-
+volatile bool uart1_tx_dma_done;
 volatile bool uart2_tx_dma_done;
 volatile bool uart3_tx_dma_done;
+volatile bool uart4_tx_dma_done;
+volatile bool uart5_tx_dma_done;
+volatile bool uart6_tx_dma_done;
+
+
+
 /*--------------------------------------------------------------------------*/
 /* DMA 发送完成中断服务程序                                                */
 /*--------------------------------------------------------------------------*/
@@ -21,4 +27,6 @@ void dma_isr(void)
         uart3_tx_dma_done = true;
 
     }
+
+
 }

+ 3 - 2
controller_yy_app/hardware/hard_inc/hard_flash_gd25q16.h

@@ -68,8 +68,9 @@ void AT45DB_WritePage(uint16_t page, uint8_t *Data);
 
 void AT45DB_WriteBytes_OnOnePage(uint16_t page, uint8_t *Data, uint16_t len);
 
-void gd25q16_cs_high();
+void gd25q16_cs_high(void);
 
-void gd25q16_cs_low();
+void gd25q16_cs_low(void);
 
+void test_gd25q16_quick(void);
 #endif

+ 5 - 1
controller_yy_app/hardware/hard_inc/hard_hdma_int.h

@@ -34,5 +34,9 @@
 #define SBUS_UART2_DMA_IRQ_RANK      1 
 
 
+extern volatile bool uart1_tx_dma_done;
 extern volatile bool uart2_tx_dma_done;
-extern volatile bool uart3_tx_dma_done;
+extern volatile bool uart3_tx_dma_done;
+extern volatile bool uart4_tx_dma_done;
+extern volatile bool uart5_tx_dma_done;
+extern volatile bool uart6_tx_dma_done;

+ 0 - 32
controller_yy_app/hardware/hard_inc/hard_sdio_sd.h

@@ -2,37 +2,5 @@
 #ifndef  __HARD_SDIO_SD_H
 #define  __HARD_SDIO_SD_H
 
-#include "hpm_sdmmc_sd.h"
-#define RUN_CORE HPM_CORE0
 
-#define SDCARD_SDXC_BASE                 (HPM_SDXC1)
-#define SDCARD_SUPPORT_3V3               (1)
-#define SDCARD_SUPPORT_1V8               (1)
-#define SDCARD_SUPPORT_4BIT              (1)
-#define SDCARD_SUPPORT_CARD_DETECTION    (1)
-#define SDCARD_SUPPORT_POWER_SWITCH      (0)
-#define SDCARD_SUPPORT_VOLTAGE_SWITCH    (1)
-#define SDCARD_SUPPORT_CARD_DETECTION    (1)
-#define SDCARD_CARD_DETECTION_USING_GPIO (0)
-#if defined(SDCARD_CARD_DETECTION_USING_GPIO) && (SDCARD_CARD_DETECTION_USING_GPIO == 1)
-#define SDCARD_CARD_DETECTION_GPIO       NULL
-#define SDCARD_CARD_DETECTION_GPIO_INDEX 0
-#define SDCARD_CARD_DETECTION_PIN_INDEX  0
-#endif
-#define EMMC_SDXC_BASE              (HPM_SDXC1)
-#define EMMC_SUPPORT_3V3            (1)
-#define EMMC_SUPPORT_1V8            (0)
-#define EMMC_SUPPORT_4BIT           (1)
-#define EMMC_SUPPORT_8BIT           (0)
-#define EMMC_SUPPORT_VOLTAGE_SWITCH (0)
-/* For eMMC device, it is recommended to use GPIO to switch voltage directly */
-#define EMMC_VOLTAGE_SWITCH_USING_GPIO (1)
-#if defined(EMMC_VOLTAGE_SWITCH_USING_GPIO) && (EMMC_VOLTAGE_SWITCH_USING_GPIO == 1)
-#define EMMC_VSEL_PIN IOC_PAD_PD29
-#endif
-void sdxc1_cd_pin(SDXC_Type *ptr, bool as_gpio);
-uint32_t sd1_configure_clock(SDXC_Type *ptr, uint32_t freq, bool need_inverse);
-void sdxc1_cmd_pin(SDXC_Type *ptr, bool open_drain, bool is_1v8);
-void sdxc1_clk_data_pins(SDXC_Type *ptr, uint32_t width, bool is_1v8);
-void sdxc1_vsel_pin(SDXC_Type *ptr, bool as_gpio);
 #endif

+ 175 - 93
controller_yy_app/hardware/hard_sdio_sd.c

@@ -1,117 +1,199 @@
-#include "board.h"
-#include "hpm_sdxc_drv.h"
 #include "hard_sdio_sd.h"
-#include "hard_system_delay.h"
-// 使用官方的SDMMC例程包
+#include "board.h"
+#include "test.h"
+// 使用官方的SDMMC例程包 SD1 挂载在 
+// PD27 D2 PD26 D3 PD21 CMD PD22 CLK PD18 D0 PD17 D1 PD28 CD
 // 修改时要修改初始化io 和时钟 在port文件内
 // 这里负责操作初始化IO 和 时钟的接口 注意在port文件填写对应的回调函数
 
-void sdxc1_vsel_pin(SDXC_Type *ptr, bool as_gpio)
+// SD_TEST 20260322 pass 
+#ifdef SD_TEST
+#include "hpm_sdmmc_sd.h"
+#include "ff.h"
+#include "diskio.h"
+
+FATFS s_sd_disk;
+FIL s_file;
+DIR s_dir;
+FRESULT fatfs_result;
+BYTE work[FF_MAX_SS];
+const TCHAR driver_num_buf[4] = { DEV_SD + '0', ':', '/', '\0' };
+
+#define TEST_DIR_NAME "hpmicro_sd_test_dir0"
+
+static FRESULT sd_write_file(void)
 {
-    uint32_t vsel_pad_ctl = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
-    if (ptr == HPM_SDXC1) {
-        uint32_t vsel_func_alt = as_gpio ? IOC_PD29_FUNC_CTL_GPIO_D_29 : IOC_PD29_FUNC_CTL_SDC1_VSEL;
-        HPM_IOC->PAD[IOC_PAD_PD29].FUNC_CTL = vsel_func_alt;
-        HPM_IOC->PAD[IOC_PAD_PD29].PAD_CTL = vsel_pad_ctl;
+    FRESULT fresult = f_open(&s_file, "readme.txt", FA_WRITE | FA_CREATE_ALWAYS);
+    if (fresult != FR_OK) {
+        printf("Create new file failed, cause: %d\n", show_error_string(fresult));
+    } else {
+        printf("Create new file successfully, status=%d\n", fresult);
+    }
+    char hello_str[] = "Hello, this is SD card FATFS demo\n";
+    UINT byte_written;
+    fresult = f_write(&s_file, hello_str, sizeof(hello_str), &byte_written);
+    if (fresult != FR_OK) {
+        printf("Write file failed, cause: %s\n", show_error_string(fresult));
+    } else {
+        printf("Write file operation is successfully\n");
     }
+
+    f_close(&s_file);
+
+    return fresult;
 }
 
-void sdxc1_cd_pin(SDXC_Type *ptr, bool as_gpio)
+static FRESULT sd_read_file(void)
 {
-    uint32_t cd_pad_ctl = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
-    if (ptr == HPM_SDXC1) {
-        /* SDXC1.CDN */
-        uint32_t cd_func_alt = as_gpio ? IOC_PD28_FUNC_CTL_GPIO_D_28 : IOC_PD28_FUNC_CTL_SDC1_CDN;
-        HPM_IOC->PAD[IOC_PAD_PD28].FUNC_CTL = cd_func_alt;
-        HPM_IOC->PAD[IOC_PAD_PD28].PAD_CTL = cd_pad_ctl;
+    FRESULT fresult = f_open(&s_file, "readme.txt", FA_READ);
+    if (fresult != FR_OK) {
+        printf("Open file failed, cause: %s\n", show_error_string(fresult));
+    } else {
+        printf("Open file successfully\n");
     }
-}
 
-uint32_t sd1_configure_clock(SDXC_Type *ptr, uint32_t freq, bool need_inverse)
+    if (fresult != FR_OK) {
+        return fresult;
+    }
+
+    TCHAR str[100];
+    f_gets(str, sizeof(str), &s_file);
+    printf("%s\n", str);
+
+    f_close(&s_file);
+
+    return fresult;
+}
+const char *show_error_string(FRESULT fresult)
 {
-    uint32_t actual_freq = 0;
-    do {
-        if (ptr != HPM_SDXC1) {
-            break;
-        }
-        clock_name_t sdxc_clk = (ptr == HPM_SDXC0) ? clock_sdxc0 : clock_sdxc1;
-        sdxc_enable_inverse_clock(ptr, false);
-        sdxc_enable_sd_clock(ptr, false);
-        /* Configure the clock below 400KHz for the identification state */
-        if (freq <= 400000UL) {
-            clock_set_source_divider(sdxc_clk, clk_src_osc24m, 63);
-        }
-            /* configure the clock to 24MHz for the SDR12/Default speed */
-        else if (freq <= 26000000UL) {
-            clock_set_source_divider(sdxc_clk, clk_src_osc24m, 1);
-        }
-            /* Configure the clock to 50MHz for the SDR25/High speed/50MHz DDR/50MHz SDR */
-        else if (freq <= 52000000UL) {
-            clock_set_source_divider(sdxc_clk, clk_src_pll1_clk1, 8);
-        }
-            /* Configure the clock to 100MHz for the SDR50 */
-        else if (freq <= 100000000UL) {
-            clock_set_source_divider(sdxc_clk, clk_src_pll1_clk1, 4);
-        }
-            /* Configure the clock to 166MHz for SDR104/HS200/HS400  */
-        else if (freq <= 208000000UL) {
-            clock_set_source_divider(sdxc_clk, clk_src_pll2_clk0, 2);
-        }
-            /* For other unsupported clock ranges, configure the clock to 24MHz */
-        else {
-            clock_set_source_divider(sdxc_clk, clk_src_osc24m, 1);
-        }
-        if (need_inverse) {
-            sdxc_enable_inverse_clock(ptr, true);
-        }
-        sdxc_enable_sd_clock(ptr, true);
-        actual_freq = clock_get_frequency(sdxc_clk);
-    } while (false);
+    const char *result_str;
 
-    return actual_freq;
+    switch (fresult) {
+    case FR_OK:
+        result_str = "succeeded";
+        break;
+    case FR_DISK_ERR:
+        result_str = "A hard error occurred in the low level disk I/O level";
+        break;
+    case FR_INT_ERR:
+        result_str = "Assertion failed";
+        break;
+    case FR_NOT_READY:
+        result_str = "The physical drive cannot work";
+        break;
+    case FR_NO_FILE:
+        result_str = "Could not find the file";
+        break;
+    case FR_NO_PATH:
+        result_str = "Could not find the path";
+        break;
+    case FR_INVALID_NAME:
+        result_str = "Tha path name format is invalid";
+        break;
+    case FR_DENIED:
+        result_str = "Access denied due to prohibited access or directory full";
+        break;
+    case FR_EXIST:
+        result_str = "Access denied due to prohibited access";
+        break;
+    case FR_INVALID_OBJECT:
+        result_str = "The file/directory object is invalid";
+        break;
+    case FR_WRITE_PROTECTED:
+        result_str = "The physical drive is write protected";
+        break;
+    case FR_INVALID_DRIVE:
+        result_str = "The logical driver number is invalid";
+        break;
+    case FR_NOT_ENABLED:
+        result_str = "The volume has no work area";
+        break;
+    case FR_NO_FILESYSTEM:
+        result_str = "There is no valid FAT volume";
+        break;
+    case FR_MKFS_ABORTED:
+        result_str = "THe f_mkfs() aborted due to any problem";
+        break;
+    case FR_TIMEOUT:
+        result_str = "Could not get a grant to access the volume within defined period";
+        break;
+    case FR_LOCKED:
+        result_str = "The operation is rejected according to the file sharing policy";
+        break;
+    case FR_NOT_ENOUGH_CORE:
+        result_str = "LFN working buffer could not be allocated";
+        break;
+    case FR_TOO_MANY_OPEN_FILES:
+        result_str = "Number of open files > FF_FS_LOCK";
+        break;
+    case FR_INVALID_PARAMETER:
+        result_str = "Given parameter is invalid";
+        break;
+    default:
+        result_str = "Unknown error";
+        break;
+    }
+    return result_str;
 }
 
-void sdxc1_cmd_pin(SDXC_Type *ptr, bool open_drain, bool is_1v8)
+static FRESULT sd_mount_fs(void)
 {
-    uint32_t cmd_func_ctl = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(17) | IOC_PAD_FUNC_CTL_LOOP_BACK_SET(1);
-    uint32_t cmd_pad_ctl = IOC_PAD_PAD_CTL_MS_SET(is_1v8) | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) |
-                           IOC_PAD_PAD_CTL_PS_SET(1);
-    if (open_drain) {
-        cmd_pad_ctl |= IOC_PAD_PAD_CTL_OD_MASK;
+    FRESULT fresult = f_mount(&s_sd_disk, driver_num_buf, 1);
+    if (fresult == FR_OK) {
+        printf("SD card has been mounted successfully\n");
+    } else {
+        printf("Failed to mount SD card, cause: %s\n", show_error_string(fresult));
     }
 
-    if (ptr == HPM_SDXC1) {
-        /* SDXC1.CMD */
-        HPM_IOC->PAD[IOC_PAD_PD21].FUNC_CTL = cmd_func_ctl;
-        HPM_IOC->PAD[IOC_PAD_PD21].PAD_CTL = cmd_pad_ctl;
-    }
+    fresult = f_chdrive(driver_num_buf);
+    return fresult;
 }
 
-void sdxc1_clk_data_pins(SDXC_Type *ptr, uint32_t width, bool is_1v8)
+static FRESULT sd_mkfs(void)
 {
-    uint32_t func_ctl = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(17);
-    uint32_t pad_ctl = IOC_PAD_PAD_CTL_MS_SET(is_1v8) | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) |
-                       IOC_PAD_PAD_CTL_PS_SET(1);
-
-    if (ptr == HPM_SDXC1) {
-        /* SDXC1.CLK */
-        HPM_IOC->PAD[IOC_PAD_PD22].FUNC_CTL = func_ctl;
-        HPM_IOC->PAD[IOC_PAD_PD22].PAD_CTL = pad_ctl;
-
-        /* SDXC1.DATA0 */
-        HPM_IOC->PAD[IOC_PAD_PD18].FUNC_CTL = func_ctl;
-        HPM_IOC->PAD[IOC_PAD_PD18].PAD_CTL = pad_ctl;
-        if ((width == 4)) {
-            /* SDXC1.DATA1 */
-            HPM_IOC->PAD[IOC_PAD_PD17].FUNC_CTL = func_ctl;
-            HPM_IOC->PAD[IOC_PAD_PD17].PAD_CTL = pad_ctl;
-            /* SDXC1.DATA2 */
-            HPM_IOC->PAD[IOC_PAD_PD27].FUNC_CTL = func_ctl;
-            HPM_IOC->PAD[IOC_PAD_PD27].PAD_CTL = pad_ctl;
-            /* SDXC1.DATA3 */
-            HPM_IOC->PAD[IOC_PAD_PD26].FUNC_CTL = func_ctl;
-            HPM_IOC->PAD[IOC_PAD_PD26].PAD_CTL = pad_ctl;
+    printf("Formatting the SD card, depending on the SD card capacity, the formatting process may take a long time\n");
+    FRESULT fresult = f_mkfs(driver_num_buf, NULL, work, sizeof(work));
+    if (fresult != FR_OK) {
+        printf("Making File system failed, cause: %s\n", show_error_string(fresult));
+    } else {
+        printf("Making file system is successful\n");
+    }
+
+    return fresult;
+}
+void SD1_test(void)
+{ 
+    bool need_init_filesystem = true;
+    board_init();
+   
+    /* Before doing FATFS operation, ensure the SD card is present */
+    DSTATUS dstatus = disk_status(DEV_SD);
+    if (dstatus == STA_NODISK) {
+        printf("No disk in the SD slot, please insert an SD card...\n");
+        do {
+            dstatus = disk_status(DEV_SD);
+        } while (dstatus == STA_NODISK);
+        board_delay_ms(100);
+        printf("Detected SD card, re-initialize the filesystem...\n");
+        need_init_filesystem = true;
+    }
+    dstatus = disk_initialize(DEV_SD);
+    if (dstatus != RES_OK) {
+        printf("Failed to initialize SD disk\n");
+    }
+    if (need_init_filesystem) {
+        fatfs_result = sd_mount_fs();
+        if (fatfs_result == FR_NO_FILESYSTEM) {
+            printf("There is no File system available, making file system...\n");
+            fatfs_result = sd_mkfs();
+            if (fatfs_result != FR_OK) {
+                printf("Failed to make filesystem, cause:%s\n", show_error_string(fatfs_result));
+            } else {
+                need_init_filesystem = false;
+            }
         }
     }
+}
+ 
 
-}
+#endif

+ 431 - 829
controller_yy_app/software/drv_usart.c

@@ -1,918 +1,520 @@
-#include "drv_usart.h"
-#include "rkfifo.h"
-#include "stm32f4xx.h"
-#include "string.h"
 #include "board.h"
+#include "hard_hdma_int.h"
+#include "hpm_uart_drv.h"
+#include "hpm_dmamux_drv.h"
+#include "hpm_dma_drv.h"
+#include "hpm_gpio_drv.h"
+#include "hpm_clock_drv.h"
+#include "rkfifo.h"
+#include <string.h>
 
+/* ========== 配置宏定义 ========== */
+#ifndef UART_RX_FIFO_BUFFER_LEN
+#define UART_RX_FIFO_BUFFER_LEN    256
+#endif
 
-static inline int _stm32_uart_rcc_enable(USART_TypeDef *uartx)
-{
-    int ret = 0;
-    switch ((uint32_t)uartx)
-    {
-    case (uint32_t)USART1:
-        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
-        break;
-    case (uint32_t)USART2:
-        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
-        break;
-    case (uint32_t)USART3:
-        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
-        break;
-    case (uint32_t)UART4:
-        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
-        break;
-    case (uint32_t)UART5:
-        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
-        break;
-    case (uint32_t)USART6:
-        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
-        break;
-
-    default:
-        ret = -1;
-        break;
-    }
-    return ret;
-}
-
-static inline int _stm32_dma_rcc_enable(DMA_Stream_TypeDef *tx_dma)
-{
-    int ret = 0;
-    switch ((uint32_t)tx_dma)
-    {
-    case (uint32_t)DMA1_Stream0:
-    case (uint32_t)DMA1_Stream1:
-    case (uint32_t)DMA1_Stream2:
-    case (uint32_t)DMA1_Stream3:
-    case (uint32_t)DMA1_Stream4:
-    case (uint32_t)DMA1_Stream5:
-    case (uint32_t)DMA1_Stream6:
-    case (uint32_t)DMA1_Stream7:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
-        break;
-
-    case (uint32_t)DMA2_Stream0:
-    case (uint32_t)DMA2_Stream1:
-    case (uint32_t)DMA2_Stream2:
-    case (uint32_t)DMA2_Stream3:
-    case (uint32_t)DMA2_Stream4:
-    case (uint32_t)DMA2_Stream5:
-    case (uint32_t)DMA2_Stream6:
-    case (uint32_t)DMA2_Stream7:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
-        break;
-
-    default:
-        ret = -1;
-        break;
-    }
+#ifndef UART_TX_FIFO_BUFFER_LEN
+#define UART_TX_FIFO_BUFFER_LEN    256
+#endif
 
-    return ret;
-}
+#ifndef UART_TX_DMA_BUFFER_LEN
+#define UART_TX_DMA_BUFFER_LEN     1024
+#endif
 
-static inline int _stm32_gpio_rcc_enable(GPIO_TypeDef *port)
-{
-    int ret = 0;
-    switch ((uint32_t)port)
-    {
-    case (uint32_t)GPIOA:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
-        break;
-    case (uint32_t)GPIOB:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
-        break;
-    case (uint32_t)GPIOC:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
-        break;
-    case (uint32_t)GPIOD:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
-        break;
-    case (uint32_t)GPIOE:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
-        break;
-    case (uint32_t)GPIOF:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
-        break;
-    case (uint32_t)GPIOG:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
-        break;
-    case (uint32_t)GPIOH:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
-        break;
-    case (uint32_t)GPIOI:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);
-        break;
-    case (uint32_t)GPIOJ:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOJ, ENABLE);
-        break;
-    case (uint32_t)GPIOK:
-        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOK, ENABLE);
-        break;
-    default:
-        ret = -1;
-        break;
-    }
-    return ret;
-}
+/* ========== 外部DMA完成标志声明 ========== */
+extern bool uart1_tx_dma_done;
+extern bool uart2_tx_dma_done;
+extern bool uart3_tx_dma_done;
+extern bool uart4_tx_dma_done;
+extern bool uart5_tx_dma_done;
+extern bool uart6_tx_dma_done;
+
+/* ========== 结构体定义 ========== */
+struct _uart_config {
+    UART_Type *uart_base;           /* UART基地址 */
+    uart_intr_enable_t uart_irq_mask; /* UART中断掩码 */
+    uint8_t uart_irq_num;           /* 中断号 */ 
+    
+    /* GPIO配置 */
+    uint8_t tx_port;                /* TX端口: 0-9 (GPIOA-GPIOJ) */
+    uint8_t tx_pin;                 /* TX引脚 */
+    uint8_t rx_port;                /* RX端口 */
+    uint8_t rx_pin;                 /* RX引脚 */
+    uint8_t tx_af;                  /* TX复用功能 */
+    uint8_t rx_af;                  /* RX复用功能 */
+    
+    /* DMA配置 */
+    DMA_Type *dma_base;             /* DMA控制器基地址 */
+    DMAMUX_Type *dma_mux_base;      /* DMA MUX */
+    uint8_t dma_enable;             /* DMA 使能 (修正拼写) */
+    uint8_t dma_channel;            /* DMA通道 */
+    uint8_t dma_irq_num;            /* DMA中断号 */
+    uint8_t dma_request;            /* DMA请求源 */
+    
+    /* 缓冲区 */
+    uint8_t *tx_fifo_buff;          /* TX FIFO缓冲区 */
+    uint32_t tx_fifo_buff_size;     /* TX FIFO大小 */
+    uint8_t *rx_fifo_buff;          /* RX FIFO缓冲区 */
+    uint32_t rx_fifo_buff_size;     /* RX FIFO大小 */
+    
+    /* DMA缓冲区 */
+    uint8_t *dma_tx_buff;           /* DMA发送缓冲区 */
+    uint32_t dma_tx_buff_size;      /* DMA发送缓冲区大小 */
+    
+    /* 内部使用 */
+    rkfifo_t tx_fifo;               /* TX FIFO */
+    rkfifo_t rx_fifo;               /* RX FIFO */
+    volatile uint8_t dma_busy;      /* DMA发送忙标志 */
+};
 
-static inline uint16_t _stm32_get_pinaf(uint16_t pin)
-{
-    uint16_t ret = 0xff;
-    switch (pin)
-    {
-    case GPIO_Pin_0:
-        ret = GPIO_PinSource0;
-        break;
-    case GPIO_Pin_1:
-        ret = GPIO_PinSource1;
-        break;
-    case GPIO_Pin_2:
-        ret = GPIO_PinSource2;
-        break;
-    case GPIO_Pin_3:
-        ret = GPIO_PinSource3;
-        break;
-    case GPIO_Pin_4:
-        ret = GPIO_PinSource4;
-        break;
-    case GPIO_Pin_5:
-        ret = GPIO_PinSource5;
-        break;
-    case GPIO_Pin_6:
-        ret = GPIO_PinSource6;
-        break;
-    case GPIO_Pin_7:
-        ret = GPIO_PinSource7;
-        break;
-    case GPIO_Pin_8:
-        ret = GPIO_PinSource8;
-        break;
-    case GPIO_Pin_9:
-        ret = GPIO_PinSource9;
-        break;
-    case GPIO_Pin_10:
-        ret = GPIO_PinSource10;
-        break;
-    case GPIO_Pin_11:
-        ret = GPIO_PinSource11;
-        break;
-    case GPIO_Pin_12:
-        ret = GPIO_PinSource12;
-        break;
-    case GPIO_Pin_13:
-        ret = GPIO_PinSource13;
-        break;
-    case GPIO_Pin_14:
-        ret = GPIO_PinSource14;
-        break;
-    case GPIO_Pin_15:
-        ret = GPIO_PinSource15;
-        break;
-    default:
-        break;
-    }
-    return ret;
-}
+struct _uart_ops {
+    int (*init)(struct _uart_config *config, uint32_t baudrate);
+    uint32_t (*read)(struct _uart_config *config, void *data, uint32_t len);
+    uint32_t (*write)(struct _uart_config *config, const void *data, uint32_t len);
+};
 
-static inline uint8_t _stm32_get_uartaf(USART_TypeDef *uartx)
-{
-    uint8_t ret = 0;
-    switch ((uint32_t)uartx)
-    {
-    case (uint32_t)USART1:
-        ret = GPIO_AF_USART1;
-        break;
-    case (uint32_t)USART2:
-        ret = GPIO_AF_USART2;
-        break;
-    case (uint32_t)USART3:
-        ret = GPIO_AF_USART3;
-        break;
-    case (uint32_t)UART4:
-        ret = GPIO_AF_UART4;
-        break;
-    case (uint32_t)UART5:
-        ret = GPIO_AF_UART5;
-        break;
-    case (uint32_t)USART6:
-        ret = GPIO_AF_USART6;
-        break;
-
-    default:
-        ret = -1;
-        break;
-    }
-    return ret;
-}
+struct _uart_device {
+    struct _uart_config *config;
+    struct _uart_ops *ops;
+};
 
-static int _uart_config(struct stm32_uart_config *uart, uint32_t bps)
-{
-    int ret = 0;
-    _stm32_uart_rcc_enable(uart->uartx);
-    _stm32_gpio_rcc_enable(uart->_tx_port);
-    _stm32_gpio_rcc_enable(uart->_rx_port);
-
-    USART_DeInit(uart->uartx);
-    GPIO_InitTypeDef GPIO_InitStructure;
-    GPIO_StructInit(&GPIO_InitStructure);
-    GPIO_InitStructure.GPIO_Pin = uart->_tx_pin;
-    GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
-    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
-    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-    GPIO_Init(uart->_tx_port, &GPIO_InitStructure);
-    GPIO_InitStructure.GPIO_Pin = uart->_rx_pin;
-    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
-    GPIO_Init(uart->_rx_port, &GPIO_InitStructure);
-
-    GPIO_PinAFConfig(uart->_rx_port, _stm32_get_pinaf(uart->_rx_pin), _stm32_get_uartaf(uart->uartx));
-    GPIO_PinAFConfig(uart->_tx_port, _stm32_get_pinaf(uart->_tx_pin), _stm32_get_uartaf(uart->uartx));
-
-    USART_InitTypeDef USART_InitStructure;
-    USART_StructInit(&USART_InitStructure);
-    USART_InitStructure.USART_BaudRate = bps;
-
-    USART_Init(uart->uartx, &USART_InitStructure);
-
-    if (uart->_rx_dma == NULL)
-    {
-        /* 采用中断式接收 */
-        USART_ITConfig(uart->uartx, USART_IT_RXNE, ENABLE);
+/* ========== 辅助函数:获取DMA完成标志指针 ========== */
+static bool* _get_dma_done_flag(UART_Type *uart_base)
+{
+    if (uart_base == HPM_UART1) {
+        return &uart1_tx_dma_done;
+    } else if (uart_base == HPM_UART2) {
+        return &uart2_tx_dma_done;
+    } else if (uart_base == HPM_UART3) {
+        return &uart3_tx_dma_done;
+    } else if (uart_base == HPM_UART4) {
+        return &uart4_tx_dma_done;
+    } else if (uart_base == HPM_UART5) {
+        return &uart5_tx_dma_done;
+    } else if (uart_base == HPM_UART6) {
+        return &uart6_tx_dma_done;
     }
-    else
-    {
-        /* 采用 dma  式接收*/
-        USART_ITConfig(uart->uartx, USART_IT_IDLE, ENABLE);
+    return NULL;
+}
+
+/* ========== 时钟使能函数 ========== */
+static void _uart_clock_enable(UART_Type *uart_base)
+{
+    if (uart_base == HPM_UART0) {
+        clock_set_source_divider(clock_uart0, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart0, 0);
+    } else if (uart_base == HPM_UART1) {
+        clock_set_source_divider(clock_uart1, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart1, 0);
+    } else if (uart_base == HPM_UART2) {
+        clock_set_source_divider(clock_uart2, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart2, 0);
+    } else if (uart_base == HPM_UART3) {
+        clock_set_source_divider(clock_uart3, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart3, 0);
+    } else if (uart_base == HPM_UART4) {
+        clock_set_source_divider(clock_uart4, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart4, 0);
+    } else if (uart_base == HPM_UART5) {
+        clock_set_source_divider(clock_uart5, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart5, 0);
+    } else if (uart_base == HPM_UART6) {
+        clock_set_source_divider(clock_uart6, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart6, 0);
+    } else if (uart_base == HPM_UART7) {
+        clock_set_source_divider(clock_uart7, clk_src_osc24m, 1);
+        clock_add_to_group(clock_uart7, 0);
     }
-
-    USART_Cmd(uart->uartx, ENABLE);
-
-    return ret;
 }
 
-static int _uart_dma_config(struct stm32_uart_config *uart)
-{
-    int ret = 0;
-    DMA_InitTypeDef dma_conf;
-
-    /* tx dma config */
-    if (uart->_tx_dma && uart->_dma_tx_buff)
-    {
-        _stm32_dma_rcc_enable(uart->_tx_dma);
-        DMA_DeInit(uart->_tx_dma);
-        while (DMA_GetCmdStatus(uart->_tx_dma) != DISABLE)
-        {
-        };
-        DMA_StructInit(&dma_conf);
-        dma_conf.DMA_Channel = uart->_tx_dma_channel;
-        dma_conf.DMA_PeripheralBaseAddr = (u32)(&(uart->uartx->DR));
-        dma_conf.DMA_Memory0BaseAddr = (u32)uart->_dma_tx_buff;
-        dma_conf.DMA_DIR = DMA_DIR_MemoryToPeripheral;
-        dma_conf.DMA_BufferSize = (uint32_t)uart->_dma_tx_buff;
-        dma_conf.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-        dma_conf.DMA_MemoryInc = DMA_MemoryInc_Enable;
-        dma_conf.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
-        dma_conf.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
-        dma_conf.DMA_Mode = DMA_Mode_Normal;
-        dma_conf.DMA_Priority = DMA_Priority_Medium;
-        dma_conf.DMA_FIFOMode = DMA_FIFOMode_Disable;
-        dma_conf.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
-        dma_conf.DMA_MemoryBurst = DMA_MemoryBurst_Single;
-        dma_conf.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
-        DMA_Init(uart->_tx_dma, &dma_conf);
-        DMA_ITConfig(uart->_tx_dma, DMA_IT_TC, ENABLE);
-        DMA_ITConfig(uart->_tx_dma, DMA_IT_TE, ENABLE);
-        DMA_Cmd(uart->_tx_dma, DISABLE);
-        // 串口采用 dma 发送
-        USART_DMACmd(uart->uartx, USART_DMAReq_Tx, ENABLE);
-        //等待关闭使能完成
-        while (DMA_GetCmdStatus(uart->_tx_dma) != DISABLE)
-        {
-        };
-    }
-
-    /* rx dma config */
-    if (uart->_rx_dma && uart->_dma_rx_buff)
-    {
-        // 配置串口的 dma 接收
-        _stm32_dma_rcc_enable(uart->_rx_dma);
-        DMA_StructInit(&dma_conf);
-        DMA_DeInit(uart->_rx_dma);
-        while (DMA_GetCmdStatus(uart->_rx_dma) != DISABLE)
-        {
-        };
-        dma_conf.DMA_Channel = uart->_rx_dma_channel;
-        dma_conf.DMA_PeripheralBaseAddr = (u32)(&uart->uartx->DR);
-        dma_conf.DMA_Memory0BaseAddr = (u32)uart->_dma_rx_buff;
-        dma_conf.DMA_DIR = DMA_DIR_PeripheralToMemory;
-        dma_conf.DMA_BufferSize = uart->_dma_rx_buff_size;
-        dma_conf.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
-        dma_conf.DMA_MemoryInc = DMA_MemoryInc_Enable;
-        dma_conf.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
-        dma_conf.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
-        dma_conf.DMA_Mode = DMA_Mode_Normal;
-        dma_conf.DMA_Priority = DMA_Priority_High;
-        dma_conf.DMA_FIFOMode = DMA_FIFOMode_Disable;
-        dma_conf.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
-        dma_conf.DMA_MemoryBurst = DMA_MemoryBurst_Single;
-        dma_conf.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
-        DMA_Init(uart->_rx_dma, &dma_conf);
-        DMA_ITConfig(uart->_rx_dma, DMA_IT_TC, ENABLE);
-        DMA_ITConfig(uart->_rx_dma, DMA_IT_TE, ENABLE);
-        DMA_Cmd(uart->_rx_dma, ENABLE);
-        /* 串口采用 dma 接收 */
-        USART_DMACmd(uart->uartx, USART_DMAReq_Rx, ENABLE);
-        while (DMA_GetCmdStatus(uart->_rx_dma) != ENABLE)
-        {
-        };
+/* ========== DMA时钟使能 ========== */
+static void _dma_clock_enable(DMA_Type *dma_base)
+{
+    /* HDMA 时钟来源于系统总线时钟(AHB),已默认使能 */
+    (void)dma_base;
+}
+
+/* ========== GPIO配置 ========== */
+static void _uart_gpio_config(UART_Type *uart_base)
+{
+    if (uart_base == HPM_UART1) {
+        HPM_IOC->PAD[IOC_PAD_PA02].FUNC_CTL = IOC_PA02_FUNC_CTL_UART1_TXD;
+        HPM_IOC->PAD[IOC_PAD_PA01].FUNC_CTL = IOC_PA01_FUNC_CTL_UART1_RXD;
+    } else if (uart_base == HPM_UART2) {
+        HPM_IOC->PAD[IOC_PAD_PB21].FUNC_CTL = IOC_PB21_FUNC_CTL_UART2_RXD;
+        HPM_IOC->PAD[IOC_PAD_PB22].FUNC_CTL = IOC_PB22_FUNC_CTL_UART2_TXD;
+    } else if (uart_base == HPM_UART3) {
+        HPM_IOC->PAD[IOC_PAD_PB24].FUNC_CTL = IOC_PB24_FUNC_CTL_UART3_RXD;
+        HPM_IOC->PAD[IOC_PAD_PB25].FUNC_CTL = IOC_PB25_FUNC_CTL_UART3_TXD;
+    } else if (uart_base == HPM_UART4) {
+        HPM_IOC->PAD[IOC_PAD_PA09].FUNC_CTL = IOC_PA09_FUNC_CTL_UART4_RXD;
+        HPM_IOC->PAD[IOC_PAD_PA04].FUNC_CTL = IOC_PA04_FUNC_CTL_UART4_TXD;
+    } else if (uart_base == HPM_UART5) {
+        HPM_IOC->PAD[IOC_PAD_PA08].FUNC_CTL = IOC_PA08_FUNC_CTL_UART5_TXD;
+        HPM_IOC->PAD[IOC_PAD_PA07].FUNC_CTL = IOC_PA07_FUNC_CTL_UART5_RXD;
+    } else if (uart_base == HPM_UART6) {
+        HPM_IOC->PAD[IOC_PAD_PA05].FUNC_CTL = IOC_PA05_FUNC_CTL_UART6_RXD;
+        HPM_IOC->PAD[IOC_PAD_PA06].FUNC_CTL = IOC_PA06_FUNC_CTL_UART6_TXD;
     }
-
-    return ret;
 }
 
-void _uart_nvic_config(struct stm32_uart_config *uart)
-{
-    NVIC_InitTypeDef NVIC_InitStructure;
-
-    NVIC_InitStructure.NVIC_IRQChannel = uart->_uart_irq_channel;
-    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
-    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
-    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-    NVIC_Init(&NVIC_InitStructure);
-
-    if (uart->_rx_dma && uart->_dma_rx_buff)
-    {
-        NVIC_InitStructure.NVIC_IRQChannel = uart->_rx_dma_irq_channel;
-        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
-        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
-        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-        NVIC_Init(&NVIC_InitStructure);
+/* ========== UART配置 ========== */
+static int _uart_config(struct _uart_config *config, uint32_t baudrate)
+{
+    uart_config_t uart_cfg;
+    uint32_t uart_clock_freq = 0;
+    
+    /* 使能时钟 */
+    _uart_clock_enable(config->uart_base);
+    
+    /* 配置GPIO */
+    _uart_gpio_config(config->uart_base);
+    
+    /* 获取UART时钟频率 */
+    if (config->uart_base == HPM_UART0) {
+        uart_clock_freq = clock_get_frequency(clock_uart0);
+    } else if (config->uart_base == HPM_UART1) {
+        uart_clock_freq = clock_get_frequency(clock_uart1);
+    } else if (config->uart_base == HPM_UART2) {
+        uart_clock_freq = clock_get_frequency(clock_uart2);
+    } else if (config->uart_base == HPM_UART3) {
+        uart_clock_freq = clock_get_frequency(clock_uart3);
+    } else if (config->uart_base == HPM_UART4) {
+        uart_clock_freq = clock_get_frequency(clock_uart4);
+    } else if (config->uart_base == HPM_UART5) {
+        uart_clock_freq = clock_get_frequency(clock_uart5);
+    } else if (config->uart_base == HPM_UART6) {
+        uart_clock_freq = clock_get_frequency(clock_uart6);
+    } else if (config->uart_base == HPM_UART7) {
+        uart_clock_freq = clock_get_frequency(clock_uart7);
     }
-
-    if (uart->_tx_dma && uart->_dma_tx_buff)
-    {
-        NVIC_InitStructure.NVIC_IRQChannel = uart->_tx_dma_irq_channel;
-        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
-        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
-        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-        NVIC_Init(&NVIC_InitStructure);
+    
+    /* 配置UART */
+    uart_default_config(config->uart_base, &uart_cfg);
+    uart_cfg.baudrate = baudrate;
+    uart_cfg.word_length = word_length_8_bits;
+    uart_cfg.num_of_stop_bits = stop_bits_1;
+    uart_cfg.parity = parity_none;
+    uart_cfg.fifo_enable = true;
+    uart_cfg.dma_enable = config->dma_enable ? true : false;
+    uart_cfg.tx_fifo_level = uart_tx_fifo_trg_not_full;
+    uart_cfg.rx_fifo_level = uart_rx_fifo_trg_gt_three_quarters;
+    uart_cfg.src_freq_in_hz = uart_clock_freq;
+    
+    uart_init(config->uart_base, &uart_cfg);
+    
+    return 0;
+}
+
+/* ========== DMA配置 ========== */
+static int _uart_dma_config(struct _uart_config *config)
+{
+    dma_handshake_config_t handshake_config;
+    
+    if (config->dma_tx_buff == NULL) {
+        return -1;
     }
+    
+    /* 使能DMA时钟 */
+    _dma_clock_enable(config->dma_base);
+    
+    /* 配置 DMAMUX */
+    dmamux_config(config->dma_mux_base, 
+                  DMA_SOC_CHN_TO_DMAMUX_CHN(config->dma_base, config->dma_channel), 
+                  config->dma_request, 
+                  true);
+    
+    /* 配置 TX 握手参数 */
+    dma_default_handshake_config(config->dma_base, &handshake_config);
+    handshake_config.ch_index = config->dma_channel;
+    handshake_config.dst = (uint32_t)&config->uart_base->THR;
+    handshake_config.dst_fixed = true;
+    handshake_config.src = core_local_mem_to_sys_address(0, (uint32_t)config->dma_tx_buff);
+    handshake_config.src_fixed = false;
+    handshake_config.data_width = DMA_TRANSFER_WIDTH_BYTE;
+    handshake_config.size_in_byte = config->dma_tx_buff_size;
+    
+    hpm_stat_t stat = dma_setup_handshake(config->dma_base, &handshake_config, false);
+    if (stat != status_success) {
+        printf("uart dma tx config error\r\n");
+        return -1;
+    }
+    
+    return 0;
 }
 
-int uart_init(struct stm32_uart_config *uart, uint32_t bps)
+/* ========== NVIC中断配置 ========== */
+static void _uart_nvic_config(struct _uart_config *config)
 {
-    int ret = 0;
-    rkfifo_init(&uart->_rx_fifo, uart->_rx_fifo_buff, uart->_rx_fifo_buff_size, 1);
-    rkfifo_init(&uart->_tx_fifo, uart->_tx_fifo_buff, uart->_tx_fifo_buff_size, 1);
-
-    _uart_config(uart, bps);
-    _uart_dma_config(uart);
-    _uart_nvic_config(uart);
-
-    return ret;
+    /* 使能UART中断 */
+    uart_enable_irq(config->uart_base, config->uart_irq_mask);
+    intc_m_enable_irq_with_priority(config->uart_irq_num, 1);
+    
+    /* 使能DMA中断 */
+    if (config->dma_enable) {
+        intc_m_enable_irq_with_priority(config->dma_irq_num, 1);
+    }
 }
 
-/**
- * @brief 串口发送数据
- *
- * @param uart 串口对象
- * @param pdata 发送的数据指针
- * @param len 发送的数据长度
- * @return uint32_t 实际发送的数据长度
- */
-static uint32_t uart_tx_data(struct stm32_uart_config *uart, const void *pdata, uint32_t len)
+/* ========== UART初始化 ========== */
+int _uart_init(struct _uart_config *config, uint32_t baudrate)
 {
-    assert_param(uart != NULL);
-    assert_param(pdata != NULL);
-    uint32_t ret = 0;
-    if (len > 0)
-    {
-        /* 将数据压入 tx FIFO */
-        ret = rkfifo_in(&uart->_tx_fifo, pdata, len);
-
-        if (uart->_tx_dma)
-        {
-            /* dma 形式发送数据 */
-            if ((USART_GetFlagStatus(uart->uartx, USART_FLAG_TXE) == SET) &&
-                (USART_GetFlagStatus(uart->uartx, USART_FLAG_TC) == SET))
-            {
-                // fifo 中是否还有数据, 如果还有数据, 则读取到 dma buff 中并进行发送
-                uint32_t count = rkfifo_out(&uart->_tx_fifo,
-                                            uart->_dma_tx_buff,
-                                            uart->_dma_tx_buff_size);
-                if (count > 0)
-                {
-                    DMA_SetCurrDataCounter(uart->_tx_dma, count);
-                    DMA_Cmd(uart->_tx_dma, ENABLE);
-                }
-            }
-        }
-        else
-        {
-            /* 中断形式发送数据 */
-            USART_ITConfig(uart->uartx, USART_IT_TXE, ENABLE);
-        }
+    /* 初始化FIFO */
+    rkfifo_init(&config->tx_fifo, config->tx_fifo_buff, config->tx_fifo_buff_size, 1);
+    rkfifo_init(&config->rx_fifo, config->rx_fifo_buff, config->rx_fifo_buff_size, 1);
+    
+    /* 配置UART硬件 */
+    _uart_config(config, baudrate);
+    
+    /* 配置DMA */
+    if (config->dma_enable) {
+        _uart_dma_config(config);
     }
-
-    return ret;
+    
+    /* 配置中断 */
+    _uart_nvic_config(config);
+    
+    config->dma_busy = 0;
+    
+    return 0;
 }
 
 /**
- * @brief 串口读取数据
- *
- * @param uart 串口对象
- * @param pdata 数据读取输出 buffer
- * @param len 数据读取长度
- * @return uint32_t 实际读出的长度
+ * @brief 获取串口发送是否忙碌
  */
-static uint32_t uart_rx_data(struct stm32_uart_config *uart, void *pdata, uint32_t len)
-{
-    assert_param(uart != NULL);
-    assert_param(pdata != NULL);
-
-    uint32_t ret = rkfifo_out(&uart->_rx_fifo, pdata, len);
-    return ret;
-}
-
-static void _rxne_isr_callback(struct stm32_uart *uart)
-{
-    assert_param(uart != NULL);
-
-    USART_TypeDef *uartx = uart->_config->uartx;
-    rkfifo_t *rxfifo = &uart->_config->_rx_fifo;
-
-    uint8_t data;
-    data = USART_ReceiveData(uartx) & 0xFF;
-    /* 将接收到的数据压入 fifo */
-    rkfifo_in(rxfifo, &data, 1);
-    USART_ClearITPendingBit(uartx, USART_IT_RXNE);
-}
-
-static void _txe_isr_callback(struct stm32_uart *uart)
-{
-    assert_param(uart != NULL);
-
-    USART_TypeDef *usartx = uart->_config->uartx;
-    rkfifo_t *txfifo = &uart->_config->_tx_fifo;
-
-    if (USART_GetITStatus(usartx, USART_IT_TXE) == SET)
-    {
-        uint8_t c;
-        if (rkfifo_out(txfifo, &c, 1))
-        {
-            /* fifo 有数据, 继续发送 */
-            USART_SendData(usartx, c);
-        }
-        else
-        {
-            /* fifo 无数据, 关闭 txe 中断, 打开 TC 中断 */
-            USART_ITConfig(usartx, USART_IT_TXE, DISABLE);
-            USART_ITConfig(usartx, USART_IT_TC, ENABLE);
-        }
-
-        USART_ClearITPendingBit(usartx, USART_IT_TXE);
+bool usart_tx_isbusy(struct _uart_config *config)
+{   
+    bool *dma_done_flag = _get_dma_done_flag(config->uart_base);
+    
+    if (dma_done_flag) {
+        return !(*dma_done_flag);
     }
+    
+    return false;
 }
 
-static void _tc_isr_callback(struct stm32_uart *uart)
-{
-    assert_param(uart != NULL);
-
-    USART_TypeDef *usartx = uart->_config->uartx;
-
-    USART_ClearITPendingBit(usartx, USART_IT_TC);
-}
-
-static void _uart_isr_callback(struct stm32_uart *uart)
+void open_usart_dma_tx(struct _uart_config *config, uint32_t len)
 {
-    USART_TypeDef *uartx = uart->_config->uartx;
-    DMA_Stream_TypeDef *rx_dma = uart->_config->_rx_dma;
-    uint8_t *rx_dma_buff = uart->_config->_dma_rx_buff;
-    uint32_t rx_dma_buff_size = uart->_config->_dma_rx_buff_size;
-    rkfifo_t *rx_fifo = &uart->_config->_rx_fifo;
-
-    if (USART_GetITStatus(uartx, USART_IT_RXNE) == SET)
-    {
-        _rxne_isr_callback(uart);
+    dma_handshake_config_t handshake_config;
+    bool *dma_done_flag = _get_dma_done_flag(config->uart_base);
+    
+    /* 等待上次发送完成 */
+    uint32_t timeout = 1000000;
+    while (usart_tx_isbusy(config) && timeout--) {
+        __asm("nop");
     }
-    else if (USART_GetITStatus(uartx, USART_IT_TXE) == SET)
-    {
-        _txe_isr_callback(uart);
+    
+    if (timeout == 0) {
+        /* 超时处理,复位DMA */
+        dma_abort_channel(config->dma_base, config->dma_channel);
+        if (dma_done_flag) {
+            *dma_done_flag = true;
+        }
     }
-    else if (USART_GetITStatus(uartx, USART_IT_TC) == SET)
-    {
-        _tc_isr_callback(uart);
+    
+    /* 清除DMA完成标志 */
+    if (dma_done_flag) {
+        *dma_done_flag = false;
     }
-    else if (USART_GetITStatus(uartx, USART_IT_IDLE) == SET)
-    {
-        if (rx_dma)
-        {
-            DMA_Cmd(rx_dma, DISABLE);
-            uint32_t dma_cnt = rx_dma_buff_size -
-                               DMA_GetCurrDataCounter(rx_dma);
-            if (dma_cnt)
-            {
-                rkfifo_in(rx_fifo, &rx_dma_buff[0], dma_cnt);
+    
+    /* 重新配置 TX 传输大小 */
+    dma_default_handshake_config(config->dma_base, &handshake_config);
+    handshake_config.ch_index = config->dma_channel;
+    handshake_config.dst = (uint32_t)&config->uart_base->THR;
+    handshake_config.dst_fixed = true;
+    handshake_config.src = core_local_mem_to_sys_address(0, (uint32_t)config->dma_tx_buff);
+    handshake_config.src_fixed = false;
+    handshake_config.data_width = DMA_TRANSFER_WIDTH_BYTE;
+    handshake_config.size_in_byte = len;
+    
+    dma_setup_handshake(config->dma_base, &handshake_config, true);
+}
+
+/* ========== UART发送数据(DMA方式) ========== */
+static uint32_t uart_tx_data(struct _uart_config *config, const void *data, uint32_t len)
+{
+    uint32_t ret = 0;
+    
+    if (len == 0) return 0;
+    
+    /* 将数据压入TX FIFO */
+    ret = rkfifo_in(&config->tx_fifo, data, len);
+    
+    if (config->dma_tx_buff != NULL && config->dma_enable) {
+        /* DMA方式发送 */
+        if (!config->dma_busy) {
+            /* DMA空闲,立即发送 */
+            uint32_t count = rkfifo_out(&config->tx_fifo, 
+                                        config->dma_tx_buff, 
+                                        config->dma_tx_buff_size);
+            if (count > 0) {
+                open_usart_dma_tx(config, count);
+                config->dma_busy = 1;
             }
-            //重新设置传输数据长度
-            DMA_SetCurrDataCounter(rx_dma, uart->_config->_dma_rx_buff_size);
-            //打开DMA
-            DMA_Cmd(rx_dma, ENABLE);
         }
-
-        uartx->SR;
-        uartx->DR;
-    }
-    else
-    {
-        uartx->SR;
-        uartx->DR;
     }
+    
+    return ret;
 }
 
-static void _uart_tx_dma_isr_callback(struct stm32_uart *uart)
+/* ========== UART接收数据(从fifo往外读) ========== */
+static uint32_t uart_rx_data(struct _uart_config *config, void *data, uint32_t len)
 {
-    DMA_Stream_TypeDef *tx_dma = uart->_config->_tx_dma;
-    rkfifo_t *tx_fifo = &uart->_config->_tx_fifo;
-    uint32_t tcif = uart->_config->_tx_dma_tcif;
-    uint32_t teif = uart->_config->_tx_dma_teif;
-
-    if (DMA_GetITStatus(tx_dma, tcif) == SET)
-    {
-        DMA_ClearITPendingBit(tx_dma, tcif);
-        DMA_Cmd(tx_dma, DISABLE);
-
-        // fifo 中是否还有数据, 如果还有数据, 则读取到 dma buff 中并进行发送
-        uint8_t *dma_buff = uart->_config->_dma_tx_buff;
-        uint32_t dma_buff_size = uart->_config->_dma_tx_buff_size;
-        uint32_t count = rkfifo_out(tx_fifo, dma_buff, dma_buff_size);
-        if (count > 0)
-        {
-            DMA_SetCurrDataCounter(tx_dma, count);
-            DMA_Cmd(tx_dma, ENABLE);
-        }
-        else
-        {
-            // 数据发送完成,在多线程时可以抛出信号量
-        }
-    }
-    else if (DMA_GetITStatus(tx_dma, teif) == SET)
-    {
-        DMA_ClearITPendingBit(tx_dma, teif);
-    }
+    return rkfifo_out(&config->rx_fifo, data, len);
 }
 
-static void _uart_rx_dma_isr_callback(struct stm32_uart *uart)
+/* ========== UART中断处理函数 ========== */
+void uart_isr_callback(struct _uart_config *config)
 {
-    DMA_Stream_TypeDef *rx_dma = uart->_config->_rx_dma;
-    rkfifo_t *rx_fifo = &uart->_config->_rx_fifo;
-    uint32_t tcif = uart->_config->_rx_dma_tcif;
-    uint32_t teif = uart->_config->_rx_dma_teif;
-
-    if (DMA_GetITStatus(rx_dma, tcif) == SET)
-    {
-        DMA_ClearITPendingBit(rx_dma, tcif);
-        DMA_Cmd(rx_dma, DISABLE);
-
-        uint8_t *dma_buff = uart->_config->_dma_rx_buff;
-        uint32_t dma_buff_size = uart->_config->_dma_rx_buff_size;
-
-        uint32_t dma_cnt = dma_buff_size - DMA_GetCurrDataCounter(rx_dma);
-        if (dma_cnt)
-        {
-            rkfifo_in(rx_fifo, &dma_buff[0], dma_cnt);
+    uint8_t count = 0;
+    rkfifo_t *rxfifo = &config->rx_fifo;
+    uint8_t irq_id = uart_get_irq_id(config->uart_base);
+    
+    if (irq_id == uart_intr_id_rx_data_avail) {
+        while (uart_check_status(config->uart_base, uart_stat_data_ready)) {
+            uint8_t byte = uart_read_byte(config->uart_base);
+            rkfifo_in(rxfifo, &byte, 1);
+            count++;
+            /* 确保RX FIFO不会溢出 */
+            if (count > 12) {
+                break;
+            }
         }
-        //重新设置传输数据长度
-        DMA_SetCurrDataCounter(rx_dma, dma_buff_size);
-        //打开DMA
-        DMA_Cmd(rx_dma, ENABLE);
     }
-    else if (DMA_GetITStatus(rx_dma, teif) == SET)
-    {
-        DMA_ClearITPendingBit(rx_dma, teif);
+    
+    if (irq_id == uart_intr_id_rx_timeout) {
+        /* 接收超时,读取剩余数据 */
+        while (uart_check_status(config->uart_base, uart_stat_data_ready)) {
+            uint8_t byte = uart_read_byte(config->uart_base);
+            rkfifo_in(rxfifo, &byte, 1);
+        }
     }
 }
-/**--------------------------- UART1 -----------------------------------------*/
-#ifdef DRV_USING_UART1 
-static uint8_t u1_rx_fifo_buff[UART1_RX_FIFO_BUFFER_LEN] = {0};
-static uint8_t u1_tx_fifo_buff[UART1_TX_FIFO_BUFFER_LEN] = {0};
-#ifdef UART1_TX_USING_DMA
-static uint8_t usart1_dma_tx_buf[UART1_TX_DMA_BUFFER_LEN] = {0};
-#endif
-#ifdef UART1_RX_USING_DMA
-static uint8_t usart1_dma_rx_buf[UART1_RX_DMA_BUFFER_LEN] = {0};
-#endif
-
-struct stm32_uart_config _u1_config = {
-    .uartx = USART1,
-    ._tx_port = GPIOA,
-    ._tx_pin = GPIO_Pin_9,
-    ._rx_port = GPIOA,
-    ._rx_pin = GPIO_Pin_10,
-    ._uart_irq_channel = USART1_IRQn,
-
-    ._tx_fifo_buff = u1_tx_fifo_buff,
-    ._tx_fifo_buff_size = sizeof(u1_tx_fifo_buff),
-    ._rx_fifo_buff = u1_rx_fifo_buff,
-    ._rx_fifo_buff_size = sizeof(u1_rx_fifo_buff),
-
-#ifdef UART1_RX_USING_DMA
-    ._rx_dma = DMA2_Stream2,
-    ._rx_dma_tcif = DMA_IT_TCIF2,
-    ._rx_dma_teif = DMA_IT_TEIF2,
-    ._rx_dma_channel = DMA_Channel_4,
-    ._dma_rx_buff = usart1_dma_rx_buf,
-    ._dma_rx_buff_size = sizeof(usart1_dma_rx_buf),
-    ._rx_dma_irq_channel = DMA2_Stream2_IRQn,
-#else
-    ._rx_dma = NULL,
-#endif // USART1_RX_USING_DMA
-
-#ifdef UART1_TX_USING_DMA
-    ._tx_dma = DMA2_Stream7,
-    ._tx_dma_tcif = DMA_IT_TCIF7,
-    ._tx_dma_teif = DMA_IT_TEIF7,
-    ._tx_dma_channel = DMA_Channel_4,
-    ._dma_tx_buff = usart1_dma_tx_buf,
-    ._dma_tx_buff_size = sizeof(usart1_dma_tx_buf),
-    ._tx_dma_irq_channel = DMA2_Stream7_IRQn,
-#else
-    ._tx_dma = NULL,
-#endif // USART1_TX_USING_DMA
-};
-
-static uint32_t u1_write_data(const void *pdata, uint32_t len)
-{
-    return uart_tx_data(&_u1_config, pdata, len);
-}
-static uint32_t u1_read_data(void *pdata, uint32_t len)
-{
-    return uart_rx_data(&_u1_config, pdata, len);
-}
-static int u1_init(uint32_t bps)
-{
-    return uart_init(&_u1_config, bps);
-}
-
-static struct stm32_uart_ops _u1_ops = {
-    .init = u1_init,
-    .read = u1_read_data,
-    .write = u1_write_data};
-
-static struct stm32_uart uart1 = {
-    ._config = &_u1_config,
-    .ops = &_u1_ops};
-
-void USART1_IRQHandler(void)
-{
-    _uart_isr_callback(&uart1);
-}
 
-#ifdef UART1_TX_USING_DMA
-void DMA2_Stream7_IRQHandler(void)
+/* ========== DMA发送完成中断处理 ========== */
+void uart_tx_dma_isr_callback(struct _uart_config *config)
 {
-    _uart_tx_dma_isr_callback(&uart1);
+    bool *dma_done_flag = _get_dma_done_flag(config->uart_base);
+    
+    /* 设置DMA完成标志 */
+    if (dma_done_flag) {
+        *dma_done_flag = true;
+    }
+    
+    config->dma_busy = 0;
+    
+    rkfifo_t *tx_fifo = &config->tx_fifo;
+    uint8_t *dma_buff = config->dma_tx_buff;
+    uint32_t dma_buff_size = config->dma_tx_buff_size;
+    uint32_t count = rkfifo_out(tx_fifo, dma_buff, dma_buff_size);
+    
+    if (count > 0) {
+        open_usart_dma_tx(config, count);
+        config->dma_busy = 1;
+    }
 }
-#endif
 
-#ifdef UART1_RX_USING_DMA
-void DMA2_Stream2_IRQHandler(void)
-{
-    _uart_rx_dma_isr_callback(&uart1);
-}
-#endif
-#endif // DRV_USING_UART1
-
-/**--------------------------- UART2 -----------------------------------------*/
-#ifdef DRV_USING_UART2 
-static uint8_t u2_rx_fifo_buff[UART2_RX_FIFO_BUFFER_LEN] = {0};
-static uint8_t u2_tx_fifo_buff[UART2_TX_FIFO_BUFFER_LEN] = {0};
-#ifdef UART2_TX_USING_DMA
-static uint8_t usart2_dma_tx_buf[UART2_TX_DMA_BUFFER_LEN] = {0};
-#endif
-#ifdef UART2_RX_USING_DMA
-static uint8_t usart2_dma_rx_buf[UART2_RX_DMA_BUFFER_LEN] = {0};
-#endif
+/* ========== UART1 配置 ========== */
+#ifdef DRV_USING_UART1
 
-struct stm32_uart_config _u2_config = {
-    .uartx = USART2,
-    ._tx_port = GPIOA,
-    ._tx_pin = GPIO_Pin_2,
-    ._rx_port = GPIOA,
-    ._rx_pin = GPIO_Pin_3,
-    ._uart_irq_channel = USART2_IRQn,
-
-    ._tx_fifo_buff = u2_tx_fifo_buff,
-    ._tx_fifo_buff_size = sizeof(u2_tx_fifo_buff),
-    ._rx_fifo_buff = u2_rx_fifo_buff,
-    ._rx_fifo_buff_size = sizeof(u2_rx_fifo_buff),
-
-#ifdef UART2_RX_USING_DMA
-    ._rx_dma = DMA1_Stream5,
-    ._rx_dma_tcif = DMA_IT_TCIF5,
-    ._rx_dma_teif = DMA_IT_TEIF5,
-    ._rx_dma_channel = DMA_Channel_4,
-    ._dma_rx_buff = usart2_dma_rx_buf,
-    ._dma_rx_buff_size = sizeof(usart2_dma_rx_buf),
-    ._rx_dma_irq_channel = DMA1_Stream5_IRQn,
-#else
-    ._rx_dma = NULL,
-#endif // USART1_RX_USING_DMA
-
-#ifdef UART2_TX_USING_DMA
-    ._tx_dma = DMA1_Stream6,
-    ._tx_dma_tcif = DMA_IT_TCIF6,
-    ._tx_dma_teif = DMA_IT_TEIF6,
-    ._tx_dma_channel = DMA_Channel_4,
-    ._dma_tx_buff = usart2_dma_tx_buf,
-    ._dma_tx_buff_size = sizeof(usart2_dma_tx_buf),
-    ._tx_dma_irq_channel = DMA1_Stream6_IRQn,
-#else
-    ._tx_dma = NULL,
-#endif // USART2_TX_USING_DMA
+static uint8_t u1_rx_fifo_buff[UART_RX_FIFO_BUFFER_LEN];
+static uint8_t u1_tx_fifo_buff[UART_TX_FIFO_BUFFER_LEN];
+static uint8_t u1_dma_tx_buff[UART_TX_DMA_BUFFER_LEN];
+
+struct _uart_config _u1_config = {
+    .uart_base = HPM_UART1,              /* 修正:应该是UART1 */
+    .uart_irq_mask = uart_intr_rx_rdy | uart_intr_rx_timeout,  /* 添加中断掩码 */
+    .uart_irq_num = IRQn_UART1,          /* 修正:IRQn_UART1 */
+    
+    /* DMA配置 */
+    .dma_base = HPM_DMA0,
+    .dma_mux_base = HPM_DMAMUX0,
+    .dma_enable = 1,                     /* 修正拼写 */
+    .dma_channel = 0,
+    .dma_irq_num = IRQn_DMA0_CH0,
+    .dma_request = DMA_REQUEST_UART1_TX, /* 修正:UART1_TX */
+    
+    /* FIFO缓冲区 */
+    .tx_fifo_buff = u1_tx_fifo_buff,
+    .tx_fifo_buff_size = sizeof(u1_tx_fifo_buff),
+    .rx_fifo_buff = u1_rx_fifo_buff,
+    .rx_fifo_buff_size = sizeof(u1_rx_fifo_buff),
+    
+    /* DMA缓冲区 */
+    .dma_tx_buff = u1_dma_tx_buff,
+    .dma_tx_buff_size = sizeof(u1_dma_tx_buff),
 };
 
-static uint32_t u2_write_data(const void *pdata, uint32_t len)
-{
-    return uart_tx_data(&_u2_config, pdata, len);
-}
-static uint32_t u2_read_data(void *pdata, uint32_t len)
-{
-    return uart_rx_data(&_u2_config, pdata, len);
-}
-static int u2_init(uint32_t bps)
-{
-    return uart_init(&_u2_config, bps);
-}
-
-static struct stm32_uart_ops _u2_ops = {
-    .init = u2_init,
-    .read = u2_read_data,
-    .write = u2_write_data};
-
-static struct stm32_uart uart2 = {
-    ._config = &_u2_config,
-    .ops = &_u2_ops};
-
-void USART2_IRQHandler(void)
+static uint32_t u1_write_data(const void *data, uint32_t len)
 {
-    _uart_isr_callback(&uart2);
+    return uart_tx_data(&_u1_config, data, len);
 }
 
-#ifdef UART2_TX_USING_DMA
-void DMA1_Stream6_IRQHandler(void)
+static uint32_t u1_read_data(void *data, uint32_t len)
 {
-    _uart_tx_dma_isr_callback(&uart1);
+    return uart_rx_data(&_u1_config, data, len);
 }
-#endif
 
-#ifdef UART2_RX_USING_DMA
-void DMA1_Stream5_IRQHandler(void)
+static int u1_init(uint32_t baudrate)
 {
-    _uart_rx_dma_isr_callback(&uart1);
+    return _uart_init(&_u1_config, baudrate);
 }
-#endif
-#endif // DRV_USING_UART2
-
-/**--------------------------- UART3 -----------------------------------------*/
-
-
-/**--------------------------- UART4 -----------------------------------------*/
-#ifdef DRV_USING_UART4
-static uint8_t u4_rx_fifo_buff[UART4_RX_FIFO_BUFFER_LEN] = {0};
-static uint8_t u4_tx_fifo_buff[UART4_TX_FIFO_BUFFER_LEN] = {0};
-#ifdef UART4_TX_USING_DMA
-static uint8_t u4_dma_tx_buf[UART4_TX_DMA_BUFFER_LEN] = {0};
-#endif
-#ifdef UART4_RX_USING_DMA
-static uint8_t u4_dma_rx_buf[UART4_RX_DMA_BUFFER_LEN] = {0};
-#endif
-
-struct stm32_uart_config _u4_config = {
-    .uartx = UART4,
-    ._tx_port = GPIOA,
-    ._tx_pin = GPIO_Pin_0,
-    ._rx_port = GPIOA,
-    ._rx_pin = GPIO_Pin_1,
-    ._uart_irq_channel = UART4_IRQn,
-
-    ._tx_fifo_buff = u4_tx_fifo_buff,
-    ._tx_fifo_buff_size = sizeof(u4_tx_fifo_buff),
-    ._rx_fifo_buff = u4_rx_fifo_buff,
-    ._rx_fifo_buff_size = sizeof(u4_rx_fifo_buff),
-
-#ifdef UART4_RX_USING_DMA
-    ._rx_dma = DMA1_Stream2,
-    ._rx_dma_tcif = DMA_IT_TCIF2,
-    ._rx_dma_teif = DMA_IT_TEIF2,
-    ._rx_dma_channel = DMA_Channel_4,
-    ._dma_rx_buff = u4_dma_rx_buf,
-    ._dma_rx_buff_size = sizeof(u4_dma_rx_buf),
-    ._rx_dma_irq_channel = DMA1_Stream2_IRQn,
-#else
-    ._rx_dma = NULL,
-#endif
 
-#ifdef UART4_TX_USING_DMA
-    ._tx_dma = DMA1_Stream4,
-    ._tx_dma_tcif = DMA_IT_TCIF4,
-    ._tx_dma_teif = DMA_IT_TEIF4,
-    ._tx_dma_channel = DMA_Channel_4,
-    ._dma_tx_buff = u4_dma_tx_buf,
-    ._dma_tx_buff_size = sizeof(u4_dma_tx_buf),
-    ._tx_dma_irq_channel = DMA1_Stream4_IRQn,
-#else
-    ._tx_dma = NULL,
-#endif
+static struct _uart_ops _u1_ops = {
+    .init = u1_init,
+    .read = u1_read_data,
+    .write = u1_write_data,
 };
 
-static uint32_t u4_write_data(const void *pdata, uint32_t len)
-{
-    return uart_tx_data(&_u4_config, pdata, len);
-}
-static uint32_t u4_read_data(void *pdata, uint32_t len)
-{
-    return uart_rx_data(&_u4_config, pdata, len);
-}
-static int u4_init(uint32_t bps)
-{
-    return uart_init(&_u4_config, bps);
-}
-
-static struct stm32_uart_ops _u4_ops = {
-    .init = u4_init,
-    .read = u4_read_data,
-    .write = u4_write_data};
-
-static struct stm32_uart uart4 = {
-    ._config = &_u4_config,
-    .ops = &_u4_ops};
+static struct _uart_device uart1 = {
+    .config = &_u1_config,
+    .ops = &_u1_ops,
+};
 
-void UART4_IRQHandler(void)
+/* UART1中断处理函数 */
+void uart1_irq_handler(void)
 {
-    _uart_isr_callback(&uart4);
+    uart_isr_callback(&_u1_config);
 }
 
-#ifdef UART4_RX_USING_DMA
-void DMA1_Stream2_IRQHandler(void)
+/* DMA0通道0中断处理函数 */
+void dma0_ch0_irq_handler(void)
 {
-    _uart_rx_dma_isr_callback(&uart4);
+    uart_tx_dma_isr_callback(&_u1_config);
 }
-#endif
 
-#ifdef UART4_TX_USING_DMA
-void DMA1_Stream4_IRQHandler(void)
-{
-    _uart_tx_dma_isr_callback(&uart4);
-}
-#endif
-#endif // DRV_USING_UART4
+#endif /* DRV_USING_UART1 */
 
-struct stm32_uart *uart_find(const char *name)
+/* ========== UART查找函数 ========== */
+struct _uart_device *uart_find(const char *name)
 {
-    struct stm32_uart *uart = NULL;
-    if (strncmp(name, "uart1", 5) == 0)
-    {
+    struct _uart_device *uart = NULL;
+    
+    if (strncmp(name, "uart1", 5) == 0) {
 #ifdef DRV_USING_UART1
         uart = &uart1;
-#endif // DEBUG
-    }
-    else if (strncmp(name, "uart2", 5) == 0)
-    {
+#endif
+    } else if (strncmp(name, "uart2", 5) == 0) {
 #ifdef DRV_USING_UART2
         uart = &uart2;
-#endif // DEBUG
-    }
-    else if (strncmp(name, "uart3", 5) == 0)
-    {
+#endif
+    } else if (strncmp(name, "uart3", 5) == 0) {
 #ifdef DRV_USING_UART3
         uart = &uart3;
-#endif // DEBUG
-    }
-    else if (strncmp(name, "uart4", 5) == 0)
-    {
+#endif
+    } else if (strncmp(name, "uart4", 5) == 0) {
 #ifdef DRV_USING_UART4
         uart = &uart4;
-#endif // DEBUG
-    }
-    else if (strncmp(name, "uart5", 5) == 0)
-    {
+#endif
+    } else if (strncmp(name, "uart5", 5) == 0) {
 #ifdef DRV_USING_UART5
         uart = &uart5;
-#endif // DEBUG
-    }
-    else if (strncmp(name, "uart6", 5) == 0)
-    {
+#endif
+    } else if (strncmp(name, "uart6", 5) == 0) {
 #ifdef DRV_USING_UART6
         uart = &uart6;
-#endif // DEBUG
-    }
-    else
-    {
-        uart = NULL;
+#endif
     }
-
+    
     return uart;
-}
+}

+ 2 - 0
controller_yy_app/user_src/inc/test.h

@@ -15,4 +15,6 @@
 #define SUSTEM_TEST    // 软件复位 测试
 #define UART2_RX_TEST     // SBUS RX 测试
 #define UART2_TX_TEST // SBUS TX 测试
+// #define SD_TEST // SD TEST
+#define GD25Q16_TEST  // SPI-FLASH 测试
 #endif

+ 96 - 90
controller_yy_app/user_src/main.c

@@ -1,98 +1,102 @@
-///*
-// * Copyright (c) 2021 HPMicro
-// *
-// * SPDX-License-Identifier: BSD-3-Clause
-// *
-// */
-
-//#include <stdio.h>
-//#include "board.h"
-
-//#include "test.h"
-//#ifdef TEST_EN
-//#include "bsp_V8M_YY_led.h"
-//#include "bsp_V8M_YY_pwm.h"
-// #include "bsp_V8M_YY_adc.h"
-//#include "hard_system.h"
-//#include "hard_system_time.h"
-//#include "hard_system_delay.h"
-//#include "hard_system_timer.h"
-//#include "hard_imu_uart3.h"
-//#include "hard_rc_sbus.h"
-//#include "hard_can.h"
-//#include "hard_sbus_out.h"
-//#include "main.h"
-//#include "hpm_math.h"
-//#endif
-///*
-//1 手册:中断源优先级,有效值为 0 到 7。
-//2 注意:内存缓存问题 catch
-//  如果DMA要访问​ → 必须用非缓存宏
-//  如果多核要共享​ → 必须用非缓存宏
-//  如果频繁被中断更新​ → 建议用非缓存宏
-//  其他情况​ → 不用修饰,让编译器优化
-//3 注意配置顺序 IO-时钟-外设
-//4 XDMA,作为主设备连接到 AXI 系统总线  HDMA,作为主设备连接到 AHB 外设总线 
-//  当 XDMA 的 destination 为 DRAM 时,如果 burst 大于等于 16,那 destsize 必须为 64bit。
-//  DMAMUX 的输出 0∼7 连接到外设总线 DMA 控制器 HDMA,DMAMUX 的输出 8∼15 连接到系统总线 DMA 控制器 XDMA
-//  它们都连接在统一的 DMAMUX(DMA 多路复用器)
-//  DMAMUX将所有外设的 DMA 请求(Request)统一管理,然后根据你的配置分配给 HDMA 或 XDMA 的任意空闲通道
-//5 注意cfg文件和一些前置的工程配置文件,可能导致编译出错 运行出错 仿真不了 重点:链接文件、yaml、板级cfg文件
-//*/
-//uint64_t delta_time;
-//#define PI (3.1415926f)
-//void start_time(void)
-//{
-//    delta_time = hpm_csr_get_core_mcycle();
-//}
-
-//uint32_t get_end_time(void)
-//{
-//    delta_time = hpm_csr_get_core_mcycle() - delta_time;
-//    return delta_time;
-//}
-//float theta ;
-//float sin_theta;
-//static void test_hard(void)
-//{
-//    // v8m_yy_led_test();
-//    // v8m_yy_motor_pwm_test();
-//    //  v8m_yy_adc_test();
-//    // timer0_test();
-//    // cpu_delay_test();
-//    // timer1_test();
-//    // can2_test();
-//    // imu_uart3_test();
-//    // uart2_sbus_test();
-//    // system_test();
-//    // sbus_uart2_out_test();
-//    while(1)
-//    {
-//      theta += PI*0.1;
-//      sin_theta = hpm_dsp_sin_f32(theta);
-//      board_delay_ms(200);
-//      printf("sin theta is %f\r\n", sin_theta);
-//    }
+/*
+ * Copyright (c) 2021 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+#if 0
+#include <stdio.h>
+#include "board.h"
+
+#include "test.h"
+#ifdef TEST_EN
+#include "bsp_V8M_YY_led.h"
+#include "bsp_V8M_YY_pwm.h"
+ #include "bsp_V8M_YY_adc.h"
+#include "hard_system.h"
+#include "hard_system_time.h"
+#include "hard_system_delay.h"
+#include "hard_system_timer.h"
+#include "hard_imu_uart3.h"
+#include "hard_rc_sbus.h"
+#include "hard_can.h"
+#include "hard_sbus_out.h"
+#include "hard_flash_gd25q16.h"
+#include "main.h"
+#include "hpm_math.h"
+#endif
+/*
+1 手册:中断源优先级,有效值为 0 到 7。
+2 注意:内存缓存问题 catch
+  如果DMA要访问​ → 必须用非缓存宏
+  如果多核要共享​ → 必须用非缓存宏
+  如果频繁被中断更新​ → 建议用非缓存宏
+  其他情况​ → 不用修饰,让编译器优化
+3 注意配置顺序 IO-时钟-外设
+4 XDMA,作为主设备连接到 AXI 系统总线  HDMA,作为主设备连接到 AHB 外设总线 
+  当 XDMA 的 destination 为 DRAM 时,如果 burst 大于等于 16,那 destsize 必须为 64bit。
+  DMAMUX 的输出 0∼7 连接到外设总线 DMA 控制器 HDMA,DMAMUX 的输出 8∼15 连接到系统总线 DMA 控制器 XDMA
+  它们都连接在统一的 DMAMUX(DMA 多路复用器)
+  DMAMUX将所有外设的 DMA 请求(Request)统一管理,然后根据你的配置分配给 HDMA 或 XDMA 的任意空闲通道
+5 注意cfg文件和一些前置的工程配置文件,可能导致编译出错 运行出错 仿真不了 重点:链接文件、yaml、板级cfg文件
+*/
+uint64_t delta_time;
+#define PI (3.1415926f)
+void start_time(void)
+{
+    delta_time = hpm_csr_get_core_mcycle();
+}
+
+uint32_t get_end_time(void)
+{
+    delta_time = hpm_csr_get_core_mcycle() - delta_time;
+    return delta_time;
+}
+float theta ;
+float sin_theta;
+static void test_hard(void)
+{
+    // v8m_yy_led_test();
+    // v8m_yy_motor_pwm_test();
+    //  v8m_yy_adc_test();
+    // timer0_test();
+    // cpu_delay_test();
+    // timer1_test();
+    // can2_test();
+    // imu_uart3_test();
+    // uart2_sbus_test();
+    // system_test();
+    // sbus_uart2_out_test();
+    test_gd25q16_quick();
+    gd25q16_cs_high();
+    while(1)
+    {
+      theta += PI*0.1;
+      sin_theta = hpm_dsp_sin_f32(theta);
+    
+      board_delay_ms(200);
+      printf("sin theta is %f\r\n", sin_theta);
+    }
      
-//}
-//int main(void)
-//{
-//    board_init();
-//    float i = 9.8f;
+}
+int main(void)
+{
+    board_init();
+    float i = 9.8f;
    
-//    sin_theta = hpm_dsp_sin_f32(theta);
+    sin_theta = hpm_dsp_sin_f32(theta);
     
    
-//    printf("hello world %f\n", i);
-//    printf("sin theta is %f\r\n", sin_theta);
-
-//    test_hard();
-//    return 0;
-//}
-//// DMA 最大4k
-
+    printf("hello world %f\n", i);
+    printf("sin theta is %f\r\n", sin_theta);
 
+    test_hard();
+    return 0;
+}
+// DMA 最大4k
 
+#endif
+#if 1
 /*
  * Copyright (c) 2021 HPMicro
  *
@@ -111,7 +115,7 @@ DIR s_dir;
 FRESULT fatfs_result;
 BYTE work[FF_MAX_SS];
 
-const TCHAR driver_num_buf[4] = { DEV_SD + '0', ':', '/', '\0' };
+const TCHAR driver_num_buf[3] = { DEV_SD + '0', ':', '/' };
 
 #define TEST_DIR_NAME "hpmicro_sd_test_dir0"
 
@@ -142,6 +146,7 @@ int main(void)
 
         /* Before doing FATFS operation, ensure the SD card is present */
         DSTATUS dstatus = disk_status(DEV_SD);
+        printf("sd state is %d\r\n", dstatus); // 找到SD卡
         if (dstatus == STA_NODISK) {
             printf("No disk in the SD slot, please insert an SD card...\n");
             do {
@@ -397,3 +402,4 @@ const char *show_error_string(FRESULT fresult)
     }
     return result_str;
 }
+#endif

+ 1 - 1
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/CMakeCache.txt

@@ -254,7 +254,7 @@ CMAKE_STRIP:FILEPATH=D:/sdk_env/sdk_env-v1.8.0/toolchains/rv32imac_zicsr_zifence
 CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE
 
 //No help, variable specified on the command line.
-CUSTOM_GCC_LINKER_FILE:UNINITIALIZED=D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/linkers/gcc/user_linker.ld
+CUSTOM_GCC_LINKER_FILE:UNINITIALIZED=D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/toolchains/gcc/flash_sdram_xip.ld
 
 //No help, variable specified on the command line.
 HPM_BUILD_TYPE:UNINITIALIZED=flash_sdram_xip

Разница между файлами не показана из-за своего большого размера
+ 3 - 2
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/build.ninja


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/compile_commands.json


+ 10 - 1
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/iar_embedded_workbench/controlware_yy_app.ewp

@@ -2433,7 +2433,8 @@
     </group>
     <group><name>software</name>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/software/debug_printf.c</name></file>
-      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/software/drv_uart.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/software/drv_usart.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/software/my_crc.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/software/params.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/software/rkfifo.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/software/soft_can.c</name></file>
@@ -2484,11 +2485,19 @@
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/hardware/hard_system_timer.c</name></file>
     </group>
     <group><name>controlware</name>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/auto_pilot.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/control_attitude.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/control_rate.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/control_throttle.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/data_save.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/flight_mode.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/geomatry.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/lowpass_filter.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/mode_attitude.c</name></file>
       <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/mode_gcs_tax_launch_run.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/my_math.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/pilot_init.c</name></file>
+      <file><name>D:/Zhuts_file/work/pro/Pro9_HPM6750/controlware_yy_hpm6750/controller_yy_app/controlware/pilot_navigation.c</name></file>
     </group>
     <group><name>middleware</name>
       <group><name>fatfs</name>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/iar_embedded_workbench/controlware_yy_app.json


+ 50 - 37
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/segger_embedded_studio/controlware_yy_app.emProject

@@ -74,15 +74,16 @@
       rv_toolchain_prefix="andes-"
       stack_size="0x4000"
       target_device_name="HPM6750xVMx" />
-    <configuration
-      Name="Debug"
-      build_output_file_name="$(OutDir)/controlware_yy$(EXE)" />
     <folder Name="application">
       <folder Name="controlware">
         <configuration
           Name="Common"
           build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/controlware" />
-        <configuration Name="Debug" build_exclude_from_build="No" />
+        <file file_name="..\..\controller_yy_app\controlware\auto_pilot.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/auto_pilot.c$(OBJ)" />
+        </file>
         <file file_name="..\..\controller_yy_app\controlware\control_attitude.c">
           <configuration
             Name="Common"
@@ -98,6 +99,26 @@
             Name="Common"
             build_object_file_name="$(IntDir)/control_throttle.c$(OBJ)" />
         </file>
+        <file file_name="..\..\controller_yy_app\controlware\data_save.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/data_save.c$(OBJ)" />
+        </file>
+        <file file_name="..\..\controller_yy_app\controlware\flight_mode.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/flight_mode.c$(OBJ)" />
+        </file>
+        <file file_name="..\..\controller_yy_app\controlware\geomatry.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/geomatry.c$(OBJ)" />
+        </file>
+        <file file_name="..\..\controller_yy_app\controlware\lowpass_filter.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/lowpass_filter.c$(OBJ)" />
+        </file>
         <file file_name="..\..\controller_yy_app\controlware\mode_attitude.c">
           <configuration
             Name="Common"
@@ -108,12 +129,26 @@
             Name="Common"
             build_object_file_name="$(IntDir)/mode_gcs_tax_launch_run.c$(OBJ)" />
         </file>
+        <file file_name="..\..\controller_yy_app\controlware\my_math.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/my_math.c$(OBJ)" />
+        </file>
+        <file file_name="..\..\controller_yy_app\controlware\pilot_init.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/pilot_init.c$(OBJ)" />
+        </file>
+        <file file_name="..\..\controller_yy_app\controlware\pilot_navigation.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/pilot_navigation.c$(OBJ)" />
+        </file>
       </folder>
       <folder Name="hardware">
         <configuration
           Name="Common"
           build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/hardware" />
-        <configuration Name="Debug" build_exclude_from_build="No" />
         <file file_name="..\..\controller_yy_app\hardware\hard_can.c">
           <configuration
             Name="Common"
@@ -158,19 +193,16 @@
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/hard_sdio_sd.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\hardware\hard_system.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/hard_system.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\hardware\hard_system_delay.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/hard_system_delay.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\hardware\hard_system_time.c">
           <configuration
@@ -187,7 +219,6 @@
         <configuration
           Name="Common"
           build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/matrix" />
-        <configuration Name="Debug" build_exclude_from_build="No" />
         <file file_name="..\..\controller_yy_app\matrix\euler.c">
           <configuration
             Name="Common"
@@ -308,7 +339,6 @@
         <configuration
           Name="Common"
           build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/payload" />
-        <configuration Name="Debug" build_exclude_from_build="No" />
         <file file_name="..\..\controller_yy_app\payload\payload.c">
           <configuration
             Name="Common"
@@ -319,7 +349,6 @@
         <configuration
           Name="Common"
           build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/remote_controller" />
-        <configuration Name="Debug" build_exclude_from_build="No" />
         <file file_name="..\..\controller_yy_app\remote_controller\rc_rock.c">
           <configuration
             Name="Common"
@@ -340,59 +369,56 @@
         <configuration
           Name="Common"
           build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/software" />
-        <configuration Name="Debug" build_exclude_from_build="Yes" />
         <file file_name="..\..\controller_yy_app\software\debug_printf.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/debug_printf.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
-        <file file_name="..\..\controller_yy_app\software\drv_uart.c">
+        <file file_name="..\..\controller_yy_app\software\drv_usart.c">
           <configuration
             Name="Common"
-            build_object_file_name="$(IntDir)/drv_uart.c$(OBJ)" />
+            build_object_file_name="$(IntDir)/drv_usart.c$(OBJ)" />
+          <configuration Name="Debug" build_exclude_from_build="Yes" />
         </file>
-        <file file_name="params.c">
+        <file file_name="..\..\controller_yy_app\software\my_crc.c">
+          <configuration
+            Name="Common"
+            build_object_file_name="$(IntDir)/my_crc.c$(OBJ)" />
+        </file>
+        <file file_name="..\..\controller_yy_app\software\params.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/params.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\rkfifo.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/rkfifo.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_can.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_can.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_can_yy.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_can_yy.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_delay.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_delay.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_flash.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_flash.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_gps.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_gps.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_gs.c">
           <configuration
@@ -404,72 +430,62 @@
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_imu.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_motor_output.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_motor_output.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_payload.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_payload.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_port_uart4.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_port_uart4.c$(OBJ)" />
+          <configuration Name="Debug" build_exclude_from_build="Yes" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_rc_input.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_rc_input.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_sdcard.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_sdcard.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_system.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_system.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_time.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_time.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_timer.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_timer.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_usharprada.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_usharprada.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_voltage.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_voltage.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
         <file file_name="..\..\controller_yy_app\software\soft_warn.c">
           <configuration
             Name="Common"
             build_object_file_name="$(IntDir)/soft_warn.c$(OBJ)" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
         </file>
       </folder>
       <folder Name="user_src">
@@ -483,12 +499,10 @@
         </file>
       </folder>
       <folder Name="v8">
-        <configuration Name="Debug" build_exclude_from_build="No" />
         <folder Name="v8m">
           <configuration
             Name="Common"
             build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/v8/v8m" />
-          <configuration Name="Debug" build_exclude_from_build="No" />
           <file file_name="..\..\controller_yy_app\v8\v8m\bsp_V8M_adc.c">
             <configuration
               Name="Common"
@@ -540,7 +554,6 @@
         <configuration
           Name="Common"
           build_intermediate_directory="Output/$(Configuration)/Obj/$(ProjectName)/application/vklink" />
-        <configuration Name="Debug" build_exclude_from_build="No" />
         <file file_name="..\..\controller_yy_app\vklink\gcs_vklink_v30.c">
           <configuration
             Name="Common"

+ 44 - 7
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/segger_embedded_studio/controlware_yy_app.emSession

@@ -22,14 +22,14 @@
   <ProjectSessionItem path="controlware_yy_app"/>
   <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board"/>
   <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application"/>
-  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application;controlware"/>
   <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application;hardware"/>
   <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application;software"/>
-  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application;v8"/>
-  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application;v8;v8m"/>
-  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application;v8;v8m_yy"/>
+  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;application;user_src"/>
   <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;boards"/>
   <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;boards;controller_yy_board"/>
+  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;soc"/>
+  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;soc;HPM6700"/>
+  <ProjectSessionItem path="controlware_yy_app;controlware_yy_app - controller_yy_board;utils"/>
  </Project>
  <Register1>
   <RegisterWindow invisibleNodes="" visibleNodes="ABI, RV32I/pc;ABI, RV32I/ra;ABI, RV32I/sp;ABI, RV32I/gp;ABI, RV32I/tp;ABI, RV32I/a0;ABI, RV32I/a1;ABI, RV32I/a2;ABI, RV32I/a3;ABI, RV32I/a4;ABI, RV32I/a5;ABI, RV32I/a6;ABI, RV32I/a7;ABI, RV32I/t0;ABI, RV32I/t1;ABI, RV32I/t2;ABI, RV32I/t3;ABI, RV32I/t4;ABI, RV32I/t5;ABI, RV32I/t6;ABI, RV32I/s0;ABI, RV32I/s1;ABI, RV32I/s2;ABI, RV32I/s3;ABI, RV32I/s4;ABI, RV32I/s5;ABI, RV32I/s6;ABI, RV32I/s7;ABI, RV32I/s8;ABI, RV32I/s9;ABI, RV32I/s10;ABI, RV32I/s11;CPU, RV32I/pc;CPU, RV32I/x1;CPU, RV32I/x2;CPU, RV32I/x3;CPU, RV32I/x4;CPU, RV32I/x5;CPU, RV32I/x6;CPU, RV32I/x7;CPU, RV32I/x8;CPU, RV32I/x9;CPU, RV32I/x10;CPU, RV32I/x11;CPU, RV32I/x12;CPU, RV32I/x13;CPU, RV32I/x14;CPU, RV32I/x15;CPU, RV32I/x16;CPU, RV32I/x17;CPU, RV32I/x18;CPU, RV32I/x19;CPU, RV32I/x20;CPU, RV32I/x21;CPU, RV32I/x22;CPU, RV32I/x23;CPU, RV32I/x24;CPU, RV32I/x25;CPU, RV32I/x26;CPU, RV32I/x27;CPU, RV32I/x28;CPU, RV32I/x29;CPU, RV32I/x30;CPU, RV32I/x31" binaryNodes="" asciiNodes="" openNodes="ABI, RV32I;CPU, RV32I" name="controlware_yy_app - controller_yy_board_Debug" decimalNodes="" octalNodes="" unsignedNodes=""/>
@@ -50,7 +50,9 @@
   <Trace enabled="Yes"/>
  </TraceWindow>
  <Watch1>
-  <Watches active="1" update="Never"/>
+  <Watches active="1" update="Never">
+   <Watchpoint expression="buf" name="buf" radix="16" linenumber="222" filename="../../controller_yy_app/hardware/hard_flash_gd25q16.c"/>
+  </Watches>
  </Watch1>
  <Watch2>
   <Watches active="0" update="Never"/>
@@ -62,8 +64,43 @@
   <Watches active="0" update="Never"/>
  </Watch4>
  <Files>
-  <SessionOpenFile windowGroup="DockEditLeft" x="5" y="12" useTextEdit="1" path="../../controller_yy_app/v8/v8m/bsp_V8M_flash.c" left="0" selected="1" top="0" codecName="Default"/>
-  <SessionOpenFile windowGroup="DockEditLeft" x="26" y="82" useTextEdit="1" path="../../controller_yy_board/board.c" left="0" top="63" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="23" y="298" useTextEdit="1" folds0="82" path="../../controller_yy_app/software/drv_usart.c" left="0" selected="1" top="330" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="45" y="434" useTextEdit="1" path="../../controller_yy_app/hardware/hard_flash_gd25q16.c" left="0" top="438" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="19" y="72" useTextEdit="1" path="../../controller_yy_app/hardware/hard_inc/hard_flash_gd25q16.h" left="0" top="49" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="138" useTextEdit="1" path="../../controller_yy_app/user_src/main.c" left="0" top="124" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="25" y="8" useTextEdit="1" path="../../controller_yy_app/hardware/hard_sdio_sd.c" left="0" top="0" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="../../controller_yy_app/hardware/hard_inc/hard_sdio_sd.h" left="0" top="0" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="30" y="446" useTextEdit="1" path="../../controller_yy_board/board.c" left="0" top="853" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="39" y="18" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/boot/hpm_bootheader.c" left="0" top="14" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="8" y="12" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/boot/hpm_bootheader.h" left="0" top="0" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="../../controller_yy_app/software/soft_gs.c" left="0" top="6" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="25" y="21" useTextEdit="1" path="../../controller_yy_app/hardware/hard_hdma_int.c" left="0" top="9" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/drivers/inc/hpm_uart_drv.h" left="0" top="687" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="169" useTextEdit="1" folds0="126" path="../../controller_yy_app/hardware/hard_imu_uart3.c" left="0" top="128" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="42" y="485" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/hpm_clock_drv.c" left="0" top="472" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="14" y="191" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/hpm_clock_drv.h" left="0" top="173" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="2" y="31" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/ip/hpm_dma_regs.h" left="0" top="5" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="8" y="145" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/ip/hpm_uart_regs.h" left="0" top="133" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="8" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/drivers/src/hpm_gpio_drv.c" left="0" top="0" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="40" y="272" useTextEdit="1" path="../../../../../../tool/HPM6750_tool/include/stdint.h" left="0" top="260" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/drivers/inc/hpm_gpio_drv.h" left="0" top="370" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="8" y="326" useTextEdit="1" path="../../controller_yy_board/board.h" left="0" top="314" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="34" y="17" useTextEdit="1" path="../../controller_yy_board/pinmux.c" left="0" top="12" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="5" y="26" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/drivers/src/hpm_uart_drv.c" left="0" top="2" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="38" y="36" useTextEdit="1" path="../../controller_yy_app/hardware/hard_inc/hard_hdma_int.h" left="0" top="24" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="8" y="200" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/hpm_interrupt.h" left="0" top="188" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="5" y="61" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/drivers/src/hpm_dma_drv.c" left="0" top="52" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="44" y="59" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/drivers/inc/hpm_dmamux_drv.h" left="0" top="47" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="17" y="123" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/hpm_soc.h" left="0" top="113" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="13" y="187" useTextEdit="1" path="../../controller_yy_app/software/rkfifo.c" left="0" top="128" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/toolchains/gcc/start.S" left="0" top="0" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/toolchains/gcc/initfini.c" left="0" top="62" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="25" y="22" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/toolchains/reset.c" left="0" top="162" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/system.c" left="0" top="32" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/utils/hpm_crc32.c" left="0" top="4" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/utils/hpm_ffssi.c" left="0" top="0" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="0" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/utils/hpm_swap.c" left="0" top="0" codecName="Default"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="8" y="46" useTextEdit="1" path="D:/sdk_env/sdk_env-v1.8.0/hpm_sdk/soc/HPM6700/HPM6750/hpm_soc_irq.h" left="0" top="0" codecName="Default"/>
  </Files>
  <EMStudioWindow activeProject="controlware_yy_app - controller_yy_board" fileDialogDefaultFilter="*.c" autoConnectTarget="GDB Server" buildConfiguration="Debug" sessionSettings="" debugSearchFileMap="" fileDialogInitialDirectory="" debugSearchPath="" autoConnectCapabilities="1343"/>
 </session>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
controller_yy_app_controller_yy_board_flash_sdram_xip_debug/segger_embedded_studio/controlware_yy_app.json


+ 1 - 6
controller_yy_board/board.c

@@ -451,12 +451,7 @@ uint32_t board_init_uart_clock(UART_Type *ptr)
         clock_set_source_divider(clock_uart0, clk_src_osc24m, 1);
         clock_add_to_group(clock_uart0, 0);
         freq = clock_get_frequency(clock_uart0);
-    } else if(ptr == HPM_UART3){
-        clock_set_source_divider(clock_uart3, clk_src_osc24m, 1);
-        clock_add_to_group(clock_uart3, 0);
-        freq = clock_get_frequency(clock_uart3);
-    }
-    else if (ptr == HPM_UART6) {
+    } else if (ptr == HPM_UART6) {
         clock_set_source_divider(clock_uart6, clk_src_osc24m, 1);
         clock_add_to_group(clock_uart6, 0);
         freq = clock_get_frequency(clock_uart6);

+ 6 - 8
controller_yy_board/board.h

@@ -22,7 +22,7 @@
 #include "hpm_debug_console.h"
 #endif
 
-#define BOARD_NAME          "hpm6750-vkmini"
+#define BOARD_NAME          "hpm6750evkmini"
 #define BOARD_UF2_SIGNATURE (0x0A4D5048UL)
 
 #define SEC_CORE_IMG_START ILM_LOCAL_BASE
@@ -285,8 +285,7 @@
 #define BOARD_APP_ADC12_NAME     "ADC0"
 #define BOARD_APP_ADC12_BASE     HPM_ADC0
 #define BOARD_APP_ADC12_IRQn     IRQn_ADC0
-#define BOARD_APP_ADC12_CH_1     (7U)
-#define BOARD_APP_ADC12_CH_2     (14U)
+#define BOARD_APP_ADC12_CH_1     (14U)
 #define BOARD_APP_ADC12_CLK_NAME (clock_adc0)
 
 #define BOARD_APP_ADC16_NAME     "ADC3"
@@ -294,7 +293,6 @@
 #define BOARD_APP_ADC16_BASE     HPM_ADC3
 #define BOARD_APP_ADC16_CH_1     (2U)
 #define BOARD_APP_ADC16_CLK_NAME (clock_adc3)
-#define BOARD_APP_ADC16_CLK_BUS  (clk_adc_src_ahb0)
 
 #define BOARD_APP_ADC12_HW_TRIG_SRC_CLK_NAME clock_mot0
 #define BOARD_APP_ADC12_HW_TRIG_SRC          HPM_PWM0
@@ -314,8 +312,8 @@
 #define BOARD_APP_ADC16_PMT_TRIG_CH ADC16_CONFIG_TRG0A
 
 /* CAN section */
-#define BOARD_APP_CAN_BASE HPM_CAN2
-#define BOARD_APP_CAN_IRQn IRQn_CAN2
+#define BOARD_APP_CAN_BASE HPM_CAN1
+#define BOARD_APP_CAN_IRQn IRQn_CAN1
 
 /*
  * timer for board delay
@@ -339,11 +337,11 @@
 /* SDXC section */
 #define BOARD_APP_SDCARD_SDXC_BASE                 (HPM_SDXC1)
 #define BOARD_APP_SDCARD_SUPPORT_3V3               (1)
-#define BOARD_APP_SDCARD_SUPPORT_1V8               (1)
+#define BOARD_APP_SDCARD_SUPPORT_1V8               (0) // 不支持1.8V
 #define BOARD_APP_SDCARD_SUPPORT_4BIT              (1)
 #define BOARD_APP_SDCARD_SUPPORT_CARD_DETECTION    (1)
 #define BOARD_APP_SDCARD_SUPPORT_POWER_SWITCH      (0)
-#define BOARD_APP_SDCARD_SUPPORT_VOLTAGE_SWITCH    (1)
+#define BOARD_APP_SDCARD_SUPPORT_VOLTAGE_SWITCH    (0)  // 不支持电压切换
 #define BOARD_APP_SDCARD_SUPPORT_CARD_DETECTION    (1)
 #define BOARD_APP_SDCARD_CARD_DETECTION_USING_GPIO (0)
 #if defined(BOARD_APP_SDCARD_CARD_DETECTION_USING_GPIO) && (BOARD_APP_SDCARD_CARD_DETECTION_USING_GPIO == 1)

Некоторые файлы не были показаны из-за большого количества измененных файлов