使用stm32裸机或者rtt系统遇到的坑

目录

一、rt-thread使用

16、LSE晶振初始化会出现一定的失败几率

15、串口队列溢出的问题

14、升级失败问题

13、rt-thread PWM1 CH1 CH1N 无法同时使用问题

12、使用换用c8芯片不能进入main函数,会出现HardFault的诊断错误

11、Fnction[rt_malloc] shall not be used in ISR

10、新建工程后,出现不能再次下载情况boot0置高。

9、移植后出现使能ping功能,现在是可以ping通,但是提示getaddinfo error。

8、F407制作软件包,修改#define STM32_SRAM_SIZE        (192)后直接死掉

7、UART 接受数据时出现HardFault,错误定位在crc校验。

6、使用指针未进行地址申请,造成野指针,非法访问

5、env给予空间不足;造成不能正确存储读取数据

4、线程调用其他函数,空间过小会死掉

3、can't find timer6 device!

2、网络下载文件失败显示数组或者内存不足

1、flash出现警告[Flash] Warning: Sector header check failed. Format this sector (0x00001000).

二、git使用

5、使用git  有的会出现不在本地分上。

4、如何使用git将分支branch合并到主干master上

①新建分支并切换

②切换到主干master

③合并某个分支到主干master

④合并后删除分支信息

3、本地git远程地址替换

2、warning: adding embedded git repository: git/

1、git log --graph --all查看所有分支的提交修改

四、cubemx

1、使用cubemx生成keil工程后,原有keil配置丢失

六、visual stdio code使用

2、vscode 不能跳转到指定函数,需要安装C/C++浏览插件

1、函数备注

使用libmodbus库过程中,用串口URAT4与UART3同样配置,3不能读取数据

rtt中断中不能使用malloc

段错误原因查找

keil

MDK调试进入B .挂起时可能出现的问题


一、rt-thread使用

18、h750,使用串口打印,或者其他,char类型数据会变成0xffffff,

现象:

1、使用串口打印,发哦送那个数据应该是char型,可是打印出来发现是short型,

2、使用qboot升级,写入qspi数据0x08000地址就会出现错误,变成0xffff8000,遇到0x8000,就会出现

暂时解决办法:发现的地方使用&ff,只取一个字节

17、H750使用qspi,配置正确但是不能使用问题。

现象:使用cubemx配置qspi,但是与芯片通信失败,

解决:cubemx配置引脚,默认是使用的事低速速率,需要把引脚速率配置高。

16、LSE晶振初始化会出现一定的失败几率

现象:不断按复位键会出现死掉的原因。死在晶振那里。过一会会进行重新启动。

20210907——也会出现开机启动慢,老是重启问题,原因工作环境恶略,造成串口受干扰,串口修改为下拉输入之后解决启动慢,重启问题。

调试界面出现移植操作r0寄存器

LSE那个确实是bug,
cube生成的代码是:
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI48
                              |RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
只要改成:
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 

改完就可以了

15、串口队列溢出的问题

[W/UART] Warning: There is no enough buffer for saving data, please increase the RT_SERIAL_RB_BUFSZ option.

线程优先级调高试试

其他线程影响了串口接收线程,或是中断影响了串口中断

14、升级失败问题

12988] W/UART: Warning: There is no enough buffer for saving data, please increase the RT_SERIAL_RB_BUFSZ option.

[218917] E/at.skt: AT socket (1) receive timeout (40000)!
[218931] I/http_ota: Download: 65|[=================================================================>                
[258943] E/at.skt: AT socket (1) receive timeout (40000)!
[258949] E/web: receive data timeout.
[258954] E/http_ota: Exit: server return err (-2)!
[259064] E/at.clnt: execute command (AT+CIPCLOSE=1) failed!

赋予空间不足,

13、rt-thread PWM1 CH1 CH1N 无法同时使用问题

现象:

原因:

解决办法:

static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration, rt_bool_t enable)
{
    /* Converts the channel number to the channel number of Hal library */
    rt_uint32_t channel = 0x04 * (configuration->channel - 1);

    if (!enable)
    {
        HAL_TIM_PWM_Stop(htim, channel);
        HAL_TIMEx_OCN_Stop(htim, channel);
    }
    else
    {
        HAL_TIM_PWM_Start(htim, channel);
        HAL_TIMEx_OCN_Start(htim, channel);     
    }

    return RT_EOK;
}

