嵌入式技术william hill官网
直播中

siyugege

8年用户 765经验值
擅长:可编程逻辑
私信 关注
[问答]

请问有办法处理NANO3.15进入串口错误回调函数的吗

STM32F767 HAL库

裸机跑没有问题。

加入NANO 3.15 后 ,进入错误中断不做处理也会进入到硬件中断中

msh中提示的报警信息

debug中无法调试,进入错误回调后单步运行都只会在几个汇编命令之间跳转

psr: 0x01000036

r00: 0x00000003

r01: 0x20009838

r02: 0x00000183

r03: 0x00000000

r04: 0x0800046d

r05: 0x08017380

r06: 0x0801761d

r07: 0xdeadbeef

r08: 0xdeadbeef

r09: 0xdeadbeef

r10: 0xdeadbeef

r11: 0xdeadbeef

r12: 0x00000000

lr: 0x0800062b

pc: 0x080006e4

hard fault on handler

debug event

错误处 汇编地址代码:0x080006e4

0x080006E4 BEAB BKPT 0xAB

0x080006E6 BD08 POP {r3,pc}

0x080006E8 4901 LDR r1,[pc,#4] ; @0x080006F0

0x080006EA 2018 MOVS r0,#0x18

0x080006EC BEAB BKPT 0xAB

0x080006EE E7FE B 0x080006EE

0x080006F0 0026 DCW 0x0026

0x080006F2 0002 DCW 0x0002

0x080006F4 4800 LDR r0,[pc,#0] ; @0x080006F8

0x080006F6 4770 BX lr

0x080006F8 0070 DCW 0x0070

0x080006FA 2000 DCW 0x2000

0x080006FC 4800 LDR r0,[pc,#0] ; @0x08000700

0x080006FE 4770 BX lr

0x08000700 0070 DCW 0x0070

0x08000702 2000 DCW 0x2000

0x08000704 B510 PUSH {r4,lr}

0x08000706 F000F85F BL.W 0x080007C8 __rt_SIGABRT_inner

0x0800070A E8BD4010 POP {r4,lr}

0x0800070E F000B856 B.W 0x080007BE __sig_exit

__aeabi_memclr4:

请问有办法处理错误回调函数吗

这是HAL库的处理问题,还是NANO中要怎么操作进行处理。

我是想串口错误后发出灯闪烁报警。

如下串口错误回调函数代码

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)

{

/* Prevent unused argument(s) compilation warning */

UNUSED(huart);

/* NOTE : This function should not be modified, when the callback is
needed,

the HAL_UART_ErrorCallback can be implemented in the user file.

不要在回调函数中重启,若一直发送错误波特率进入函数会卡死,导致看门狗复位

*/

// if((huart->ErrorCode & HAL_UART_ERROR_ORE) != 0U)

// if((huart->ErrorCode & HAL_UART_ERROR_FE) != 0U)

// if((huart->ErrorCode & HAL_UART_ERROR_NE) != 0U)

if(huart == &huart1)

{

uart1_error.ErrorCode = huart->ErrorCode;

uart1_error.Flag = 1;

// SERIAL1_SET;//mb发送串口1异常

}

if(huart == &huart2)

{

uart2_error.ErrorCode = huart->ErrorCode;

uart2_error.Flag = 1;

// SERIAL2_SET;//mb发送串口2异常

}

Use_Led_Setmode(2); //两闪两灭 提示串口挂掉

}

回帖(3)

王波

2022-9-7 10:55:03
会不会是有什么没处理导致的,或者那个中断里面有问题导致的,可以根据那个地址,去.map文件中查看一下是哪个地方异常了,或者断点调试一下。
举报

siyugege

2022-9-7 10:55:20
找了一下,发现是一直进入BKPT 0xAB
网上查了一下是printf用法有问题,添加了

/* ------------------通过重定向将printf函数映射到串口1上-------------------*/
#if !defined(__MICROLIB)
//#pragma import(__use_no_semihosting)
__asm (".global __use_no_semihostingnt");
void _sys_exit(int x) //避免使用半主机模式
{
  x = x;
}
//__use_no_semihosting was requested, but _ttywrch was
void _ttywrch(int ch)
{
    ch = ch;
}
struct __FILE
{
  int handle;
};
FILE __stdout;
#endif
#if defined ( __GNUC__ ) && !defined (__clang__)
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
//PUTCHAR_PROTOTYPE
//{
//  /* 实现串口发送一个字节数据的函数 */
//  //serial_write(&serial1, (uint8_t)ch); //发送一个自己的数据到串口
//    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
//  return ch;
//}
然后再编译运行,进入串口错误中断后的错误不一样了。

psr: 0x21000236
r00: 0x53203d3d
r01: 0x525f4554
r02: 0x53203d3d
r03: 0x525f4554
r04: 0x53203d3d
r05: 0x53203d3d
r06: 0x0800c4c7
r07: 0x20005914
r08: 0x2000a260
r09: 0xdeadbeef
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x0800583b
lr: 0x08000467
pc: 0x08000498
hard fault on handler
bus fault:
SCB_CFSR_BFSR:0x82 PRECISERR SCB->BFAR:525F4554
map文件应该是这两个函数

    __assert                                 0x08000411   Thumb Code     0  assert.o(.text)
    strstr                                   0x08000491   Thumb Code    36  strstr.o(.text)
汇编代码

0x080004B4 B510      PUSH          {r4,lr}
0x08000498 F8134B01  LDRB          r4,[r3],#0x01
举报

siyugege

2022-9-7 10:55:27
注释用到strstr的函数,再运行。
错误的函数在这里,我没有用到这个strlen函数。
搜索了一下,都是finsh的文件再使用的

    __assert                                 0x08000411   Thumb Code     0  assert.o(.text)
    strlen                                   0x08000491   Thumb Code    62  strlen.o(.text)
    strncmp                                  0x080004cf   Thumb Code   150  strncmp
举报

更多回帖

发帖
×
20
完善资料,
赚取积分