- 打卡等级:以坛为家II
- 打卡总天数:536
- 最近打卡:2025-06-16 08:31:26
荣誉版主
- 积分
- 3789
|
发表于 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[SEND_POINT])>>8; //地址
DMA_UR1T_TXAL = (u16)(&SEND_BUF[SEND_POINT]); //地址
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
这与错误提示相吻合, 估计问题是出在这里.
楼主可从这里着手解决之...
一般可以用一个中断服务程序, 在其中根据发送中断和接收中断的不同标志位, 来分别做处理...
仅供参考....
|
|