libraries\HAL_Drivers\drv_hwtimer.c(86): error:  #20: identifier "TIM1_CONFIG" is undefined

12、使用换用c8芯片不能进入main函数,会出现HardFault的诊断错误

现象:

原因:

解决办法:

原因上次使用的芯片ram空间64k这次的是20k

11、Fnction[rt_malloc] shall not be used in ISR

现象:

原因:

解决办法:

(0) assertion failed at function:rt_malloc, line number:280

 char *buf;
 buf = rt_malloc(64);

改为
 char buf[64];

10、新建工程后,出现不能再次下载情况boot0置高。

现象:

原因:

解决办法:

晶振配置错误

可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。

Main Flash memory

是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

System memory

从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:

Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader

Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中

Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动可以看到, 利用串口下载程序还是比较的麻烦, 需要跳帽跳来跳去的,非常的不注重用户体验。

9、移植后出现使能ping功能,现在是可以ping通,但是提示getaddinfo error。

现象:

原因:

解决办法:

8、F407制作软件包,修改#define STM32_SRAM_SIZE        (192)后直接死掉

现象:

原因:

解决办法:

程序卡在 rt_hw_hard_fault_exception函数里的while(1)循环,串口也没打印数据

修改为

#define STM32_SRAM_SIZE        (128)
#define STM32_SRAM_END         (0x20000000 + STM32_SRAM_SIZE * 1024)

F4 的 RAM 不是连续的,是 128 + 64 的,其中 64K 是专用 RAM

7、UART 接受数据时出现HardFault,错误定位在crc校验。

现象:

原因:

解决办法:

crc = Modbus_CRC16(&modbus.rcbuf[0],modbus.recount-2); 

modbus.recount= 0;

6、使用指针未进行地址申请,造成野指针,非法访问

5、env给予空间不足;造成不能正确存储读取数据

4、线程调用其他函数,空间过小会死掉

(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread) assertion failed at function:rt_thread_control, line number:626 

[5341] W/ParamMgr: set time:1610297162sec
msh />[5393] I/at.clnt: AT client(====>>rtc_set_timestamp Sun Jan 10 16:46:02 2021

 DmyStateSave.drug_reg.unit_type###0####
======>>rugprogress.step:0 
======>>myStateSave.drug_reg.drug_step:0
 1³õʼ»¯³É¹¦0####
V1.3.0) on device uart3 initialize success.
[6194] D/esp[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1314) Trigger a GC check after created ENV.
32: esp3[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1210) The remain empty sector is 1, GC threshold is 1.
2 device initialize start.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00000000
[6311] I/esp32: esp32 device wifi is disconnect.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00001000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00002000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00003000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00004000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00005000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (RptPeriod) from 0x00006581 to 0x00000010.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00006000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00007000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00008000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00009000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0000A000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0000B000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0000C000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0000D000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0000E000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (MediLog) from 0x0000FC61 to 0x00000033.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0000F000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00010000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00011000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00012000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00013000
[9131] I/esp32: esp32 device wifi is connected.
[9146] D/esp32: AT version:1.1.3.0(5a40576 - Nov 28 2018 12:50:55)
[9153] D/esp32: SDK version:v3.0.7
[9157] D/esp32: compile time:Dec 21 2018 09:04:56
[9162] D/esp32: Bin version:1.1.3(WROOM-32)
[9167] D/esp32: 
[Flash] (packages\EasyFlash-v4.1.0\src[9185] I/esp32: esp32 device wifi is disconnect.
\ef_env.c:1190) Collect a sector @0x00014000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (aliy_device_secret) from 0x00015C41 to 0x0000034E.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (aliy_device_name) from 0x00015C8B to 0x00000398.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (aliy_product_key) from 0x00015CC9 to 0x000003D6.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (updateurl) from 0x00015E72 to 0x00000409.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (getTime) from 0x00015ED1 to 0x00000468.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (DevStatDataSave) from 0x00015EFA to 0x00000491.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00015000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (MediParam) from 0x00016379 to 0x0000058C.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00016000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00018000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00019000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0001A000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0001B000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0001C000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0001D000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0001E000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0001F000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00020000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00021000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00022000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00023000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00024000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00025000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00026000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00027000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00028000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00029000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0002A000
[11381] I/esp32: esp32 device wifi is connected.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0002B000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0002C000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0002D000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0002E000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0002F000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00030000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00031000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00032000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00033000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00034000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00035000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00036000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00037000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00038000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x00039000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0003A000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0003B000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0003C000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0003D000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0003E000
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1126) Moved the ENV (__ver_num__) from 0x0003F033 to 0x000008F5.
[Flash] (packages\EasyFlash-v4.1.0\src\ef_env.c:1190) Collect a sector @0x0003F000
 2³õʼ»¯³É¹¦0####

 tid_process ok
 [13332] I/esp32: esp32 device network initialize successfully.
