各位专家:
本次求助的目标:在C6678的CORE1上配置串口接收中断,用于通信数据接收与协议解析。以官方开发包内串口DEMO程序为基础:K1_STK_v1.1\UART。其内部关于串口中断配置代码理解如下(函数KeyStone_UART_Interrupts_Init):
第一步,选定CIC输出通道,这里选取的是通道33,对应CIC0_OUT(32+1+11*n) (Or CIC1_OUT(32+1+11*(n-4)) ,当在CORE1上运行时,n=0,即对应uiCIC_out_num= 33。
if(C6670_EVM==gDSP_board_type
||DUAL_NYQUIST_EVM==gDSP_board_type
||TCI6614_EVM==gDSP_board_type)
{
uiCIC_out_num= 64;//CIC out 64 is INTC input 22
}
elseif(C6678_EVM==gDSP_board_type)
{
uiCIC_out_num= 33;//in C6678, CIC out 33 is also INTC input 22
}
else
{
puts("Unknown DSP board type!");
return;
}
第二步,选定当前使用哪一个CIC模块,根据手册描述,CORE0-3均使用CIC0。
if(DNUM<4) //for core 0, 1, 2, 3
CIC_Regs= gpCIC0_regs;
else
CIC_Regs= gpCIC1_regs;
第三步,绑定系统事件与CIC0输出通道之间的映射关系,这里串口接收事件CSL_INTC0_URXEVT对应的CIC0输出通道为34,即uiCIC_out_num+1,手册描述为CIC0_OUT(32+2+11*n) Or CIC1_OUT(32+2+11*(n-4)) 。
KeyStone_CIC_event_map(CIC_Regs, CSL_INTC0_UARTINT, uiCIC_out_num);
KeyStone_CIC_event_map(CIC_Regs, CSL_INTC0_URXEVT, uiCIC_out_num+1);
KeyStone_CIC_event_map(CIC_Regs, CSL_INTC0_CPU_3_2_EDMACC_GINT, uiCIC_out_num+2);
第四步,绑定CIC0输出通道与CORE0内INTC控制器中断向量之间的映射关系,这里CIC0输出通道34对应CORE0内核中断向量中的CSL_CGEM_INTMUX1_INTSEL5_SHIFT
gpCGEM_regs->INTMUX1 =
(CSL_GEM_INTC0_OUT_33_PLUS_11_MUL_N_OR_INTC0_OUT_33_PLUS_11_MUL_N_MINUS_4<<CSL_CGEM_INTMUX1_INTSEL4_SHIFT)|\
(CSL_GEM_INTC0_OUT_34_PLUS_11_MUL_N_OR_INTC0_OUT_34_PLUS_11_MUL_N_MINUS_4<<CSL_CGEM_INTMUX1_INTSEL5_SHIFT)|\
(CSL_GEM_INTC0_OUT_35_PLUS_11_MUL_N_OR_INTC0_OUT_35_PLUS_11_MUL_N_MINUS_4<<CSL_CGEM_INTMUX1_INTSEL6_SHIFT);
第五步,最后在中断向量表中将串口接收中断进行注册,文件UART_vectors.asm。
vectors:
VEC_RESET Nested_Exception_service_routine ;Nested exception
VEC_ENTRY NMI_ISR ;NMI/Exception
VEC_DUMMY ;RSVD
VEC_DUMMY ;RSVD
VEC_ENTRY KeyStone_UART_Error_ISR ;interrupt 4
VEC_ENTRY KeyStone_UART_Rx_ISR ;interrupt 5
VEC_ENTRY KeyStone_UART_EDMA_ISR ;interrupt 6
VEC_DUMMY ;interrupt 7
VEC_DUMMY ;interrupt 8
VEC_DUMMY ;interrupt 9
VEC_DUMMY ;interrupt 10
VEC_DUMMY ;interrupt 11
VEC_DUMMY ;interrupt 12
VEC_DUMMY ;interrupt 13
VEC_DUMMY ;interrupt 14
VEC_DUMMY ;interrupt 15
.end
上述程序通过仿真器在CORE0上可正常运行,触发串口接收中断。现在想在CORE1上实现串口接收中断,对上述五个配置步骤做了以下调整,但是仿真器下载运行时,串口中断无反应,请问各位专家是有哪些理解错误或遗漏的地方?
第一步:uiCIC_out_num= 44;,这是按n=1时,CIC0_OUT(32+1+11*n) (Or CIC1_OUT(32+1+11* (n-4))计算得到的。
第二步,无修改,同样使用CIC0。
第三步,代码无修改,但串口接收事件CSL_INTC0_URXEVT对应的CIC0输出通道为45,这是按n=1时,CIC0_OUT(32+1+11*n) (Or CIC1_OUT(32+1+11* (n-4))计算得到的。
第四步,代码无修改,这里CIC0输出通道45对应CORE1内核中断向量中的CSL_CGEM_INTMUX1_ INTSEL5_SHIFT。
第五步,代码无需修改。
CMD文件如下:
MEMORY
{
/* Local L2, 0.5~1MB*/
VECTORS: o = 0x00800000 l = 0x00000200 /*set memory protection attribitue as execution only*/
LL2_CODE:o = 0x00800200 l = 0x0000FE00 /*set memory protection attribitue as execution only*/
LL2_R_DATA: o = 0x00810000 l = 0x00008000 /*set memory protection attribitue as read only*/
LL2_RW_DATA: o = 0x00818000 l = 0x00048000 /*set memory protection attribitue as read/write*/
/* Shared L2 2~4MB*/
SL2: o = 0x0C000000 l = 0x00180000
SL2_RW_DATA: o = 0x18000000 l = 0x00200000 /*remapped SL2, set memory protection attribitue as read/write*/
/* External DDR3, upto 2GB per core */
DDR3_CODE:o = 0x80000000 l = 0x01000000 /*set memory protection attribitue as execution only*/
DDR3_R_DATA: o = 0x81000000 l = 0x01000000 /*set memory protection attribitue as read only*/
DDR3_RW_DATA:o = 0x82000000 l = 0x06000000 /*set memory protection attribitue as read/write*/
}
Thomas Yang1:
先不通过CIC,直接GPIO event能不能路由到CORE1的primary event中试试呢?
countryhotel:
回复 Thomas Yang1:
问题已经解决,谢谢,
user4670459:
回复 countryhotel:
您好,我遇到了同样的问题,请问您是怎么解决的?望不吝赐教。