[STM32CubeIDE]创建HAL库项目

在这里插入图片描述

利用STM32CubeIDE创建HAL库项目相对容易
*随着CubeIDE的版本更新使用ST-Link、J-Link以外的调试器越来越复杂
*系统时钟问题可以用MCO功能排查,不起振不一定是晶振的问题。

硬件:
开发板:正点原子stm32f103-mini开发板(STM32F103RCT6)
调试器:nanoDAP v2.3(DAP-Link)/J-Link v8
逻辑分析仪:DSLogic Plus(个人版)
软件:
STM32CubeIDE v1.10.1
DSView v1.2.0

一、创建项目(Start new STM32 project)

    在CubeIDE主界面左侧可以创建新的STM32项目,除了直接创建外也可以导入CubeMx生成的.ioc文件。最后一栏的样例程序(STM32Cube example)只有部分芯片和Nucleo系列的开发板有。
STM32CubeIDE也可以在File->New中创建C/C++项目

    创建的界面与STM32CubeMx基本一致,可以在左上角的输入框内输入芯片型号进行查找。利用STM32CubeMX工具能够迅速找到不同芯片的官方文档和数据手册 (拿来找手册很方便)
在这里插入图片描述
    找到对应的芯片后进入下一步;
在这里插入图片描述
    到这一步就可以完成了,按Finish会进入和CubeMx一样的界面;

二、使用CubeMx进行初始化

1、配置外部时钟源

在这里插入图片描述
    默认情况下没有使用外部时钟信号,配置完成后会得到如下的图片;
在这里插入图片描述
    HSE和HSI的配置选项都是一样的:
Disable                                 :不使用外部时钟源,会使用内部的HSI/LSI提供时钟信号;
BYPASS Clock Source       :使用有源晶振外部时钟信号,大部分Nucleo系列开发板需要用这个选项。
Crystal/Ceramic Resonator:使用无源晶振,常用的的陶瓷/石英晶振就是这个类型;

    选错类型通常会导致晶振无法起振,在F103上如果不使用RTC时钟不一定需要开启LSE;Master Clock Output(MCO) 可以将芯片内的时钟信号进行输出,在演示功能时会提及;

2、开启调试功能

    这是刚接触STM32CubeMx初始化项目容易遇到的坑,没有配置Debug不能调试。HAL库提供了ms阻塞延时函数HAL_Delay(),这里将Systick定时器作为时基单元。System Wake-Up会配置一个唤醒引脚,对于低功耗模式有用目前用不上 (唤醒MCU的方法很多)
在这里插入图片描述
    调试经常用SWD模式,和JTAG相比只需要占用两个引脚;

3、配置时钟树

    [标准库和HAL库时钟树的初始化过程] 参考标准库中的设置进行配置(72Mhz):
在这里插入图片描述

4、项目设置(按需修改)

4.1 Project

在这里插入图片描述
在Project中需要关心的设置不多:

Linker Settings(注意调整栈空间大小)
Minimum Heap Size:堆空间的大小,堆是需要手动管理的内存空间(例如使用编译器malloc()与free()函数,但由RTOS分配的堆空间不一定在此处[待填坑];
Minimum Stack Size:栈空间的大小,栈会被局部变量以及调用函数时保存现场时消耗,很多问题来自栈空间不足
    F103RC RAM共48K(0xC00)但RAM空间不能全分配给堆栈[待填坑];
Thread-safe Settings(可选)
    这里的线程安全设置似乎没什么人提; 编译器提供的malloc()函数是非线程安全的,并且执行过程中被打断带来的影响难以预测(这类函数也被称为不可重入函数,可以常用加锁的方式进行保护);
    如果要使用编译器提供的部分函数可以开启;

4.2 Code Generator

在这里插入图片描述
Generated files
建议勾选:
Generate peripheral initialization as a pair of .c/.h files peripheral
    勾选之后初始化外设会单独生成init函数,默认状态下全都堆在main()中。
HAL Settings(特定情况需要配置)
Set all free pins as analog(低功耗)
    将未使用的引脚配置为模拟输入模式,在进行低功耗优化时经常用到;
Enable Full Assert(调试)
    开启断言检查,不论是在标准库还是HAL库中都有大量的assert_param()函数。断言函数会检查输入的参数是否正确,默认情况下不启用。

4.3 Advanced Settings

在这里插入图片描述
Driver Selector
    这里出现了两个选项HAL、LL(Low Layer APIs),使用HAL库也会将LL API复制到项目中。HAL具备容易移植的特点,但是带来了较大的性能损失。LL和标准库类似封装程度较低,通过直接操作寄存器获得较高的性能,和标准库一样不同系列的芯片操作方式略有不同不太方便移植。不同库函数性能对比
Register CallBack
    HAL库提供了非常多的回调函数,以UART为例。

/*在stm32f1xx_hal_uart.h中*/
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart);

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size);

    回调函数默认情况下没有实现功能,由于使用__weak修饰符用户在其他位置实现后不会触发重复定义错误。相应的事件发生后回调函数会被自动执行。

5、生成初始化代码

    配置完成后点击左上方的图标保存。
在这里插入图片描述
随后就能看到第一个项目的初始化代码。
在这里插入图片描述
注意将用户代码写在

/* USER CODE BEGIN */

/* USER CODE END */

之间,否则在修改.ioc文件后编写的代码会被清除。自行添加创建的.h .c文件不会受影响。
    目前看起来什么都是空的,按界面上方的锤子图标可以编译出固件。
在这里插入图片描述

现在已经编译好了固件,接下来开始配置调试器。

三、调试器的配置

在这里插入图片描述

1、使用ST-Link或J-Link

    如果使用这两种调试器配置过程非常简单。
在这里插入图片描述
选择完成后不要忘记点击Apply,到此调试器的配置已经结束。再次点小虫子图标就能进入调试界面了。
在这里插入图片描述

2、使用其他调试器

    然而调试的简单配置仅仅针对ST-Link和J-Link,随着CubeIDE的更新使用其他仿真器越来越复杂 (奸商)。按照这位博主的教程可以配置成功:

高版本CubeIDE下使用DAP-LINK教程
版权声明:本文为CSDN博主「A_Stupid_Liberal」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lone5moon/article/details/124940297

在这里插入图片描述

四、MCO功能

    MCO可以将片内的时钟信号输出,帮助诊断时钟配置问题,同时MCO可以当作其他芯片的时钟源。
在这里插入图片描述

注意最大输出频率不要超过50Mhz;

1、正常情况下的输出(MCO-HSE-8Mhz)

在这里插入图片描述
放大一些可以算出一个周期约125ns,与8Mhz吻合,MCO的输出波形和有源晶振相似
在这里插入图片描述

2、配置错误的晶振配置(MCO-HSE-8Mhz[不起振])

在这里插入图片描述
    将HSE配置为供有源晶振、外部信号模式;
在这里插入图片描述
引脚持续输出高电平晶振没有起振。

3、Nucleo开发板[MCO作为时钟源]

    这里不得不提Nucleo系列,通常情况下它的HSE来自与板载的ST-Link (有些能自己焊上去留有焊盘位)
原理图截图(144脚系列都差不多):
在这里插入图片描述

STM32CubeMx例程初始化代码,像2中的配置对于Nucleo来讲是正确的。
在这里插入图片描述
    将图片放大一点,PH0接受来自STM32F103CBT6(ST-Link)输出的时钟信号。
在这里插入图片描述
    这是MCO的用法之一,在板上其他设备需要时钟信号时可以作为时钟源。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值