[13339] D/esp32: network interface device(esp32) set up status,esp32_netdev_set_up

[26269] I/proto: ==>>1036
========>>1610297183
[26275] D/proto: message size:94

3、can't find timer6 device!

现象:

原因:

解决办法:

解决添加配置:

2、网络下载文件失败显示数组或者内存不足

现象:获取链接后,显示没有足够空间接受数据。

原因:flash擦除消耗大量时间,造成数据存放出问题

方法:接收前提前擦出flash可以解决此问题;

Content(attachment;filename=update.img).glocation:(NULL)
http file_size:1024572
[46246] I/http_ota: Start erase flash (updisplay) partition!
[48742] E/at.skt.esp32: no memory receive buffer(29[48748] W/UART: Warning: There is no enough buffer for saving data, please increase the RT_SERIAL_RB_BUFSZ option.
20).
[49104] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[49359] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[49523] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[49779] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[49943] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[50153] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[50406] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[50573] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[50781] E/at.skt: No memory for receive packet table!
[50992] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[51201] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[51456] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[51620] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[51875] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[52039] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[52050] I/http_ota: Erase flash (updisplay) partition success!
[52058] E/http_ota: No memory for http ota!
[52165] E/at.clnt: AT create response object failed! No memory for response object!
[52175] E/at.skt.esp32: no memory for resp create.
[52248] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[52378] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[55186] E/at.skt.esp32: no memory receive buffer(2400).
[55650] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[55814] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[56067] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[56233] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[56442] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[56697] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[56861] E/at.clnt: read line failed. The line data length is out of buffer size(1024)!
[57072] E/at.skt.esp32: no memory receive buffer(2400).

1、flash出现警告[Flash] Warning: Sector header check failed. Format this sector (0x00001000).

[Flash] Warning: Sector header check failed. Format this sector (0x00001000).
[Flash] Warning: Sector header check failed. Format this sector (0x00002000).
[Flash] Warning: Sector header check failed. Format this sector (0x00003000).
[Flash] Warning: Sector header check failed. Format this sector (0x00004000).
[Flash] Warning: Sector header check failed. Format this sector (0x00005000).
[Flash] Warning: Sector header check failed. Format this sector (0x00006000).
[Flash] Warning: Sector header check failed. Format this sector (0x00007000).
[Flash] Warning: Sector header check failed. Format this sector (0x00008000).
[Flash] Warning: Sector header check failed. Format this sector (0x00009000).
[Flash] Warning: Sector header check failed. Format this sector (0x0000a000).
[Flash] Warning: Sector header check failed. Format this sector (0x0000b000).

二、git使用

5、使用git  有的会出现不在本地分上。

现象:

原因:

解决办法:

因此,我在存储库中做了一些工作,当我即将提交时,我意识到我目前不在任何分支上。

发生这种情况在使用子模块的时候很多,而且我可以解决这个问题,但是这个过程很乏味,我一直在想,必须有一个更简单的方法来做到这一点。

有没有一种简单的方法可以在保留更改的情况下恢复分支? 

解决方案

如果您还没有提交: 

 git stash     #存储
 git checkout  #某些分支
 git stash pop 
