- 2024-12-20
-
回复了主题帖:
STM32 BOOT跳转到APP后部分功能失效,1个外部中断口无法进入,另1个外部中断正常
freebsder 发表于 2024-12-20 16:59
是不是选错型号然后flash超了,遇到过类似的,有些功能不调用就没问题,一调用就挂。
不是的,去掉地址偏移后都是正常的。
已解决,答案在10楼
-
回复了主题帖:
STM32 BOOT跳转到APP后部分功能失效,1个外部中断口无法进入,另1个外部中断正常
问题已解决,跳转前注意开启总中断,至于为什么产生这个问题还是不懂。。。只能说结果正常了。
解决办法具体可查看:
INTX_DISABLE();
HAL_Init();
HAL_RCC_DeInit();
HAL_DeInit();//不加此句时,CAN4_INT关闭会导致卡死
__set_PRIMASK(0);//开启总中断,不加此句可能导致外部中断无法进入
__set_CONTROL(0);
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Running_A/article/details/128675454
-
回复了主题帖:
STM32 BOOT跳转到APP后部分功能失效,1个外部中断口无法进入,另1个外部中断正常
秦天qintian0303 发表于 2024-12-16 09:16
非常有可能这种直接寄存器跳转的语句直接被优化不执行了,这样程序就有可能乱了
实测这个问题跟优化没什么关系,不让优化问题还是存在。
- 2024-12-17
-
回复了主题帖:
STM32 BOOT跳转到APP后部分功能失效,1个外部中断口无法进入,另1个外部中断正常
秦天qintian0303 发表于 2024-12-16 09:16
非常有可能这种直接寄存器跳转的语句直接被优化不执行了,这样程序就有可能乱了
收到,感谢回复,我试试不让优化
-
回复了主题帖:
STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS
龙千校 发表于 2024-12-16 15:12
楼主还在处理吗?最近做OTA功能也遇到异常,APP程序里写每3分钟触发独立看门狗复位,基本上一两天就能有异常复 ...
还在处理,一直没解决。。。。我现在跳转都是对的,只是进入APP后莫名其妙错误。前天为了测试外部中断不响应的问题,把一个外部中断接口改为普通开关量输入后,竟然APP初始化完成后死掉了,应该是死在中断里了。
- 2024-12-15
-
回复了主题帖:
STM32 BOOT跳转到APP后部分功能失效,1个外部中断口无法进入,另1个外部中断正常
秦天qintian0303 发表于 2024-12-15 00:00
功能失效?会不会有部分代码被优化了?
关键是同样的设置,把APP的跳转功能去掉,功能马上恢复正常。实测就是中断进不去,我用程序轮询的方式替换中断,SPI_CAN的数据也能获取,只是轮询的太慢会丢数据。
- 2024-12-14
-
回复了主题帖:
STM32 BOOT跳转到APP后部分功能失效,1个外部中断口无法进入,另1个外部中断正常
jobszheng5 发表于 2024-12-14 18:24
跳转只是跳转。不会影响其它功能
但实际情况确实是改为APP就不行,改回来立刻恢复。差别就是main开头加地址偏移,设置里也改一下0x8000000那个。很奇怪的东西
-
回复了主题帖:
现在用STM32的还多吗?
论稳定还得是ST啊,用过国产的几个牌子,确实还是有差距,比如AC7811,宣称车规级,这个STLINK下载很不稳定,还得接上下拉电阻,而且杜邦线稍微长一点就得费,浪费了我很多时间。还有些其他恶心的问题记不太清了。
还有个牌子,正常用端口就坏了,疑似静电打坏,关键实际使用中是带着外壳的,手接触不到线路。
-
发表了主题帖:
STM32 BOOT跳转到APP后部分功能失效,1个外部中断口无法进入,另1个外部中断正常
本帖最后由 liyancao001 于 2024-12-14 11:03 编辑
现象:
芯片是STM32F767ZGT6,电路包含3路SPICAN功能,实际使用了CAN4和CAN5, 没有使用APP(即没有向量便宜和设置偏移)时功能正常,改为APP后CAN5收不到数据了。
使用了STM32CUBE生成的FreeRTOS。
//PD6是CAN4 INIT
//PB8是CAN5 INIT
//PC9是CAN6 INIT
大概原理:
SPICAN芯片有INIT针脚,单片机用外部中断检测这个针脚如果出现下降沿则使用SPI读取芯片内的CAN数据。
主要代码:
初始化:
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = SPI_INT_CAN4_Pin;
//GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(SPI_INT_CAN4_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = SPI_INT_CAN5_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(SPI_INT_CAN5_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = SPI_NSS_CAN5_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(SPI_NSS_CAN5_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
中断处理:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case GPIO_PIN_6: //CAN4 PD6
CAN4_R_Deal();
break;
case GPIO_PIN_8://CAN5 PB8
CAN5_R_Deal();
break;
case GPIO_PIN_9://CAN6 PC9
CAN6_R_Deal();
break;
default:break;
}
}
分析:
CAN4功能正常,CAN5收不到数据,INIT都是用的EXTI9_5_IRQn,每个CANx_R_Deal()里都有个变量计数进入中断的次数。
而CAN5中断进入次数的变量一直为1.等于上电后还进了一次。
另外我串口打印了CAN5 INIT的状态,发现一直是低电平的,那就是说数据是到了的,但中断没有进入导致CAN5数据没有提取
关键不用APP时CAN5中断可以正常进入。。这啥情况,其他还用了不少功能暂时没发现异常。
此外:
我把CAN4的端口配置从外部中断改为普通开关输入,结果发现中断还是正常的,还能收到数据,这又啥情况,我还特意重新整体编译了一下,也还正常。。。
GPIO_InitStruct.Mode = GPIO_MODE_INPUT
补充内容 (2024-12-17 12:01):
前天又做了个测试,把CAN4对应的中断口从CUBE中改为了开关量输入,结果APP初始化完成后就卡死了。。以前BOOT有问题时也出现过,应该是中断后死掉了。
补充内容 (2024-12-20 17:05):
问题已解决,解决方法在10楼,有没有其他BUG有待验证
- 2024-12-04
-
回复了主题帖:
STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS
hello_mcu 发表于 2024-11-27 08:51
我也是搜了,看到别人这么解决的,至于为什么,也不懂。希望有大佬看到了,给解答下。
试了几天发现还有BUG,电路用了3个SPI扩展的CAN芯片,实际应用中有2路CAN接了设备,结果有一路正常,另一路接收不到数据,但是只要把APP程序的地址偏移等去掉,扩展CAN就正常,改为APP就不行,关键APP里其他的功能都还是正常的。。。
扩展CAN是初始化以后,如果有新的CAN数据到来,则在芯片端口产生边沿跳变,然后STM32采用外部中断监测这个跳变后读取寄存器数据的,实际监测只有开始进了一次中断,后面就进不去了。。。
还不知道这个APP里会不会还有其他BUG。。。
- 2024-11-26
-
回复了主题帖:
STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS
hello_mcu 发表于 2024-11-26 14:30
试试加上这么一句呢,其他看上去都一样。
通了,实测跳转前不能重新开中断。为啥通的也没搞懂,只需要三句话:
HAL_Init();
INTX_DISABLE();
__set_CONTROL(0);
-
回复了主题帖:
STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS
wangerxian 发表于 2024-11-26 14:12
串口和FreeRTOS有冲突?
串口只是个通讯方式,跟系统应该没关系。我的BOOT也用的freertos,也是能接收app并跳转的。 难道是堆栈之类的问题?这个会产生这种问题吗?
-
回复了主题帖:
STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS
hello_mcu 发表于 2024-11-26 14:30
试试加上这么一句呢,其他看上去都一样。
这句加上试了,还加了别的,最终就是没有freertos的app运行正常,加了freertos的卡在初始化里。关键加了freertos的app程序去掉偏移等单独运行也是正常的。
-
回复了主题帖:
STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS
qzc飘曳 发表于 2024-11-26 09:21
FREERTOS现在用的还是挺多的,不过MCU还是喜欢裸开发
外设少的话裸机开发更直观,但是外设多的话还是用系统好,
- 2024-11-25
-
发表了主题帖:
STM32 BOOT跳转到APP后初始化完后成死机 用了FREERTOS
本帖最后由 liyancao001 于 2024-11-26 15:57 编辑
芯片时STM32F767ZGT6,以前同样芯片的另一个板子做过CAN的IAP,是测试通了的,现在又不行了。。
使用STM32CUBEMX建的工程,BOOT和APP都是用了FREERTOS,然后跳转到APP是正常的,但是死在MX_FREERTOS_Init();
求指点啊,之前做过CAN的IAP,运行正常,现在弄串口结果不行了。。。
我在MX_FREERTOS_Init();里面加了串口打印,函数下面也加了,发现里面需要打印的数据都是输出正常的,但是到函数下面就不行了。
MX_FREERTOS_Init();//这个函数体里面的最后加了一句串口打印,打印是正常的。。
printf("ADECU_APP_2,0x%X\r\n",SCB->VTOR);//这句一直打印不出来。
/* Start scheduler */
osKernelStart();
其中BOOT跳转前把中断也都关了
APP相比没做IAP之前,就增加了2项:(没做IAP之前程序运行正常)
1)MAIN开头的中断向量偏移
int main(void)
{
/* USER CODE BEGIN 1 */
SCB->VTOR = FLASH_BASE | 0x80000;//设置偏移量
2)option for target里把IROM1的起始地址改为了0x8080000,start改为了0x40000
而BOOT跳转函数如下:
void iap_load_app(uint32_t appxaddr)// 调用时参数为0x08080000
{
if(((*(vu32*)appxaddr)&0x2FF00000)==0x20000000) { //检查栈顶地址是否合法.
HAL_RCC_DeInit();
INTX_DISABLE();
SysTick->CTRL = 0X00;//卡死后新增的,但是没有用,跟上面应该是功能重复的
SysTick->LOAD = 0;//卡死后新增的,但是没有用,跟上面应该是功能重复的
SysTick->VAL = 0;//卡死后新增的,但是没有用,跟上面应该是功能重复的
__disable_irq();//卡死后新增的,但是没有用,跟上面应该是功能重复的
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
}
}
241126上午又做了一些测试:
改了一版APP程序,把FREERTOS给关掉了,其他程序给屏蔽了,WHILE主循环只保留两个功能:
1)延时并且打印999,
2)查询1ms定时器累加变量值,超过1000则清零并打印888.
结果实测只打印了999,没有打印888,因此就是中断没有打开,所以BOOT的程序不能只关不开?
于是重新改写BOOT程序:
HAL_Init();
INTX_DISABLE();
/* 关闭所有中断,清除所有中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
__set_PRIMASK(0);//开启总中断
__set_CONTROL(0);
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app(); //跳转到APP.
结果:
999和888都打印正常了。。。于是乎很高兴的回到原始APP(有freertos)中。发现跳转过去立刻死掉。。。悲剧了
用在线调试查看死掉的位置,发现卡在SPI_WaitFifoStateUntilTimeout中,一直等待flag。
于是乎把SPI的几个初始化都注释掉,发现又一直卡在__HAL_TIM_GET_FLAG里,等于定时器初始化一直没过。倒是没有进硬件错误。
简单来说BOOT最后把中断关了的话APP里初始化正常,不是进不去中断,而BOOT最后把中断打开的话APP连初始化都过不了。
不明白原因,然后把APP的偏移和option for target都去掉,回归普通的程序,下载程序发现freertos中任务里串口1s间隔打印的数据都是正常的。
更迷糊了,我这问题到底是出在BOOT上还是APP上。。。
APP必须自己开中断吗?以前做CAN刷写时,BOOT只用以下语句:
HAL_RCC_DeInit();
INTX_DISABLE();
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
jump2app();
而APP也不用管开中断的事。。
- 2024-07-19
-
回复了主题帖:
请教下,天线A的方向图里有B,但是天线B的方向图里没有A,这样通讯是什么结果?
maychang 发表于 2024-7-19 10:07
在12楼我说人眼是指向性很强的接收天线。补充一句:人眼加上望远镜,是指向性更强的接收天线。天文望远镜, ...
谢谢回复,那么话又说回来,像我这个现象,A收不到B,B能收到A,而B的增益比A的大,那可不可以推测他们的方向图是上面这个情况呢?两端用的同样的433M LORA模块。
这个发射天线与接收天线的原理是一样的吗?如果我单独做一个发射天线,单独一个接收天线,按照目前的技术理论, 做出来的天线会一模一样吗?
-
回复了主题帖:
请教下,天线A的方向图里有B,但是天线B的方向图里没有A,这样通讯是什么结果?
maychang 发表于 2024-7-18 21:51
【原理上说不应该只要有足够强的信号到天线B上,天线B就应该接收到吗?】
如果天线B是无指向性的,那 ...
如果B有指向性就收不到A的信号吗?能不能接受到信号取决于什么呢?按我的理解应该是接收角度和到B位置上的信号强度吧,接收角度影响着接收效率?比如B最小接收信号的强度是20,而某个接收角度可能导致过来的信号只有一定比例被接收到(比如说50%),而天线A到B位置的信号强度是100,也就是说B实际接收到100*50%=50的信号,大于20,那么B一定会接受成功的吧?
- 2024-07-18
-
回复了主题帖:
请教下,天线A的方向图里有B,但是天线B的方向图里没有A,这样通讯是什么结果?
maychang 发表于 2024-7-18 18:48
所谓天线的方向图,是指天线在各个方向上的增益。同一天线,发射和接收的方向图是一样的,即在某方向上发 ...
如果天线A和B都垂直在一个平面上,但是天线A的增益大,方向图最远1000m,而天线B的增益小角度大,方向图最远600m,而A和B相距800m,也就是说天线B的方向图里没有A,按照你说的那个B收不到A的信号吗?原理上说不应该只要有足够强的信号到天线B上,天线B就应该接收到吗?而且A和B是垂直在一个平面的,也就是说B对于A这个方向的信号粗略的讲是可以100%接收的吧?
-
回复了主题帖:
请教下,天线A的方向图里有B,但是天线B的方向图里没有A,这样通讯是什么结果?
maychang 发表于 2024-7-18 18:22
【天线A的方向图里有B,但是天线B的方向图里没有A,这样是B能收到A的数据,但是A收不到B的数据吗?】
很 ...
这是为什么呢?这个方向图对于自己的接收也有关系吗?我以为只要接收端天线只要有足够的接收面积就应该能收到信号?我现在实测LORA模块,一端用了个15DBI的剑形天线,一端用了35DBI的吸盘天线,结果距离稍微拉远一点后吸盘天线接收正常,但返回的数据剑形天线接收不到。这个大概是什么原因呢?
-
发表了主题帖:
请教下,天线A的方向图里有B,但是天线B的方向图里没有A,这样通讯是什么结果?
本帖最后由 liyancao001 于 2024-7-18 21:18 编辑
天线A的方向图里有B,但是天线B的方向图里没有A,这样是B能收到A的数据,但是A收不到B的数据吗?
看到很多资料都是在介绍发射端的方向图、阵子之类的知识,但是这个接收端有什么讲究吗?是接收端天线只要在发射端天线的方向图里就一定能接收到数据吗?
有没有类似的资料啊?搜了半天没查到。
小白一枚,请各位指点。
想要接收天线更灵敏需要考虑什么呢?①天线接收面积越大应该效果越好吧,②跟增益有没有关系呢?增益应该只是涉及到发送时的方向图吧?