前言

工欲善其事,必先利其器。HAL库的开发不一定必须使用cubemx,但是使用了cubemx,你绝对不会后悔。基于一些小伙伴对cubemx的使用还有一些疑问,本次小飞哥从新建工程到生成工程,编写应用代码,和大家一起聊一聊到底该如何使用这个神器。本次是建立在已经安装好cubemx的情况下,错误之处还请多多指教。

1、cubemx总体界面介绍



  选择控制器MCU/MPU,有4个选项,一般小飞哥最常用的是第一个和第四个,第三个主要是没有对应板卡,可以快速找到自己用的MCU。



  通过板子选择,如果小伙伴们手里有里面的开发板型号,可以直接选择开发板,另外两种小伙伴们可以自己摸索摸索啦,就不啰嗦了。

2、cubemx芯片界面介绍

小飞哥本次使用的是上期介绍的falling-star board,主控STM32f103RET6,cubemx选择的是此型号。



MCU工程配置的一些说明:



  如果使用cubemx创建工程,选择好MCU之后,小飞哥经常按照以下几个顺序(纯属个人习惯,大家参考即可):

时钟选择配置

STM32 有4个独立时钟源:HSI、HSE、LSI、LSE。

  • HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。

  • HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

  • LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。 

  • LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

其中LSI是作为IWDGCLK(独立看门狗)时钟源和RTC时钟源 而独立使用,而HSI高速内部时钟 HSE高速外部时钟 PLL锁相环时钟,这三个经过分频或者倍频作为系统时钟来使用。

注意:内部高速时钟相比较外部高速时钟是不够稳定的,在一些极限条件下,很可能出现始终不稳定,导致通讯失败。

根据自己需要以及硬件设计,如果设计有外部时钟,建议一定要选择外部时钟作为时钟源,不用的话,你设计来干嘛呀~



  如果确定使用内部高速时钟的话,上一步选择时钟的操作就不用做了,cubemx新建工程,默认是内部高速时钟。



  确认了时钟来源之后,就可以为我们的外设接口分配时钟频率啦,一顿操作猛如虎,感觉做了很多,有感觉什么又没做,倍频、分频,最终得到合适的时钟频率。

仿真器、时基配置

外设等MCU资源配置

本节我们以最基础的GPIO配置、定时器配置、串口配置来说明如何配置使用到的MCU资源。

  • GPIO配置(经典点灯)

硬件连接PA2,这里提一句,由于设计的是灌电流的方式点亮LED,一定要注意MCU IO所能承受的灌电流,选择合适的阻值。



  点亮LED,我们只需要控制PA2引脚的输出电平即可



  需要对IO进行一些配置,关于输出模式,推挽或者开漏,上下拉,既不上拉也不下拉,输出速度,可以与标准库里面的50MHZ,100MHZ联系起来,一个道理,GPIO的配置就是这么简单。

  • 串口配置(经典printf)

这个就比较简单了,不多做介绍了。



  中断需要手动开启,DMA设置可以添加TX或者RX,IO配置可以看到已经是复用为串口模式了。

  • 定时器配置(哪都少不了的神器)

定时器的功能就比较多了,输入捕获、PWM、比较输出等等,本次仅仅介绍定时的功能。

关于定制周期的计算,T = 周期/(分频系数/时钟频率),比如,72MHZ频率下,图示配置周期为:T = 100/(72000000/7200)S = 0.01S,即10ms

那时钟周期是多少怎么确定的呢,这就需要看时钟树,以及TIM3挂载在哪个时钟下了,TIM3是挂在APBH1时钟线下的,所有时钟频率为72MHZ。

配置项总览

对于我们刚才的配置,我们可以通过图示,来对我们刚才的配置进行一一确认,可能有小伙伴发现问题了,那我刚才先点击每一个模块,具体参数在这里调整不是更方便吗?没错,我们可以打开所需模块后,然后在这里统一进行配置,这里关于外设的使用情况,参数配置一目了然,还是很方便的。

3、生成代码工程配置

配置完之后,我们只需要小手一点,就可以愉快的玩耍啦!

4、代码风采

可以看到,关于GPIO、定时器、串口的配置生成了独立的文件,非常的整洁。

  • LED GPIO配置函数

  • 定时器3配置函数

定时器配置分为了两部分,一部分是定时功能参数配置



另一部分是关于中断的配置

  • 串口配置函数

串口配置和定时器一样,也是分为两部分,一部分是基本参数配置



另一部分是IO复用和中断优先级配置

5、应用代码编写

前面搞了那么多,好像跟我们没一毛钱关系,接下来,到我们大展身手的时候了,进行应用代码的编写,实现定时器控制,500ms串口打印一句话,LED闪烁。

写代码啦,写代码啦,该怎么写,赶紧百度百度,WC,怎么没网了,这怎么办?其实,基本的接口函数都在工程本身,我们要学会从工程本身去找资料。

  • LED控制代码编写

因为我们控制LED亮灭,实际上就是操作GPIO输出高低电平,我们只需要去找跟GPIO相关的库函数即可,以下文件写的还是比较详细的,该如何使用GPIO驱动库。

打开GPIO.h文件,关于GPIO操作的函数都在这里,我们要做的只不过是看懂,传参数就可以了,比如,IO输出的函数,第一个是输出高或者低,第二个是IO状态翻转,我们都可以用,比如GPIO输出原型,我们只需要按照说明传参数就可以了。

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

    HAL_GPIO_WritePin(Sys_LED_GPIO_Port,Sys_LED_Pin,GPIO_PIN_RESET);

    HAL_GPIO_TogglePin(Sys_LED_GPIO_Port,Sys_LED_Pin);
  • 定时器代码编写

