小233宋 发表于 2024-9-2 19:22:41

编译失败,总是提示SEGMENT COMBINATION ERROR

使用了 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=5211&extra=&highlight=4%E4%B8%B2%E5%8F%A3DMA&page=1 这位大佬的串口程序,然后一直提示SEGMENT COMBINATION ERROR

又新建了一个工程,然后还是提示这个,小白求助各位大佬帮忙看看

小233宋 发表于 2024-9-2 19:23:50

编译结果是这样的

DebugLab 发表于 2024-9-2 22:35:00

由于连接错误所给段未能连入类型总段,并被忽略
没遇到过这个错误

乘风飞扬 发表于 2024-9-3 09:52:30

首先,HUGE模式要参考规格书第5章介绍设置:

其次,DMA UART1收发中断向量都写成了 50 (DMA_UART1RX中断向量应该是 51):

浦江一水 发表于 2024-9-3 09:53:05

本人的理解, 试回答楼主的问题...

*** ERROR L101: SEGMENT COMBINATION ERROR
    SEGMENT: ?PR?IV?50
    MODULE:.\Objects\UART1.obj (UART1)

根据提示直译看...
SEGMENT COMBINATION ERROR
就是"段组织错误",
SEGMENT: ?PR?IV?50
这一句指出: 错误在程序段中的中断矢量表中.
MODULE:.\Objects\UART1.obj (UART1)
这是指出问题是出在UART1这个模块中

那么, 再看 UART1模块. 楼主是用的是库函数, (不知是否修改过? 一般最好不要改动.)
其中:

/*---------------------------------------------------------
DMA_UART1TX中断
----------------------------------------------------------*/
void DMA_UART1TX_ISR_Handler(void) interrupt 50
{
    DMA_UR1T_STA = 0;   //清除中断标志
    SEND_SIZE-=SEND_DMA_SIZE;   //发送数量递减
    SEND_POINT+=SEND_DMA_SIZE;//发送指针递加
    if(SEND_POINT>=UART1_SEND_BUF_SIZE)SEND_POINT=0;//指针循环调整
    if(SEND_SIZE)   //如果有数据要发出
    {
      SEND_DMA_SIZE = (SEND_APP_WR_ADDR>SEND_POINT)? SEND_APP_WR_ADDR-SEND_POINT : UART1_SEND_BUF_SIZE-SEND_POINT;
      DMA_UR1T_AMTH = (SEND_DMA_SIZE-1)>>8;                //字节数
      DMA_UR1T_AMT= (SEND_DMA_SIZE-1);                     //字节数
      DMA_UR1T_TXAH = (u16)(&SEND_BUF)>>8;   //地址
      DMA_UR1T_TXAL = (u16)(&SEND_BUF);            //地址
      DMA_UR1T_CR   = 0XC0;                              //启动DMA
    }
    else{   //没有数据要发出,恢复到默认状态
      SEND_ENDBZ = 1;
      SEND_DMA_SIZE = SEND_POINT = SEND_APP_WR_ADDR = 0;//此句非必要
    }
}

/*---------------------------------------------------------
DMA_UART1RX中断
----------------------------------------------------------*/
void DMA_UART1RX_ISR_Handler(void) interrupt 50
{
    DMA_UR1R_STA = 0;   //清除中断标志
    DMA_UR1R_CR = 0XA1; //开DMA接收
}

发送中断和接收中断, 用了同一个中断矢量号 50
这与错误提示相吻合, 估计问题是出在这里.

楼主可从这里着手解决之...
一般可以用一个中断服务程序, 在其中根据发送中断和接收中断的不同标志位, 来分别做处理...

仅供参考....

小233宋 发表于 2024-9-3 10:02:24

浦江一水 发表于 2024-9-3 09:53
本人的理解, 试回答楼主的问题...

*** ERROR L101: SEGMENT COMBINATION ERROR


收到!感谢您的解答,成功编译通过,不知道这个中断号啥时候变了

小233宋 发表于 2024-9-3 10:03:15

乘风飞扬 发表于 2024-9-3 09:52
首先,HUGE模式要参考规格书第5章介绍设置:

其次,DMA UART1收发中断向量都写成了 50 (DMA_UART1RX中断向 ...

感谢您的解答!成功解决问题

llyymm 发表于 2024-9-3 10:09:13

第一次遇到这情况,我也学习到了{:4_165:}

soma 发表于 2024-9-3 12:43:43

中断号错也会报错啊,才知道

huaruolong 发表于 2024-9-15 22:32:21

学习了。
页: [1]
查看完整版本: 编译失败,总是提示SEGMENT COMBINATION ERROR