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有问题时也出现过,应该是中断后死掉了。
|