如果您已经提交并且没有改变任何内容:
 git log --oneline -n​​1#这会给你SHA 
 git checkout some-branch 
 git merge $ {如果你已经提交并完成了额外的工作:
 git stash 
 git log --oneline -n​​1#这会给你SHA 
 git checkout some-branch 
 git merge $ {commit-sha} 
 git stash pop 

4、如何使用git将分支branch合并到主干master上

①新建分支并切换

>>git chechout -b <branchName>

添加备注信息

开发完毕后需要在当前分支上提交修改后的文件,使用如下命令:

>>git add README.MD
>>git commit -m "备注信息"

②切换到主干master

使用如下命令从当前分支切换到主干master上:

git checkout master

③合并某个分支到主干master

使用如下命令合并分支:

>>git merge <branchName>

④合并后删除分支信息

使用如下命令删除分支:

>>git branch -d <branchName>

虽然前面我们删除了分支,但由于删除之前已经将其合并到master主干上,故其还保留在master中,使用checkout命令仍然可以签出相应的分支。

3、本地git远程地址替换

$ git remote -v
origin git@github.com:xxx/example.git (push)

重新制定项目git远程路径

重置当前项目的远程路径为target目标

$ git remote set-url origin git@git.xxx.com:xxx/example.git

确认是否更改成功

2、warning: adding embedded git repository: git/

当前目录下面有.git文件夹------默认是隐藏的,直接将.git文件夹掉,再重新git add .

则不再有报警提示,按正常的上传步骤上传代码即可。

1、git log --graph --all查看所有分支的提交修改

Please commit your changes or stash them before you switch branches.

四、cubemx

1、使用cubemx生成keil工程后,原有keil配置丢失

六、visual stdio code使用

2、vscode 不能跳转到指定函数,需要安装C/C++浏览插件

1、函数备注

/************************************************* 
Copyright (C), 1988-1999, Tech. Co., Ltd. 
File name: // 文件名 
Author:  
Version:  
Date: // 作者、版本及完成日期 
Description: // 用于详细说明此程序文件完成的主要功能,与其他模块 
// 或函数的接口,输出值、取值范围、含义及参数间的控 
// 制、顺序、独立或依赖等关系 
Others: // 其它内容的说明 
Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 
1. .... 
History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 
// 者及修改内容简述  
1. Date: 
Author: 
Modification: 
2. ... 
*************************************************/

使用libmodbus库过程中,用串口URAT4与UART3同样配置,3不能读取数据

这是什么原因

rtt中断中不能使用malloc

/************************************************* 
Date: 21/2/28 
Description: 对数组排序,去掉最大值与最小值,其余值
求平均为称重数据 
Value: 
Return:
*************************************************/ 
int my_get_weigh(void)
{
 int sum = 0;
int *weigh_drug_=RT_NULL;
weigh_drug_ = rt_malloc(sizeof(weigh_drug));

     for (int i = 0; i < VALUE_LEN - 1; i++) 
   { 
    weigh_drug_[i] = weigh_drug[i];
   }
    for (int i = 0; i < VALUE_LEN - 1; i++) 
   { 
        for (int j = 0; j < VALUE_LEN - 1 - i; j++) 
       {
            if (weigh_drug_[j] > weigh_drug_[j+1]) 
             {        // 相邻元素两两对比
                int temp = weigh_drug_[j+1];        // 元素交换
                weigh_drug_[j+1] = weigh_drug_[j];
                weigh_drug_[j] = temp;
             }
        }
    }
   for(int i = 1;i<VALUE_LEN-1;i++)
    {
         sum += weigh_drug_[i];
    }
rt_free(weigh_drug_);
 return sum/(VALUE_LEN-2);
}

段错误原因查找

psr: 0x0100000f
r00: 0x20002800
r01: 0x20007cc0
r02: 0x00000000
r03: 0x7fffffff
r04: 0x00000001
r05: 0x20007cac
r06: 0x20000118
r07: 0x00001150
r08: 0x00000001
r09: 0xdeadbeef
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x00000000
 lr: 0x08054d3f
 pc: 0x08050a96
hard fault on handler

bus fault:
SCB_CFSR_BFSR:0x04 IMPRECISERR 

1:内存溢出或则访问越界。

2:堆栈溢出。

发生异常后我们可以首先查看LR寄存器的值,确认当前使用的堆栈是MSP还是PSP,然后找到相对应的堆栈指针,并在内存中查看相对应堆栈的内容,内核将R0~R3,R12,LR,PC,XPRS寄存器依次入栈,其中LR即为发生异常前PC将要执行的下一条指令地址。

手把手教你查找stm32 HardFault_Handler调试及问题方法_u013184273的博客-CSDN博客_hardfault_handler 原因查找

STM32硬件错误HardFault_Handler的处理方法_anbaixiu的博客-CSDN博客

查一下 LR 寄存器地址,是哪一个函数。分析上函数前后有没有逻辑问题。

把栈空间放大试试看

keil

MDK调试进入B .挂起时可能出现的问题

中断没有找到。

总结:程序卡死在B.处,一般都是有中断没有处理,仔细检查下相关中断的配置和处理函数,找出错误即可。

keil空间不足

使用高优化等级

keil编译速度慢

去除编译信息

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值