497|11

111

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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有待验证
此帖出自stm32/stm8论坛

最新回复

是不是选错型号然后flash超了,遇到过类似的,有些功能不调用就没问题,一调用就挂。   详情 回复 发表于 2024-12-20 16:59
点赞 关注
 

回复
举报

685

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

跳转只是跳转。不会影响其它功能

此帖出自stm32/stm8论坛

点评

但实际情况确实是改为APP就不行,改回来立刻恢复。差别就是main开头加地址偏移,设置里也改一下0x8000000那个。很奇怪的东西  详情 回复 发表于 2024-12-14 21:03
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
jobszheng5 发表于 2024-12-14 18:24 跳转只是跳转。不会影响其它功能

但实际情况确实是改为APP就不行,改回来立刻恢复。差别就是main开头加地址偏移,设置里也改一下0x8000000那个。很奇怪的东西

此帖出自stm32/stm8论坛
 
 

回复

6534

帖子

9

TA的资源

版主

4
 

功能失效?会不会有部分代码被优化了?  

此帖出自stm32/stm8论坛

点评

关键是同样的设置,把APP的跳转功能去掉,功能马上恢复正常。实测就是中断进不去,我用程序轮询的方式替换中断,SPI_CAN的数据也能获取,只是轮询的太慢会丢数据。    详情 回复 发表于 2024-12-15 20:46
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

5
 
秦天qintian0303 发表于 2024-12-15 00:00 功能失效?会不会有部分代码被优化了?  

关键是同样的设置,把APP的跳转功能去掉,功能马上恢复正常。实测就是中断进不去,我用程序轮询的方式替换中断,SPI_CAN的数据也能获取,只是轮询的太慢会丢数据。

 

此帖出自stm32/stm8论坛

点评

非常有可能这种直接寄存器跳转的语句直接被优化不执行了,这样程序就有可能乱了  详情 回复 发表于 2024-12-16 09:16
你写的程序在编译器转换成机械码的时候会做优化,检查一下是不是这方面的问题,我优化选项改为不优化,看看你的IDE这个设置的位置在哪里  详情 回复 发表于 2024-12-16 09:15
 
 
 

回复

6534

帖子

9

TA的资源

版主

6
 
liyancao001 发表于 2024-12-15 20:46 关键是同样的设置,把APP的跳转功能去掉,功能马上恢复正常。实测就是中断进不去,我用程序轮询的方式替 ...

你写的程序在编译器转换成机械码的时候会做优化,检查一下是不是这方面的问题,我优化选项改为不优化,看看你的IDE这个设置的位置在哪里

此帖出自stm32/stm8论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

6534

帖子

9

TA的资源

版主

7
 
liyancao001 发表于 2024-12-15 20:46 关键是同样的设置,把APP的跳转功能去掉,功能马上恢复正常。实测就是中断进不去,我用程序轮询的方式替 ...

非常有可能这种直接寄存器跳转的语句直接被优化不执行了,这样程序就有可能乱了

此帖出自stm32/stm8论坛

点评

实测这个问题跟优化没什么关系,不让优化问题还是存在。  详情 回复 发表于 2024-12-20 14:13
收到,感谢回复,我试试不让优化  详情 回复 发表于 2024-12-17 11:59
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

8
 
秦天qintian0303 发表于 2024-12-16 09:16 非常有可能这种直接寄存器跳转的语句直接被优化不执行了,这样程序就有可能乱了

收到,感谢回复,我试试不让优化

此帖出自stm32/stm8论坛
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

9
 
秦天qintian0303 发表于 2024-12-16 09:16 非常有可能这种直接寄存器跳转的语句直接被优化不执行了,这样程序就有可能乱了

实测这个问题跟优化没什么关系,不让优化问题还是存在。

此帖出自stm32/stm8论坛
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

10
 

问题已解决,跳转前注意开启总中断,至于为什么产生这个问题还是不懂。。。只能说结果正常了。

解决办法具体可查看:

        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/stm8论坛
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

11
 

是不是选错型号然后flash超了,遇到过类似的,有些功能不调用就没问题,一调用就挂。

此帖出自stm32/stm8论坛

点评

不是的,去掉地址偏移后都是正常的。 已解决,答案在10楼  详情 回复 发表于 2024-12-20 17:06
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

12
 
freebsder 发表于 2024-12-20 16:59 是不是选错型号然后flash超了,遇到过类似的,有些功能不调用就没问题,一调用就挂。

不是的,去掉地址偏移后都是正常的。

已解决,答案在10楼

此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表