本帖最后由 hechuan519 于 2019-9-1 19:17 编辑 8 Y4 u; K4 g5 M: R/ }$ E
# a9 K$ M' t5 G1 |) y; D- k3 L1问题描述如下:用创龙OMAPL138开发板的串口2中断接收并解析串口数据,开启Timer0中断,在Timer0中以1ms的周期通过EMIF读取FPGA数据,测试过程中发现存在如下问题,当定时器Timer0 中断函数中调用GetEmifData()函数,串口则不能接收并解析数据,无法进入串口中断。当定时器0中什么都不做的情况下能正常的解析串口数据,串口数据到来的时候能进入串口中断处理函数,请问这是什么原因呢。以下是main函数; I I" [: D. F9 i9 { p# d
void main(void) { /*********1.PSC初始化****************/ PSCInit();// 外设使能配置
+ S7 k( N: D8 X& E; @ /********2.管脚复用设置***************/ GPIOBankPinMuxSet(); //GPIO 管脚复用配置 - a: s# ]+ `) m, R7 G$ v% j
/********3.DSP中断初始化**************/ DSPInterruptInit(); //DSP全局中断初始化 /*********4.外设初始化****************/ UART2Init(); //UART2初始化 Timer0_Init(); //Timer0初始化
$ ~0 a% v) i8 [8 l: f% d6 E6 |2 s, \ UARTInterruptInit(); //惯导UART中断初始化 Timer0_Interrupt_Init();//影响串口中断了 ) x7 ^$ c6 B+ v3 ]% j3 X S
UARTPuts("TronlongUART2 Application..\r\n", -1); for(;;){
$ v, }- O9 F( } A# V } } void PSCInit(void)3 B! A7 _) t# \9 T) M( p
{; p q; g3 H( l5 _
// 使能 ,对相应外设模块的使能也可以在 BootLoader 中完成! Q' Y9 T5 @. A: q n! }: _$ `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. \) M- w- D' D2 X; g0 J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ J, r! W; `# o
} 串口2中断配置函数 void GPIOBankPinMuxSet(void){ 5 Z# o4 W/ b0 L4 K! B
UARTPinMuxSetup(2, FALSE);//串口2引脚复用 } static void DSPInterruptInit(void){
1 n. Y2 X0 U% _* m& X0 o: `0 E IntDSPINTCInit(); # i1 _: l* \8 d0 u
IntGlobalEnable(); } static void UART2Init(void){
: P7 B( `2 J. G) S1 B3 `5 A // 波特率460800 数据位 8 停止位 1 无校验位
8 p3 W d8 T8 ~4 G) S$ s4 q( T7 E UARTConfigSetExpClk(SOC_UART_2_REGS,456000000 / 2, 460800, UART_WORDL_8BITS , UART_OVER_SAMP_RATE_16); * T! q: @5 A3 e+ ~
// 使能 UART2 * L" V; T3 e9 y4 H8 U
UARTEnable(SOC_UART_2_REGS);
1 G0 {( J& q7 n& d // 使能接收 / 发送 FIFO 3 k, R6 a$ c# c/ }/ L
UARTFIFOEnable(SOC_UART_2_REGS);
" \8 |" g1 A } // 设置 FIFO 级别 // 8 字UARTFIFOLevelSet(SOC_UART_2_REGS,UART_RX_TRIG_LEVEL_1); } /* UART 中断初始化 */ void UARTInterruptInit(void){
, D' {6 ?/ R/ g( ]6 m& Z @4 ] IntRegister(C674X_MASK_INT4, UARTIsr); 4 ]" {$ O' [2 D8 }) j+ E' q" E& Q
IntEventMap(C674X_MASK_INT4,SYS_INT_UART2_INT); & t$ I- a0 t' _. L1 ^- E3 q
IntEnable(C674X_MASK_INT4);
& C- Z6 i4 X9 j: r 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);
* i2 e( s& p1 M; Y) b } return; } /****************************************************************************/ /* 定时器Timer0初始*/ /****************************************************************************/ void Timer0_Init(void){
7 w& g- S: x9 E1 I( S( O TimerConfigure(SOC_TMR_0_REGS,TMR_CFG_32BIT_UNCH_CLK_BOTH_INT);// 配置定时器 /计数器 2 为 32 位模式 - R2 Q) X/ O1 u$ L& Q% e& A9 n: w9 U
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){
/ P4 [( @6 q8 }' n: u* ` IntRegister(C674X_MASK_INT7, Timer0Isr);//注册中断服务函数C674X_MASK_INT7 IntEventMap(C674X_MASK_INT7,SYS_INT_T64P0_TINT12);// 映射中断到 DSP 可屏蔽中断
6 C+ Z" F! |' D, S% C. K: ^ IntEnable(C674X_MASK_INT7);// 使能 DSP可屏蔽中断8 , L/ i8 m+ x: c
TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);// 使能 定时器 / 计数器 中断 } void Timer0Isr(){
- _* @4 _- ~2 R( h! \ TimerIntDisable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); & o- C' [6 T6 H3 e/ @6 n v
IntEventClear(SYS_INT_T64P0_TINT12);
: i. t* l" n6 e6 Z) D" | TimerIntStatusClear(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE);
! J% i r ^: d+ N6 d3 a- w //中断处理函数
, r, k3 u( G. N# v) v/ a GetEMIFData();//若调用此函数,串口有数据到来时,OMAPL138无法进入串口2中断,若屏蔽此函数,则可进串口2中断 TimerIntEnable(SOC_TMR_0_REGS,TMR_INT_TMR12_NON_CAPT_MODE); } void GetEMIFData()//测试函数 { * l* |- Q3 o3 B/ m
unsignedint i=0,j=0; ! D4 v$ d+ O) A- t
for(i=0;i<100;i++){ 0 G! Y' t7 k0 C
j=5; * ~' @/ i: {" i! [! t( F- V1 P
} }6 n7 f: f2 S c" N* @6 e3 [6 S
测试发现,在GetEMIFData()函数中for循环100次,串口正确解析一段时间后卡死,当for循环10时,串口可一直接收数据,很疑惑,难道DSP的定时器中断处理函数连一个for循环都处理不过来么?还是其他原因引起的串口无法接收数据问题?
; [4 C& [3 H, n [* R* T) K ) Y. d6 V6 a- |
6 a6 c& ?( R/ `' G/ Z: j3 ?
* C1 Y2 `* T" Z |