本帖最后由 hechuan519 于 2019-9-1 19:17 编辑
! T3 E8 q a9 k# n/ G, P2 j! j k$ b6 q# [4 S4 s' }5 `
1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数
. Z X9 S: [5 W0 E3 j- e( jvoid main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置
3 g- E* Z& m0 n) A# Y$ g6 h! r7 Y /********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置
2 n, |6 x, A( k8 [/ p0 M /********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化
& h1 O- [ w: x4 m: D' r- d* J8 u9 F UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了
5 _! Z3 y" {" W' ]% N UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){
, n3 Q- a& ^7 k, p% \ } } void PSCInit(void), a& N: ^% l3 y: v4 I9 ~% w& U
{
! h# M& R4 O9 N8 ^/ [ // 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成
- @. z* D6 g; t2 {) P* R0 | PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 }: v" W! p/ S) M0 O4 c* s PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 `2 m7 r8 n/ O% _) |- o$ K} 串口2中断配置函数 void GPIOBankPinMuxSet(void){
i' ^+ j" e/ b7 j UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){ 3 K0 D5 Q, \# f& z: Y
IntDSPINTCInit();
8 W6 L3 @2 X3 T8 J4 f IntGlobalEnable(); } static void UART2Init(void){
% z" \9 z4 w& M8 c$ s3 N: [ // 波特率460800 数据位 8 停止位 1 无校验位 / N u) H! i9 b" P+ H
UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16);
) j q8 I1 \# l& [; V G# a& J. [ // 使能 UART2 " k) M, f+ _- F
UARTEnable(SOC_UART_2_REGS); - V$ l& x/ K, N
// 使能接收 / 发送 FIFO * A6 q4 I; b+ {; G1 b5 j$ H2 `5 ~# M
UARTFIFOEnable(SOC_UART_2_REGS); ; M& `8 D3 m( _
// 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){ 0 n( e# p4 s8 O& ~9 b0 y V( o
IntRegister(C674X_MASK_INT4, UARTIsr); . \/ q, @' p* |: X
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT); 2 y# D- n# o+ E7 y" M
IntEnable(C674X_MASK_INT4); * t( Y, G ~1 z3 _/ F) n5 @. a7 y0 {
UARTIntEnable(SOC_UART_2_REGS, UART_INT_LINE_STAT |UART_INT_RXDATA_CTI); } /***********************************************/ /* UART 中断服务函数 */ /***********************************************/ void UARTIsr() { unsigned char rxData =0; unsigned int int_id =0; // 确定中断源 int_id = UARTIntStatus(SOC_UART_2_REGS); // 清除 UART2 系统中断 IntEventClear(SYS_INT_UART2_INT); // 接收中断 if(UART_INTID_RX_DATA== int_id) { rxData = UARTCharGet(SOC_UART_2_REGS); 3 ~' f1 \ _+ r
} return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){
7 s' P+ X0 v6 h% L, L TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式
3 ]- c! W7 J+ e' a TimerPeriodSet(SOC_TMR_0_REGS,TMR_TIMER12, 24000*1);//1ms定时准确 TimerEnable(SOC_TMR_0_REGS,TMR_TIMER12, TMR_ENABLE_CONT);} /****************************************************************************/ /* 定时器0中断初始化 */ /****************************************************************************/ void Timer0_Interrupt_Init(void){ ( e* i( t1 e, {( A
IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断
0 A# \7 V* X7 n, G& O3 ~ IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8 2 b0 O/ I! P5 ~ e, p; C1 Q
TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){ l4 o7 V b% G; L. A. p7 Y
TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); 8 b; i; }! g' X, |! M6 ` V/ b
IntEventClear(SYS_INT_T64P0_TINT12);
7 W. p# t! }: ^! a% G% G! l TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
5 g& L/ q" o: ^+ H' @2 O //中断处理函数
+ o3 B9 A! G2 j% k2 x GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 { : S! I9 h# B- g
unsignedint i=0,j=0;
$ y. K% F8 a! t& z0 d4 M/ \, I for(i=0;i<100;i++){
- j8 O# S& F' p& F j=5;
; ]) h4 f7 q' c* j0 W } }! N6 W2 V2 a9 \3 D( ~) a% J
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?
+ _! _. D' S G& D! Y( k 3 i# \0 ]% B5 J7 K8 L. j
& i3 w' |( \: K* Y' X
$ p6 g' R* X* _* O8 z' X2 g$ _
|