当前使用 N32G031C8L7,基于串口1都进行了测试(200ms 收一帧 20字节的数据,收到后判断后回复),几百帧或2000帧左右,程序出现意外卡死(设置了独立看门狗,看门狗复位)的严重问题!
修改了一下程序,在 N32G032C8L7 下进行再验证 (证明不是N32G031 RAM不足引起的意外溢出 ),意外卡死问题仍旧!!(变量清零,溢出的可能性极小)
问一下,有那位兄台或大侠,遇到过这问题不?!
程序的基本情况:
1、初始化 SysTick 中断 每2ms 中断一次 (用于系统计时)
2、串口1 115200,NONE,8,1
当前KEIL 编译后 RAM 占 4.91kB(N32G032C8L7下,有16K RAM 64K FLASH),FLASH约占 40KB
//系统tick 初始化
void SysTick_Configuration(void)
{
if(SysTick_Config(SystemCoreClock/SYSTICK_2MS)) // SYSTICK_2MS = 500
{
/* Capture error */
while (1) ;
}
NVIC_SetPriority(SysTick_IRQn, 0); // NVIC_InitType
}
//N32G032 串口1 中断
void USART1_2_IRQHandler(void)
{
if (USART_GetIntStatus(USART1, USART_INT_RXDNE) != RESET) //USART_FLAG_RXDNE
{
assert_param(IS_USART_ALL_PERIPH(USART1));
if(Usart1.rec_len < Usart1_MAX_REC) //
{ // USARTx->DAT = (Data & (uint16_t)0x01FF);
//Usart1.rec_buf[Usart1.rec_len++] = (unsigned char)(USART1->DAT & (uint16_t)0x01FF);
Usart1.rec_buf[Usart1.rec_len++] = (unsigned char)(USART1->DAT & 0x01FF);
Usart1.rec_existflag = 1;
Usart1.rec_dltime = Uart1_Max_Rec_DLTime;
}
else
{
Usart1.rec_len = 0;
Usart1.rec_existflag = 0; //
}
}
//SET
//if (USART_GetIntStatus(USART1, USART_INT_TXC) != RESET)
if (USART_GetIntStatus(USART1, USART_INT_TXDE) != RESET)
{
if(Usart1.tran_pos < Usart1.tran_len)
{
assert_param(IS_USART_ALL_PERIPH(USART1));
assert_param(IS_USART_DATA(Usart1.tran_buf[Usart1.tran_pos]));
USART1->DAT = Usart1.tran_buf[Usart1.tran_pos];
Usart1.tran_pos++;
}
else
{
Usart1.tran_pos = 0;
Usart1.tran_len = 0;
Usart1.tran_enable = 1;
//USART_ConfigInt(USART1, USART_INT_TXC, DISABLE);
USART_ConfigInt(USART1, USART_INT_TXDE, DISABLE);
}
}
}
|