社区
单片机/工控
帖子详情
stm32出现HardFault,应该怎么解决?
fangzhenga
2012-12-12 11:16:43
目前使用stm32f103vet6调试TFT触摸屏,用到了ucosII和ucGUI,ucosII只用了两个任务,问题是:通过调用ucGUI的创建对话框函数,使两个对话框交替重复进行创建、关闭,很有规律的重复7次左右就进入了HardFault,进入仿真调试,根据SP的内容得到LR的地址,再跳到该地址,黄色标识的那一行,这一行代表的是什么意思,怎么能看出错误是什么,为什么地址为0xc618c618,超出了RAM范围?程序没有进行优化,图片如下:
下面的图片是上面图片的部分截图,方便看清楚:
...全文
1281
11
打赏
收藏
stm32出现HardFault,应该怎么解决?
目前使用stm32f103vet6调试TFT触摸屏,用到了ucosII和ucGUI,ucosII只用了两个任务,问题是:通过调用ucGUI的创建对话框函数,使两个对话框交替重复进行创建、关闭,很有规律的重复7次左右就进入了HardFault,进入仿真调试,根据SP的内容得到LR的地址,再跳到该地址,黄色标识的那一行,这一行代表的是什么意思,怎么能看出错误是什么,为什么地址为0xc618c618,超出了RAM范围?程序没有进行优化,图片如下: 下面的图片是上面图片的部分截图,方便看清楚:
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
inurlcn
2013-01-22
打赏
举报
回复
F11是你最好的朋友
fangzhenga
2012-12-22
打赏
举报
回复
谢谢大家的帮助,我把对话框的内容调整了一下好了,至于什么原因还不清楚,求高人解答
woshi_ziyu
2012-12-13
打赏
举报
回复
贴的图没有用 已经进入到中断了 使两个对话框交替重复进行创建、关闭 ------- 贴一下你的代码
stm32 hard fault及堆栈探究
骁Captain
2012-12-13
打赏
举报
回复
访问越界的可能性大,检查下数组指针
net_friends
2012-12-13
打赏
举报
回复
焊接有问题、错误的接口配置过程、误写了FLASH,芯片杯具了 这些个情况,会进入这个中断
lbing7
2012-12-13
打赏
举报
回复
我还在,焊接有问题、错误的接口配置过程、误写了FLASH,芯片杯具了 这些个情况,会进入这个中断
Simality
2012-12-13
打赏
举报
回复
我脚着如果没有太硬的OS底子,这么漫无目的猜下去会很花时间。我有个辙你兴许可以试试。 找两个空闲IO口,写两端小语句用来分别翻转。比如这种: if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)) GPIO_ResetBits(GPIOx, GPIO_Pin); else GPIO_SetBits(GPIOx, GPIO_Pin); 做成一个函数也行,做成一个宏也可。 把第一个IO口的翻转语句放到HardFault代码里面,可以放在while(1)之前,也可以放在循环体中。用示波器监视这个脚,一旦进入HardFault,会观察到电平翻转。 把第二个IO口的翻转语句插入到你程序执行的必经之路上。用示波器的另一个通道监视它。 用第一个IO口的双沿做trigger,示波器的时间跨度稍微设置大一点。一旦进入HardFault,你应该观察到两个通道上都有脉冲翻转。 第二个IO口的翻转只要观察到一次,你就知道那个时刻程序走到那里了。你要做的事情是手动分析程序的流程,沿着程序接下来执行的顺序把那个翻转语句尽量向后移动,反复尝试。应该观察到示波器上两个通道的脉冲越来越近了。这个过程做好笔记。 直到两个脉冲几乎重合的时候,你就找到崩溃前的现场了。下次断点执行到这个位置,看看相关变量有没有可疑的情况。
cwlmxmz
2012-12-13
打赏
举报
回复
兄弟 我刚刚前面几天解决了这个问题 我的原因是在用消息队列的时候 定义的数组没有初始化 我猜你也是这个原因 还有就是看看你的堆栈的大小,堆栈太小也会出现这样的问题 最好把所有定义的变量指针数组都初始化,这样就不会出现问题了
Simality
2012-12-13
打赏
举报
回复
我所见到的HardFault错误几乎全都是因为朝不该写入的地址写了东西。指针未初始化或者指针赋值错误最容易造成这个现象。这个是直接原因。 但你上了OS,分析起来比较困难,需要对OS有足够的了解,知道这些内存操作的用意,以及可能出现的风险,这个我帮不了你。
fangzhenga
2012-12-13
打赏
举报
回复
void KO_DELAY_Callback(WM_MESSAGE * pMsg) { WM_HWIN hWin = pMsg->hWin; unsigned char i = 0; BUTTON_Handle Button_Handle_KO1[14] = {0}; switch (pMsg->MsgId) { case WM_INIT_DIALOG: /* 初始化对话框 */ /* 获得控件的句柄 */ //Text_Handle[0] = WM_GetDialogItem(hWin, MY_GUI_ID_TEXT0); /* 数值显示 */ Button_Handle_KO1[0] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON0); /* 按钮 1 */ Button_Handle_KO1[1] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON1); /* 按钮 2 */ Button_Handle_KO1[2] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON2); /* 按钮 3 */ Button_Handle_KO1[3] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON3); /* 按钮 4 */ Button_Handle_KO1[4] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON4); /* 按钮 5 */ Button_Handle_KO1[5] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON5); /* 按钮 6 */ Button_Handle_KO1[6] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON6); /* 按钮 7 */ Button_Handle_KO1[7] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON7); /* 按钮 8 */ Button_Handle_KO1[8] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON8); /* 按钮 9 */ Button_Handle_KO1[9] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON9); /* 按钮 0 */ Button_Handle_KO1[10] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON10); /* 按钮 . */ Button_Handle_KO1[11] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON11); /* 按钮 <- */ Button_Handle_KO1[12] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON12); /* 确定 按钮 */ Button_Handle_KO1[13] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON13); /* 退出 按钮 */ BUTTON_SetBkColor(Button_Handle_KO1[12], 0, GUI_GRAY); BUTTON_SetBkColor(Button_Handle_KO1[13], 0, GUI_GRAY); for (i = 0; i < 12; i++) /* 设置按钮字体 */ { BUTTON_SetFont(Button_Handle_KO1[i], &GUI_FontComic18B_1); } BUTTON_SetFont(Button_Handle_KO1[12], &GUI_Font8x8); BUTTON_SetFont(Button_Handle_KO1[13], &GUI_Font8x8); OSTimeDlyHMSM(0, 0, 0, 50); //TEXT_SetTextAlign(Text_Handle[0], TEXT_CF_LEFT); /* 设置文本对齐方式 */ //TEXT_SetFont(Text_Handle[0], &GUI_FontComic18B_1); /* 设置文本字体 */ //TEXT_SetTextPos(Text_Handle[0], 5, 0); /* 指定文本显示位置 */ //TEXT_SetText(Text_Handle[0], Inst_Prmt.KO1_Delay_Value); /* 显示文本框初始值 */ break; case WM_KEY: /* 对话框中的某一个按钮按下 */ switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) { case _KO1: KO_Flag = _KO1; // KO1 break; case _KO2: // KO2 KO_Flag = _KO2; break; case _KO3: // KO3 KO_Flag = _KO3; break; case _KO4: // KO4 KO_Flag = _KO4; break; case MY_GUI_ID_BUTTON0: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '1'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON1: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '2'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON2: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '3'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON3: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '4'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON4: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '5'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON5: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '6'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON6: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '7'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON7: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '8'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON8: if (Bit_count >=7) { break; } Edit_MidVariable[Bit_count++] = '9'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON9: if ((Bit_count >=7)) { break; } for (i =0; i < Bit_count; i++) { if (Edit_MidVariable[i]!='0') { break; } if (i == Bit_count - 1) { return; } } Edit_MidVariable[Bit_count++] = '0'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); Key_Flag = 1; break; case MY_GUI_ID_BUTTON10: if ((Bit_count >=7)) { break; } if (Bit_count == 0) { Bit_count = 1; Edit_MidVariable[0] = '0'; for (i = 1; i < 7; i++) { Edit_MidVariable[i] = '\0'; } } for (i = 0; i < 7; i++) { if (Edit_MidVariable[i] == '.') { return; } } Edit_MidVariable[Bit_count++] = '.'; Edit_MidVariable[7] = '\0'; EDIT_SetText(Edit_Handle[0], Edit_MidVariable); GUI_Exec(); break; case MY_GUI_ID_BUTTON11: //清除按钮 for (i = 0; i < 7; i++) { Edit_MidVariable[i] = '\0'; } Bit_count = 0; EDIT_SetText(Edit_Handle[0], "0"); GUI_Exec(); break; case MY_GUI_ID_BUTTON12: //确定按钮 if (Edit_MidVariable[Bit_count - 1] == '.') break; GUI_EndDialog(hWin, 1); GUI_EndDialog(Edit_Handle[0], 1); //WM_DeleteWindow(Edit_Handle[0]); if ((Key_Flag != 0) || (strcmp((const char*)Edit_MidVariable, "\0") != 0)) { switch (KO_Flag) { case _KO1: for (i = 0; i < 7; i++) { Inst_Prmt.KO1_Delay_Value[i] = Edit_MidVariable[i]; } break; case _KO2: for (i = 0; i < 7; i++) { Inst_Prmt.KO2_Delay_Value[i] = Edit_MidVariable[i]; } break; case _KO3: for (i = 0; i < 7; i++) { Inst_Prmt.KO3_Delay_Value[i] = Edit_MidVariable[i]; } break; case _KO4: for (i = 0; i < 7; i++) { Inst_Prmt.KO4_Delay_Value[i] = Edit_MidVariable[i]; } break; default: break; } for (i = 0; i < 7; i++) { Edit_MidVariable[i] = '\0'; } Bit_count = 0; Key_Flag = 0; } GUI_Exec(); break; case MY_GUI_ID_BUTTON13: //退出按钮 GUI_EndDialog(hWin, 1); GUI_EndDialog(Edit_Handle[0], 1); hWin = NULL; Edit_Handle[0] = NULL; //WM_DeleteWindow(Edit_Handle[0]); for (i = 0; i < 7; i++) { Edit_MidVariable[i] = '\0'; } Bit_count = 0; GUI_Exec(); break; default: break; } break; default: WM_DefaultProc(pMsg); } } 这是创建第一个对话框: if(!WM_IsWindow(hWin)) { WM_BringToTop(MI_Handle); //通过调试,此处必须添加该函数,对话框才显示在最顶端 hWin = GUI_CreateDialogBox(MO_Dialog_Create_TYPE, GUI_COUNTOF(MO_Dialog_Create_TYPE), MO_Type_Callback, 0, 100, 0); // 创建MI类型设置对话框 WM_BringToBottom(MI_Handle); //通过调试,此处必须添加该函数,对话框才显示在最顶端 GUI_Exec(); // 必须添加此函数,否则按钮不显示 } MO_Dialog_Deal(); 这是创建第二个对话框: if(!WM_IsWindow(hWin)) { WM_BringToTop(MI_Handle); //通过调试,此处必须添加该函数,对话框才显示在最顶端 hWin = GUI_CreateDialogBox(KO1_Dialog_Create_DELAY, GUI_COUNTOF(KO1_Dialog_Create_DELAY), KO_DELAY_Callback, 0, 65, 5); // 创建KO1延时对话框 Edit_Handle[0] = EDIT_Create(75, 25, 170, 20, MY_GUI_ID_EDIT0, 7, WM_CF_SHOW); if (Edit_Handle[0] == (EDIT_Handle)0) //如果创建编辑框不成功,重新创建 { Edit_Handle[0] = EDIT_Create(75, 25, 170, 20, MY_GUI_ID_EDIT0, 7, WM_CF_SHOW); } OSTimeDlyHMSM(0, 0, 0, 50); EDIT_SetText(Edit_Handle[0], Inst_Prmt.KO1_Delay_Value); GUI_SendKeyMsg(_KO1, 1); // 按下KO1选项 WM_BringToBottom(MI_Handle); //通过调试,此处必须添加该函数,对话框才显示在最顶端 GUI_Exec(); // 必须添加此函数,否则按钮不显示 } KO_Dialog_Deal(); 其中MO_Dialog_Deal(); KO_Dialog_Deal();这两个函数只是给对话框发送了触摸屏的信息,处理部分都在回调函数里面
fangzhenga
2012-12-13
打赏
举报
回复
下面是我的代码,由于代码很长,我把用到的程序贴出来,对话框只要交替重复创建、退出,重复7次左右就进入HardFault,希望各位大侠花宝贵的时间给小弟指点迷津: const GUI_WIDGET_CREATE_INFO MI_Dialog_Create_TYPE[] = { { FRAMEWIN_CreateIndirect, " MI-TYPE", 0, 0,0,95,240, FRAMEWIN_CF_MOVEABLE }, { CHECKBOX_CreateIndirect, NULL,MY_GUI_ID_CHECK0, 5,5,16,16 }, /* 0 0~5V复选框 */ { CHECKBOX_CreateIndirect, NULL,MY_GUI_ID_CHECK1, 5,31,16,16 }, /* 1 0~10V复选框 */ { CHECKBOX_CreateIndirect, NULL,MY_GUI_ID_CHECK2, 5,57,16,16 }, /* 2 0~1V复选框 */ { CHECKBOX_CreateIndirect, NULL,MY_GUI_ID_CHECK3, 5,83,16,16 }, /* 3 1~5V复选框 */ { CHECKBOX_CreateIndirect, NULL,MY_GUI_ID_CHECK4, 5,109,16,16 }, /* 4 4~20mA复选框 */ { CHECKBOX_CreateIndirect, NULL,MY_GUI_ID_CHECK5, 5,135,16,16 }, /* 5 0~10mA复选框 */ { CHECKBOX_CreateIndirect, NULL,MY_GUI_ID_CHECK6, 5,161,16,16 }, /* 6 0~1mA复选框 */ { TEXT_CreateIndirect, "0~5V",MY_GUI_ID_TEXT0, 26,5,60,16, TEXT_CF_HCENTER | TEXT_CF_VCENTER }, /* 7 0~5V */ { TEXT_CreateIndirect, "0~10V",MY_GUI_ID_TEXT1, 26,31,60,16, TEXT_CF_HCENTER | TEXT_CF_VCENTER }, /* 8 0~10V */ { TEXT_CreateIndirect, "0~1V",MY_GUI_ID_TEXT2, 26,57,60,16, TEXT_CF_HCENTER | TEXT_CF_VCENTER }, /* 9 0~1V */ { TEXT_CreateIndirect, "1~5V",MY_GUI_ID_TEXT3, 26,83,60,16, TEXT_CF_HCENTER | TEXT_CF_VCENTER }, /* 10 1~5V */ { TEXT_CreateIndirect, "4~20mA",MY_GUI_ID_TEXT4, 26,109,60,16, TEXT_CF_HCENTER | TEXT_CF_VCENTER }, /* 11 4~20mA */ { TEXT_CreateIndirect, "0~10mA",MY_GUI_ID_TEXT5, 26,135,60,16, TEXT_CF_HCENTER | TEXT_CF_VCENTER }, /* 12 0~10mA */ { TEXT_CreateIndirect, "0~1mA",MY_GUI_ID_TEXT6, 26,161,60,16, TEXT_CF_HCENTER | TEXT_CF_VCENTER }, /* 13 0~1mA */ { BUTTON_CreateIndirect,"YES",MY_GUI_ID_BUTTON0, 5,190,35,30 }, /* 14 确定 按钮 */ { BUTTON_CreateIndirect,"QUIT",MY_GUI_ID_BUTTON1, 50,190,35,30 } /* 15 退出 按钮 */ }; const GUI_WIDGET_CREATE_INFO KO1_Dialog_Create_DELAY[] = { { FRAMEWIN_CreateIndirect, " KO1-Keyboard", 0, 0,0,195,230, FRAMEWIN_CF_MOVEABLE }, { TEXT_CreateIndirect, NULL,MY_GUI_ID_TEXT0, 10,10,170,20, TEXT_CF_LEFT | TEXT_CF_BOTTOM}, /* 0 数值显示 */ { BUTTON_CreateIndirect,"1",MY_GUI_ID_BUTTON0, 10,45,35,30 }, /* 1 按钮 1 */ { BUTTON_CreateIndirect,"2",MY_GUI_ID_BUTTON1, 55,45,35,30 }, /* 2 按钮 2 */ { BUTTON_CreateIndirect,"3",MY_GUI_ID_BUTTON2, 100,45,35,30 }, /* 3 按钮 3 */ { BUTTON_CreateIndirect,"4",MY_GUI_ID_BUTTON3, 145,45,35,30 }, /* 4 按钮 4 */ { BUTTON_CreateIndirect,"5",MY_GUI_ID_BUTTON4, 10,85,35,30 }, /* 5 按钮 5 */ { BUTTON_CreateIndirect,"6",MY_GUI_ID_BUTTON5, 55,85,35,30 }, /* 6 按钮 6 */ { BUTTON_CreateIndirect,"7",MY_GUI_ID_BUTTON6, 100,85,35,30 }, /* 7 按钮 7 */ { BUTTON_CreateIndirect,"8",MY_GUI_ID_BUTTON7, 145,85,35,30 }, /* 8 按钮 8 */ { BUTTON_CreateIndirect,"9",MY_GUI_ID_BUTTON8, 10,125,35,30 }, /* 9 按钮 9 */ { BUTTON_CreateIndirect,"0",MY_GUI_ID_BUTTON9, 55,125,35,30 }, /* 10 按钮 0 */ { BUTTON_CreateIndirect,".",MY_GUI_ID_BUTTON10, 100,125,35,30 }, /* 11 按钮 . */ { BUTTON_CreateIndirect,"<-",MY_GUI_ID_BUTTON11,145,125,35,30 }, /* 12 按钮 <- */ { BUTTON_CreateIndirect,"YES",MY_GUI_ID_BUTTON12,40,170,45,40 }, /* 13 确定按钮 */ { BUTTON_CreateIndirect,"QUIT",MY_GUI_ID_BUTTON13,105,170,45,40 } /* 14 退出按钮 */ }; void MO_Type_Callback(WM_MESSAGE * pMsg) { WM_HWIN hWin = pMsg->hWin; unsigned char i = 0; switch (pMsg->MsgId) { case WM_INIT_DIALOG: /* 初始化对话框 */ /* 获得控件的句柄 */ Checkbox_Handle_Test[0] = WM_GetDialogItem(hWin, MY_GUI_ID_CHECK0); /* 0~5V */ Checkbox_Handle_Test[1] = WM_GetDialogItem(hWin, MY_GUI_ID_CHECK1); /* 0~10V */ Checkbox_Handle_Test[2] = WM_GetDialogItem(hWin, MY_GUI_ID_CHECK2); /* 1~5V */ Checkbox_Handle_Test[3] = WM_GetDialogItem(hWin, MY_GUI_ID_CHECK3); /* 0~10mA */ Checkbox_Handle_Test[4] = WM_GetDialogItem(hWin, MY_GUI_ID_CHECK4); /* 4~20mA */ Button_Handle_Test[0] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON0); /* 确定 按钮 */ Button_Handle_Test[1] = WM_GetDialogItem(hWin, MY_GUI_ID_BUTTON1); /* 退出 按钮 */ BUTTON_SetBkColor(Button_Handle_Test[0], 0, GUI_GRAY); BUTTON_SetBkColor(Button_Handle_Test[1], 0, GUI_GRAY); switch (Inst_Prmt.MO_Signal_Type) { case _0to5V: CHECKBOX_Check(Checkbox_Handle_Test[0]); /* 初始化选中该复选框 */ OSTimeDlyHMSM(0, 0, 0, 5); GUI_Exec(); break; case _0to10V: CHECKBOX_Check(Checkbox_Handle_Test[1]); OSTimeDlyHMSM(0, 0, 0, 5); GUI_Exec(); break; case _1to5V: CHECKBOX_Check(Checkbox_Handle_Test[2]); OSTimeDlyHMSM(0, 0, 0, 5); GUI_Exec(); break; case _0to10mA: CHECKBOX_Check(Checkbox_Handle_Test[3]); OSTimeDlyHMSM(0, 0, 0, 5); GUI_Exec(); break; case _4to20mA: CHECKBOX_Check(Checkbox_Handle_Test[4]); OSTimeDlyHMSM(0, 0, 0, 5); GUI_Exec(); break; default: break; } break; case WM_KEY: /* 对话框中的某一个按钮按下 */ switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) { case MY_GUI_ID_CHECK0: for (i = 0; i < 7; i++) { if ( CHECKBOX_IsChecked(Checkbox_Handle_Test[i]) ) { CHECKBOX_Uncheck(Checkbox_Handle_Test[i]); CHECKBOX_Check(Checkbox_Handle_Test[0]); GUI_Exec(); MO_TypeMidVariable = _0to5V; break; } } break; case MY_GUI_ID_CHECK1: for (i = 0; i < 7; i++) { if ( CHECKBOX_IsChecked(Checkbox_Handle_Test[i]) ) { CHECKBOX_Uncheck(Checkbox_Handle_Test[i]); CHECKBOX_Check(Checkbox_Handle_Test[1]); GUI_Exec(); MO_TypeMidVariable = _0to10V; break; } } break; case MY_GUI_ID_CHECK2: for (i = 0; i < 7; i++) { if ( CHECKBOX_IsChecked(Checkbox_Handle_Test[i]) ) { CHECKBOX_Uncheck(Checkbox_Handle_Test[i]); CHECKBOX_Check(Checkbox_Handle_Test[2]); GUI_Exec(); MO_TypeMidVariable = _1to5V; break; } } break; case MY_GUI_ID_CHECK3: for (i = 0; i < 7; i++) { if ( CHECKBOX_IsChecked(Checkbox_Handle_Test[i]) ) { CHECKBOX_Uncheck(Checkbox_Handle_Test[i]); CHECKBOX_Check(Checkbox_Handle_Test[3]); GUI_Exec(); MO_TypeMidVariable = _0to10mA; break; } } break; case MY_GUI_ID_CHECK4: for (i = 0; i < 7; i++) { if ( CHECKBOX_IsChecked(Checkbox_Handle_Test[i]) ) { CHECKBOX_Uncheck(Checkbox_Handle_Test[i]); CHECKBOX_Check(Checkbox_Handle_Test[4]); GUI_Exec(); MO_TypeMidVariable = _4to20mA; break; } } break; case MY_GUI_ID_BUTTON0: GUI_EndDialog(hWin, 1); if (0 != MO_TypeMidVariable) { Inst_Prmt.MO_Signal_Type = MO_TypeMidVariable; MO_TypeMidVariable = 0; } GUI_Exec(); break; case MY_GUI_ID_BUTTON1: GUI_EndDialog(hWin, 1); hWin = NULL; GUI_Exec(); break; default: break; } break; default: WM_DefaultProc(pMsg); } }
STM32
出现
Ha
rdF
ault
故障的
解决
方法
STM32
出现
Ha
rdF
ault
故障的
解决
方法
STM32
出现
Ha
rdF
ault
故障的
解决
方法.pdf
STM32
出现
Ha
rdF
ault
故障的
解决
方法.pdf
应对
STM32
MCU 硬件
Ha
rdF
ault
异常问题调试详解.docx
Ha
rd f
ault
(硬错误,也有译为硬件错误的)是在
STM32
上编写程序中常常产生的错误,造成
Ha
rd F
ault
错误的原因也是最为纷繁复杂的。本文详细介绍了产生该错误后的查找方法。
ARM内核单片机进入
ha
rdf
ault
的问题查找
在单片机进入
ha
rdf
ault
是非常常见的一个问题,对于新手来说这是最令人头疼的,对于ARM内核的不熟悉,但是查找问题变得很困难,希望这篇文章能
解决
你的问题
应用笔记LAT1340+
STM32
H5读取温度传感器校准值时进
Ha
rdF
ault
的原因分析
有客户反馈,在使用
STM32
H5 读取温度传感器校准值地址时,会进入
Ha
rdF
ault
,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入
Ha
rdF
ault
与 ICACHE 相关,如果直接关闭ICACHE 虽然可以
解决
进入
Ha
rdF
ault
的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。
单片机/工控
27,374
社区成员
28,770
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章