liyancao001

  • 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的数据吗? 看到很多资料都是在介绍发射端的方向图、阵子之类的知识,但是这个接收端有什么讲究吗?是接收端天线只要在发射端天线的方向图里就一定能接收到数据吗? 有没有类似的资料啊?搜了半天没查到。 小白一枚,请各位指点。   想要接收天线更灵敏需要考虑什么呢?①天线接收面积越大应该效果越好吧,②跟增益有没有关系呢?增益应该只是涉及到发送时的方向图吧?  

最近访客

< 1/1 >

统计信息

已有11人来访过

  • 芯积分:145
  • 好友:--
  • 主题:30
  • 回复:81

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言