STM32
直播中

杨杰

7年用户 1050经验值
私信 关注
[问答]

如何利用STM32CubeMx去实现控制GPIO灯闪烁的程序呢

STM32CubeMx是什么的?
如何利用STM32CubeMx去实现控制GPIO灯闪烁的程序呢?

回帖(1)

杨海清

2021-10-28 11:09:07
  工欲利其事,必先利其器,今天就先来利一利STM32CubeMx这个器吧;
  先说一下STM32CubeMx是干啥子的吧,它能帮你建工程,生成部分代码,你只要往相应的代码里面添加你的功能便可以了,总之,它可以减少你的工作量就对了;
  1.下载安装
  a.下载安装JRE:STM32CubeMx是基于JAVA运行的,所以要先下载安装JRE,
  
  2.安装库:STM32CubeMx需要相对应的芯片库;
  下载安装完成后,打开STM32CubeMx,使用前,要先安装一下STM32CubeMx的库,我们就用在线安装吧,比较简单:
  Help-》Manage embedded software packages Alt+U
  弹出如下图所示的界面:1.选择你的芯片-》2.选一个你喜欢的库版本-》3.点“Install Now” 等。。。等。。。等。。。过程可能有点漫长,视网络而定。。
  3.应用
  我们就来做一个简单的应用吧,控制GPIO 灯闪烁的程序;
  打开Stm32CubeMx,界面长这样子,点New Project:
  点New Project后,弹出如下界面:
  1)、给你选芯片的,可以一级级往下选,也可以直接搜索里面搜索你的芯片;这个软件超好用,不仅能减轻软件工程师的工作量,也适合于应件工程师做芯片选型;
  2)、芯片简单介绍;
  3)、芯片主要特征,型号,flash,封装,RAM,IO个数,频率,连10K片价格都有,这货不仅方便软件工程师建项目,也方便硬件工程师做芯片选型,一目了然;
  
  看板子原理图,选的是STM32F207IGT6,软件工程师不仅要会敲代码,还要会查原理图,这点很重要;
  
  选芯片,可以直接在Part Number Search栏搜,也可以自已一级一级点选,Core是核,Series是系列,Line选型号,Package选封装,选好后,点Start Project;
  
  点Start Project后,弹出如下界面:
  1)、Pinout:管脚配置;
  2)、Clock Configuration:时钟配置;
  3)、设置中间层,比如实时操作系统,网络协议栈等(后面有空再讲,LED也就几个GPIO口,不用那么复杂);
  4)、外设,如ADC,串口,I2C,SPI配置等,这项目配几个GPIO也不需要用到;
  我们先来配一下时钟,
  5)、可以在这里直接配置管脚,我们稍等会要把GPIO配置成输出脚;
  我们先来配一下时钟,鼠标点击 Clock Configuration 页,
  
  点击 Clock Configuration 页后,页面变成这样子的,我们直接在HCLK位置上填上120吧,也就是配个120MHz的系统频率,我们平常说的Intel XXX 的CPU牛逼,主频多高多高,就是这个,其实也可以设置成别的值,只要《120MHz就行了;至于如何选择时钟源,如何设置倍频,分频等等,我们不需要参与,软件自动给我们设置好了;
  
  配完时钟后,我们点回Pinout页,开始配引脚吧,具体用哪个引脚呢?当然是看原理图,软件工程师要学会看原理图,查找原理图,重要的事情要说三遍,三遍,三遍;什么?你没原理图?找硬件工程师要去;
  打开原理图,看图说话,图中告诉我们,JTAG,KEY,LED在11页;
  
  翻到第11页,看到这几个LED灯了吧?在原理图上搜一下LED_R,LED_G,LED_O,LED_B分别连到STM32哪个引脚?
  LED_R = PD12,LED_G = PG6,LED_O = PG8,LED_B = PC7;我们就把这4根引脚配置成输出管脚吧,看图,没有上拉3.3V,就用推挽输出吧(pull);
  
  
  
  
  知道要配哪些引脚了,我们可以开始配了,回到STM32CubeMx界面上,点Pinout,
  在芯片这个页面,可以用鼠标滚轮放大缩小,可以拖动,找到这几个脚,点左键,把它们都配成GPIO_Output;
  
  配完所有所需要的引脚后,点Configuration,看到GPIO了吧?这就是我们刚刚配的GPIO口,点它;
  
  我们可以看到GPIO的详细配置界面:
  GPIO output level:IO口初始状态,高电平/低电平;
  GPIO mode:Push/OpenDrain,也就是推挽和漏极开路,OD模式需要接上拉,一般驱动能力不够时用,看原理图中没上拉,那就选个推挽吧;
  简单地说一说推挽和开路吧,
  推挽:可以理解为高电平就输出高电平,低电平就输出低电平,不需要外部3.3V做上拉;
  开路,就理解为低电平时,把它接地,高电平时,把芯片管脚断掉,所以需要上拉个3.3V;
  GPIO Pull-up/Pull-down:如果设置为推挽输出,就要选不拉;
  Maximum output speed:GPIO控制LED灯,随便选一个吧;
  设置完成后,点OK;配置完成!
  
  接下来,生成代码咯,Project -》 Settings.。.
  
  弹出这样一个界面
  这里有三页,我们只设置几个参数便可,其他的默认;
  Project Name:项目名
  Project Location:项目目录
  ToolChain / IDE:集成开发环境,我用的是 Keil Arm V4;
  其他的全默认;
  其余的两页,可以了解下,
  Code Generator:代码生成风格,比如,是否把库全部生成进项目,还是部分等;
  Advanced Setting:高级设置,库设置等,用什么库,就用HAL吧,还有个LL库,后面有空面介绍这两个库吧;
  设置完成后,点OK;
  
  接下来:Project -》 Generate Code,然后,等呀等呀等呀~~~ 好了!
  好了之后,会弹出个对话框,
  要打开目录,还是打开项目,还是关闭,自个选吧;
  我们就选打开项目吧;
  
  打开后项目是这样子的:
  看到熟悉的main()了吧?要添加/修改的代码,就在main里面!
  配置的系统时钟,就在 SystemClock_Config(); 里面;
  配置的GPIO,就在 MX_GPIO_Init(); 里面;
  
  我们接下来,就在while(1) 里面添加个 LedHandler(); 让Led闪灯;第106行,LedHandler();主循环会不断地执行这个函数;
  
  看下LedHandler()函数的实现,程序设定了一个定时器,1000ms时间到了GPIO反转一次,程序使用HAL库,是ST弄出来的,库会对一些寄存器操作封装起来,用起来比较直观,有兴趣的同学可以看一下库的代码,最根本也是对寄存器的操作;
  说一下题外话,在PIC,51时代,很多人喜欢直接用地址操作寄存器,少去一些诸如调用函数的入栈,出栈等操作,效率也相对提高了;但现在,用的120MHz的MCU,还是三级流水线的,对于这点代码时间的差别,已微乎其微,Who Care?个人还是比较喜欢使用库,标准库也好,HAL库也好,LL库也好,总之,能够提高开发效率,增强代码可读性的事儿,能用就用!
  
  写好了吧?保存,编译,烧录,重上电/复位,看,这4个灯,闪起来了!!!上个图,呃,抱歉了,图看不到闪烁,那请自行想象吧~~~
举报

更多回帖

发帖
×
20
完善资料,
赚取积分