老规矩,打开定时器相关的库函数,WC,这这么多,鬼知道那个是我需要的~因为定时器涉及到的功能是很多的,这里我们使用的是最基本的定时器中断,所以只需要去找跟定时器中断相关的函数即可。我们依然去找帮助说明,在说明我们可以看到,跟定时计数器相关的几个函数,我们只需要在合适的时机执行这些函数即可。

要实现定时器中断的功能,我们还需要开启定时器中断

既然牵扯到,中断,那必须少不了中断响应函数,HAL库对每一类中断封装了个中断回调函数,定时器回调函数,这里牵扯到一个_weak关键字,大家可以百度百度,这里不展开说了,简单一句话(当然是有很多说法的,大家可以自行百度哈),这个函数,你可以拿到别的文件里不用改名字,我们只需要在定时器中断回调函数中编写中断服务程序即可,有一句话,也是很好的习惯,中断不要做很多事情,尤其是长延时,最好置个标志就走,万花丛中过,片叶不沾身那种感觉。

  • 串口代码编写

看了前面两个的介绍,应该不用小飞哥啰嗦该怎么做了吧。本次主要做发送,用串口发送函数即可。

实验现象

关于Embeded-Party

如果你觉得对自己有帮助的话,给个赞,点个关注,点个在看,感谢前进的道路上有你的陪伴!

所有公众号文章资料源码已上传,关注公众号回复资料即可获取哦,欢迎加群一起炸起来!

这里有一群可爱的小伙伴,等待着你的到来,欢迎你的加入!

HAL库|神器cubemx的正确打开方式的更多相关文章

  1. HAL库与Cubemx系列|Systick-系统滴答定时器详解

    Systick是什么? 关于Systick,在Context-M3权威指南中如此描述: SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15).在以前,大多操作系统需要一 ...

  2. iOS开发小技巧--相机相册的正确打开方式

    iOS相机相册的正确打开方式- UIImagePickerController 通过指定sourceType来实现打开相册还是相机 UIImagePickerControllerSourceTypeP ...

  3. C++11随机数的正确打开方式

    C++11随机数的正确打开方式 在C++11之前,现有的随机数函数都存在一个问题:在利用循环多次获取随机数时,如果程序运行过快或者使用了多线程等方法,srand((unsigned)time(null ...

  4. Pull Request的正确打开方式(如何在GitHub上贡献开源项目)

    Pull Request的正确打开方式(如何在GitHub上贡献开源项目) GitHub的官方帮助如下: Fork A Repo: https://help.github.com/articles/f ...

  5. Xcode 的正确打开方式——Debugging(转载)

    Xcode 的正确打开方式——Debugging   程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能 ...

  6. C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别

    C#语法——泛型的多种应用   本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...

  7. InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式

    InnoDB缓冲池预加载在MySQL 5.7中的正确打开方式 https://mp.weixin.qq.com/s/HGa_90XvC22anabiBF8AbQ 在这篇文章里,我将讨论在MySQL 5 ...

  8. Console控制台的正确打开方式

    Console控制台的正确打开方式 console对象提供了访问浏览器调试模式的信息到控制台 -- Console对象 |-- assert() 如果第一个参数断言为false,则在控制台输出错误信息 ...

  9. 任务队列和异步接口的正确打开方式(.NET Core版本)

    任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processi ...

随机推荐

  1. hdu3336 KMP + DP 前缀数组出现的次数

    题意:       给你一个串,问你他的所有前缀子串在本串中的出现次数,注释:abc的前缀子串是 a ab abc; 思路:      还是利用了next数组,先对子串求出next数组,再开一个数组d ...

  2. 在Android so文件的.init、.init_array上和JNI_OnLoad处下断点

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54233552 移动端Android安全的发展,催生了各种Android加固的诞生, ...

  3. UVA11992不错的线段树段更新

    题意:       给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v  把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v  把子矩阵的值全部都变成v 2 x ...

  4. SqlServer数据库主从同步

    分发/订阅模式实现SqlServer主从同步 在文章开始之前,我们先了解一下几个关键的概念: 分发服务器分发服务器是负责存储在同步过程中所用复制信息的服务器.可以比喻成报刊发行商. 分发数据库分发数据 ...

  5. 使用jenkins一键打包发布vue项目

    jenkins的安装 Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. Jenkins 支持各种运行方式,可通过系统包.Docker 或者通过一个独立 ...

  6. 四、postman关联、参数化

    一.postman关联 在实际接口测试中,后一个接口要用到前面接口返回的结果,从而让后面的接口能够正常运行,这个过程的实现成为关联 如上图通过新版本或者老版本的语法把获取的变量access_token ...

  7. [源码解析] 并行分布式任务队列 Celery 之 负载均衡

    [源码解析] 并行分布式任务队列 Celery 之 负载均衡 目录 [源码解析] 并行分布式任务队列 Celery 之 负载均衡 0x00 摘要 0x01 负载均衡 1.1 哪几个 queue 1.1 ...

  8. KeUserModeCallback函数

    内核调用用户 正常的系统调用过程为Ring3->Ring0->Ring3,而KeUserModeCallback提供了一种Ring0->Ring3->Ring0的方式,即从内核 ...

  9. 2020.12.20vj补题

    A - Insomnia cure 题意:一共s只龙,每隔k,l,m,n只龙就会受伤,问这s只龙有多少龙是受伤的 思路:看起来题目范围并不是很多,直接进行循环判断 代码: 1 #include< ...

  10. 保存 yum 下载的软件包并制作成本地 yum 源

    保存 yum 下载的软件包并制作成本地 yum 源 实验对象 CentOS 7 yum 安装 nginx (nginx必须使用第三源才能安装:redhat8版本的则不需要,官网源自带nginx软件包) ...