使用了DMA中断向窗口发送消息,将数据指针发送给窗体(大概20ms中断一次,把200个数据使用一个static全局数组暂存,消息指针指向这个数组,发送给窗口) 窗口接收消息后,绘画每80个数据画一个点 GRAPH_DATA_YT_AddValue(tmp_value); //tmp_value为static全局变量,用来累加数值,达到80个后求均再写入数据对象 波形可以正常显示,但连续写入四分钟左右后将会进入HardFault_Handler
调试进入HardFault_Handler前会进入到OSStartHang
代码如下:
界面创建时:
data = GRAPH_DATA_YT_Create(GUI_YELLOW, 231, YT_data, 0); //创建数据对象,data为static全局变量, YT_data为static I16 YT_data[231];
GRAPH_AttachData(hItem, data); //将数据对象加入波形图中
GRAPH_DATA_YT_SetAlign(data, GRAPH_ALIGN_LEFT); //波形从左出现
adc.c文件中
//DMA中断
void DMA2_Stream0_IRQHandler(void)
{
int i;
int j = 0;
int value = 0;
OSIntEnter(); //进入中断
msg.MsgId = WM_GET_ADC_VALUE; //msg为static全局变量
if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0)) //判断DMA传输完成中断
{
DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
//400个数据每两个压缩成一个
for(i=0; i<400; i++)
{
value += DMA_value;
if(i%2 == 1)
{
send_value[j++] = value / 2;
tmp_value = 0;
}
}
msg.Data.p = (const void *)send_value; //send_value为static全局变量,static uint16_t send_value[200] = {0};
WM_SendMessage(g_PWin[MAIN], &msg);
DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TC); //清除中断标志
}
OSIntExit(); //退出中断
}
//WM_GET_ADC_VALUE消息执行
value_data = (uint16_t *)pMsg->Data.p;
for(i=1; i<=200; i++)
{
count++; //计数值++
tmp_value += value_data[i-1]; // tmp_value为static变量。用于累加数值
if((count % 80) == 0)
{
tmp_value /= 80;
GRAPH_DATA_YT_AddValue(data, tmp_value);
}
}
|