其他分享
首页 > 其他分享> > 关于rt项目开发过程中的排坑记及stm32xx_hal_msp说明cubemx重映射设置

关于rt项目开发过程中的排坑记及stm32xx_hal_msp说明cubemx重映射设置

作者:互联网

关于rt项目开发过程中的排坑记及stm32xx_hal_msp说明cubemx重映射设置


格式化之前写过的文章

scatter file(分散)文件,rtt官网给出的其实是一个脚本文件有什么作用??

如下图:

这是keil官网给出的语法解释:

从中可以看出link.sct文件,意思就是链接时,扩展出了SRAM2的内存地址 。

stm32l4xx_hal_msp.c文件的作用?

这是文件本身的描述:主要是初始化代码。

MSP,全称为 MCU support package,函数名字中 带有 MspInit 的函数,它们的作用是进行 MCU 级别硬件初始化设置,并且它们通常会被上一层的初始化函数 所调用,这样做的目的是为了把 MCU 相关的硬件 初始化剥夺出来,方便用户代码在不同型号的 MCU 上移植。

stm32l4xx_hal_msp.c 文件定义了两个函数 HAL_MspInit 和 HAL_MspDeInit。这两个函数分别被文件 stm32l4xx_hal.c 中的 HAL_Init 和 HAL_DeInit 所调用。

HAL_MspInit 函数的主要作用是进行 MCU相关的硬件初始化操作。例如我们要初始化某些硬件,我们可以硬件相关的初始化配置 写在HAL_MspDeinit 函数中。这样的话,在系统启动后调用了 HAL_Init 之后,会自动调用硬件初始化函数。

实际上,我们在工程模板中直接删掉 stm32l4xx_hal_msp.c 文件也不会对程序运行产生任何影响。

关于VCP(虚拟串口)

其实,就是将STM32USB口视为一个串口。CSDN原理参考

实现:

1、CubeMX就能快速生成USB工程了

步骤:

->RCC里高速和低速时钟都选择外部晶振Crystal

->Connectivity-USB勾线Device(FS),端口默认PA12(USB_DP),PA11(USB_DM)

在这里插入图片描述

->Middleware-USB-DEVICE里Class For FS IP选择Communication Device Class(Virtual Port Com)

->生成代码后,

->电脑端要安装驱动,如下图:

->识别为了串口,就可写些收发程序了

虚拟串口主要用到usbd_cdc_if.c里的两个缓存数组和收发函数。

uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];//接收缓存 uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];//发送缓存 static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t Len)//接收回调函数 uint8_t CDC_Transmit_FS(uint8_t Buf, uint16_t Len)//发送函数

CDC_Transmit_FS是发送函数,指定数据首地址和字节长度,数据就会发送到串口,底层是USB库实现的。

关于找不到用ENV编译找不到stm32l4_XX.h的错误,如下图:这个坑,折腾了一晚上。

这个文件路径如下:可以看到不知怎么丢失了这个文件

用官方DEMO,就可以找到并且用libraries下文件复制到这个位置,就可解决这个问题。

自己的工程是利用现成STM32L432 ST官方的DEMO来建的工程,每用ENV工具重新生成MDK5工程后,都会自动添加STM32L432 的启动文件,而自己所用的是STM32L431,这样就不太相符了?

刚移植时,只是修改了ENV生成的样本工程的配置:如下图:

唯一的就是这个启动文件没有修改过来,经过几天的折腾,终于找到脚本的修改位置:

修改过这里,一切都转到L431芯片配置下,一切OK!

打开串口设置时,提示不成功,返回值为-1或-8的问题。(后来经查,可能不是这里的原因,RTT用DMA_RX收的话,就会有这样的问题,用INT就可以正常打开)

可以说代码很简单,之前的相同的程序都能过了,不知道怎么这次就是通过不了。单步跟踪后发现,在跟踪到rt_device_open时,发现返回值是0,但多走一步,就会变成0xFFFFFFF1(保持默认的串口配置)或0xFFFFFFF8(执行rt_device_control,更改了串口配置)。如下,在device.c文件中rt_device_open:

百思不得其解?偿试将之前调试通过的代码复制到此文件中,也是一样的问题。

经过一段时间的调试,发现不用这个文件,而是用之前调通的文件,然后将此文件的逻辑在调通的文件中添加和更改。就可以顺利的打开串口设备。

调试过程中,偶尔按ctrl+shift+F在全工程文件中搜(lpuart1)时,在搜到的结果中,点击会出现此错误。

遇到不正确的参数”。keil官网给出的信息是:

原因

μVision5调试器目前无法处理包含带有UTF-8字符的文件夹或文件名的DWARF调试信息。

解决方法

请勿在项目的文件夹和文件名以及所有源文件和库中使用非ASCII字符。

此问题可能会在5.25以后的MDK版本中修复。

但本人用的是5.29此问题仍然存在。
在这里插入图片描述

虽然在原先调通的文件中调试就没这个问题了,但通过这个调的过程,也发现了一个KEIL的BUG还有对中文支持不好.这个过程是痛苦的,甚至怀疑过人生,想过要不要放弃。

还好,找到问题后,果断将系统默认输入法改成英语,以后再遇到就知道怎么弄了。

使用自动初始化INIT_APP_EXPORT出现Incompatible pointer types initializing,指针类型不匹配的警告

在这里插入图片描述

问题就出在了,函数参数上。初始化函数,不需要传入参数。

解决:

将输入参数改成void;警告就没有了。如图所示:static int spk_thread_init(void)

用官方的PWM例程,只是改到了TIM15_CH2,没有输出?

解决:看官网上有人遇到一样的问题。

光看例程提供的那几个函数是看不出任何问题的:

INIT_DEVICE_EXPORT(stm32_pwm_init);这个函数是自动初化的。

更新了下项目,但没有输出PWM???

经过查找为HAL_TIM_PWM_Init()这个函数调用了wake声明的函数HAL_TIM_PWM_MspInit(htim);,而没使用cubeMX生成的同名函数。这就造成了定时器时钟没有启动,所以不会有PWM输出。

解决也很简单,复制一下函数名到出错的位置,覆盖掉原来的即可,虽然是一样的,但编辑器会重新编译新覆盖的部分代码,不得不说,MDK优化掉了本该识别的__weak.造成识别出问题。

添加fal时出现ArmClang: error: unsupported option ‘–c99’

具体解决方式:F:\SixBirld\rtOS\bsp\myOS\sixBand\ports\fal

将画圈的部分去掉后,编译通过。

这部分内容其实是与rt-thread无关的,但有可能会在配置时遇到,所以记录下???如何用cubemx查找相同的映射管脚??

查找哪个功能的管脚在此输入即可,如下图:

调试lpuart口时,遇到波特率无法设置为9600问题?

仔细看了一下之前开发的程序,之前lpuart波特率时钟源使用的是外部的32768,所以设置9600时没有问题。但这次由于用不到rtc所以,没用32768而cubx直接默认的是80M系统时钟,所以会有问题。原因如下:

LPUART的时钟不能超过fck must be in the range [3 x baud rate, 4096 x baud rate].系统时钟是80M, 80M/4096 =19531,也就是在使用80M系统时钟作为LPUART的时钟基准时,波特率最小可以设置为19531远远大于9600,所以出错。将时钟设置为内置HSI即可。

标签:rt,文件,hal,函数,初始化,串口,HAL,时钟,排坑
来源: https://blog.csdn.net/guangod/article/details/120532663