STM32开发过程中碰到的问题总结 - 2


前言

记录下在使用STM32L4系列芯片进行开发时,碰到的各种问题,第二期。

比较杂。

1、Hex文件和Bin文件的区别

简单来说:Hex是由Intel制定的一种十六进制标准文件格式,是由编译器转换而成的一种用于下载带处理器里面的文件。

Hex文件格式是由一行一行的十六进制数据组成,每行包含:开始、长度、数据、类型、校验和等重要信息。

Hex文件是有一定格式的,==而Bin文件就是一种没有格式的程序文件,只是包含了程序数据。==所以,我们下载bin文件时需要指定起始地址,如果起始地址不对,你的程序就不能正常运行。

2. STM32的boot0 在0和1有什么区别

在STM32微控制器中,BOOT0引脚是用于启动模式选择的引脚之一。它与BOOT1引脚一起,用于选择芯片启动时的启动模式。在BOOT0引脚处于不同逻辑电平时,会选择不同的启动模式。

具体来说,在STM32微控制器中,BOOT0引脚在逻辑电平为0和1时的区别如下:

BOOT0引脚逻辑电平为0:

当BOOT0引脚被拉低时,微控制器将进入用户应用程序的执行模式。即微控制器将会从Flash存储器的用户代码区域启动执行用户编写的应用程序。

BOOT0引脚逻辑电平为1:
当BOOT0引脚被拉高时,微控制器将进入系统引导模式(System Boot Mode)。
在系统引导模式下,可以通过串行接口(如串行下载模式或串行编程模式)来进行固件更新、调试和启动加载等操作。

因此,BOOT0引脚的不同逻辑电平可以实现不同的启动模式选择,根据具体的需求和应用场景进行设置

3. keil下的translate和builder有什么区别

在这里插入图片描述

Translate是编译当前改动的源文件,在这个过程中检查语法错误。但并不生成可执行文件

Build是只编译工程中上次修改的文件及其它依赖于这些修改过的文件的模块,同时重新链接生成可执行文件。如果工程之前没编译链接过,它会直接调用Rebuild All。另外在技术文档中,Build实际上是指increase build,即增量编译。

Rebuild是不管工程的文件有没有编译过,会对工程中所有文件重新进行编译生成可执行文件,因此时间较长。

参考链接:https://blog.csdn.net/jays_/article/details/83022610

4. 为什么RTOS中区分中断内调用和中断外调用

实际上就这样想,本来RTOS有一个自己的调度流程,按照这个调度流程,基本上不会出现优先级反转,死锁等问题。但是当中断来了之后去调用RTOS的接口时,相当于脱离了RTOS自己的调度流程去执行RTOS的函数,这相当于脱离了RTOS的控制

禁止任务切换:
中断服务程序 (ISR) 执行时,系统处于中断被屏蔽状态,这意味着中断服务程序不能被更高优先级的中断打断。因此,在中断服务程序中,不允许使用会导致任务切换的函数,因为任务切换需要在系统可抢占状态下执行。

时间敏感性:
中断服务程序需要尽快完成其工作,因为它们可能会打断更低优先级的任务。因此,中断服务程序中使用的函数通常是非阻塞的,并且会尽可能快地完成其操作,以确保系统的响应性。

资源管理:
在中断上下文中,对资源的访问需要特别小心,以避免竞争条件和死锁。因此,FreeRTOS 提供了专门用于中断上下文中的函数,这些函数经过特殊设计,以确保在中断上下文中正确地与 FreeRTOS 内核进行交互,而不会引入潜在的问题。

5. STM32中中断内运行的代码应该注意哪些事项

在中断服务程序 (ISR) 中运行的代码需要特别注意以下几个方面:

执行时间:
中断服务程序需要尽可能快地执行完毕,以减少对系统响应时间的影响。长时间运行的中断服务程序会延迟系统对其他事件的响应,可能导致系统性能下降甚至丢失关键事件。

禁止阻塞:
中断服务程序中禁止使用会引起任务阻塞的函数。这是因为中断服务程序处于特殊的上下文中,无法像任务上下文那样进行任务切换和调度。因此,任何会导致阻塞的操作都应该避免,包括等待信号量、消息队列等。

保护临界区:
如果中断服务程序和任务共享某些共享资源,必须在访问这些资源时进行适当的保护,以避免竞态条件和数据损坏。通常会使用临界区保护机制,如禁用中断或使用信号量等。

避免递归和动态内存分配:
中断服务程序应该尽量简单和可预测。因此,应避免使用递归函数和动态内存分配,因为它们可能导致不确定的执行时间和系统行为。

合理选择中断优先级:
中断服务程序的优先级应该根据其紧迫性和重要性来选择。高优先级的中断服务程序可以打断低优先级的中断服务程序,因此必须谨慎选择中断优先级,以确保系统的响应性和稳定性。

注意嵌套中断:
如果系统支持嵌套中断,则必须谨慎处理嵌套中断的情况。在处理嵌套中断时,必须遵循适当的中断优先级和嵌套中断的规则,以避免优先级反转和其他问题。

6. STM32的定时器中断中 使用printf没有任何输出

STM32CubeMX生成的中断不能直接使用,
需要自己做两个东西

1、 使能HAL定时器

HAL_TIM_Base_Start_IT(&htim2)

2、实现回调函数
理论上来说这个里面应该要再加个htim是否为定时器2的判断

/**
  * @brief This function handles TIM2 global interrupt.
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  printf("HAL_TIM_PeriodElapsedCallback.\n");
  isr_handle();
}

7. 将makefile编译的工程移植到Keil5上后,提示编译不过

在这里插入图片描述
该文件已经加进来过了
在这里插入图片描述
提示 internal fault

在这里插入图片描述
最终修改编译优化等级解决了

参考链接:https://www.emdoor.cn/res/view/id/1166.html

8.warning #188-D enumerated type mixed with another type

在这里插入图片描述
Keil中编译的时候 枚举类型的初始化需要是真正的值,这里将ret = 0 去掉即可。

9. keil中的CMSIS目录下放置的都是什么?

在这里插入图片描述
当我加入了一个M33 内核的工程师,提示CMSIS出了问题,需要安装对应的pack包。

其实我一直疑惑这个pack包里面到底有什么?这个cmsis又是什么?

CMSIS(Cortex Microcontroller Software Interface Standard)
CMSIS 是一组软件接口,旨在提供一致的编程接口,以便在各种 ARM Cortex-M 处理器和开发工具之间进行移植和重用。
CMSIS 定义了 Cortex-M 处理器的通用寄存器访问方法、中断控制和系统控制寄存器的定义等,以及一系列标准化的API,如调试、系统时钟、时钟配置等。
CMSIS 的目标是简化嵌入式软件开发,使软件更具可移植性和可重用性。

说白了实际上CMSIS就是对arm底层接口的一个封装,以达到用户只需关注CMSIS的接口,而不需要关注底层的芯片是M0 、M4 、M33

pack

Pack 是 Keil µVision 中用于管理和提供嵌入式软件的一种机制。它是一种打包格式,包含了特定嵌入式设备的软件组件,如设备描述文件(Device Description Files)、驱动程序、库函数等。

10. keil5怎么加快编译速度

在这里插入图片描述
去掉2处,但是会影响调试在这里插入图片描述
最重要的是要用V6编译工具链

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值