
STM32的低功耗模式
STM32F103C8T6 TIM1 CH2输入捕获触发DMA的问题
四轴飞行器
不清楚为什么正点原子的例程,想添加SCB添加到watch1却是无效的(在core_cm3.h定义的寄存器都不可以),但是可以添加GPIOA并且有效(stm32f10x.h定义的寄存器都可以)
不知道为什么用正点原子的开源例程硬件仿真时。想观察寄存器的值,所以添加到watch1观察,不清楚为啥SCB,NVTC等都添加了但是无效,但是GPIOA却又可以。
TouchGFX
STM32的上电启动过程
STM32中如何实现数据加密
STM32的I2S外设
为何Tim2自动装载定时的首次中断时间总是设定时间的2倍?
如果数据是局部变量,部分将堆栈适当调大点;
再就是注意数据访问时别越界了,注意数组边界和指针的有效性;
你可以把代码贴出来,这种发送时阻塞式发送的,应该不会进MemManage_Handler中断的
strcpy((char )g_ucCatStrBuff,"{'i':'"); for(i=0;i<24;i++) { uiD = 1<<i; if((g_uiLedDrv&uiD)==0) { strcat((char )g_ucCatStrBuff,"2");
} else { strcat((char )g_ucCatStrBuff,"1");
} } ProFun_Reback_Fun("1"); strcpy((char )g_ucCatSendTBuff,cSendHead); strcat((char )g_ucCatSendTBuff,cSendTopic1);
strcat((char )g_ucCatSendTBuff,(char)g_ucCatStrBuff);
strcat((char )g_ucCatSendTBuff,cSendEnd);
// strcpy((char )g_ucCatSendTBuff,cSendHead);//-----------test Cat_Send_Str((char )g_ucCatSendTBuff);
把Cat_Send_Str((char *)g_ucCatSendTBuff);这句去掉就不会出现异常中断,把g_ucCatSendTBuff 长度变小 也不会
void Cat_Send_Str(char *pStr) { unsigned short int usLen; unsigned short int i;
usLen = strlen(pStr);
for(i=0;i<usLen;i++) { g_ucCatSendBuff[i] = ((unsigned char )pStr+i); } g_ucCatSendBuff[usLen] = 0x0D; g_ucCatSendBuff[usLen+1] = 0x0a;
Cat_Send_Data(g_ucCatSendBuff,usLen+2); }
void Cat_Send_Data(unsigned char *p, unsigned short int len) { unsigned int usLen;
usLen = len<<4; HAL_UART_Transmit(&huart1, p,len,usLen);
}
strcpy((char )g_ucCatSendTBuff,cSendHead); strcat((char )g_ucCatSendTBuff,cSendTopic1);
strcat((char )g_ucCatSendTBuff,(char)g_ucCatStrBuff);
strcat((char *)g_ucCatSendTBuff,cSendEnd);
// strcpy((char )g_ucCatSendTBuff,cSendHead);//-----------test Cat_Send_Str((char )g_ucCatSendTBuff);
把Cat_Send_Str这条语句去掉就不会进入异常中断, 而且把g_ucCatSendTBuff的长度变短也不会进入异常中断
/****
**/ void Cat_Send_Str(char *pStr) { unsigned short int usLen; unsigned short int i;
usLen = strlen(pStr);
for(i=0;i<usLen;i++) { g_ucCatSendBuff[i] = ((unsigned char )pStr+i); } g_ucCatSendBuff[usLen] = 0x0D; g_ucCatSendBuff[usLen+1] = 0x0a;
Cat_Send_Data(g_ucCatSendBuff,usLen+2); }
//**** // shanghai gankun // www.sensorground.com //designed by hank //All rights reserved //ÐÞ¸ÄÈÕÆÚ:2014/5/2 //°æ±¾£ºV1.0 //**** void Cat_Send_Data(unsigned char *p, unsigned short int len) { unsigned int usLen;
usLen = len<<4; HAL_UART_Transmit(&huart1, p,len,usLen);
}
多谢!最开始我也怀疑是数据越界,但是我用 R13 看是从那里跳到 异常中断的,尽然是定时器中断,
我把栈堆放大试一下
我数据都是全局变量,而且进入HAL_UART_Transmit 函数单步走就没事,直接运行就不行,我单独做了一个测试程序,直接发送大批量数据也没问题,真不知道问题出在那里
strcpy((char )g_ucCatSendTBuff,"hello"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait");
strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char )g_ucCatSendTBuff,"waitwaitwait"); strcat((char )g_ucCatSendTBuff,"123456789");
strcat((char *)g_ucCatSendTBuff,"waitwaitwait");
// strcpy((char )g_ucCatSendTBuff,cSendHead);//-----------test
Cat_Send_Str((char )g_ucCatSendTBuff);
[md]修改栈堆大小也不行
是其他地方内存越界了,谢谢!