【NUCLEO-F412ZG试用体验】基本硬件组成和下载第一个程序
参考资料:
DM00107720:Getting started with STM32CubeF4 firmware package forSTM32F4 Series 这个英文文档讲解了STM32CubeF4固件包的架构和内容,固件包中包含了HAL库的官方源程序。 DM00244518_ENV3:UM1974 User manual STM32Nucleo-144 board:这个文档包括了NUCLEO-F412ZG开发板如何快速上手,包括硬件的布局(layout)和一些配置信息,包括硬件的原理图,可以从这篇文档中找到。
下载地址为:
http://www.stmcu.org/document/list/index/category-150
http://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-nucleo/nucleo-f412zg.html
开始试用板子的一些基本步骤:
1, 首先需要安装MDK5.20,这个相信大家已经很清楚了,这里不再说了。我们知道MDK5版本之后还需要安装器件包,因为现在芯片公司更新自己新的芯片的速度很快,比如ST公司的STM32F412ZG这个芯片,可能在你已经安装的MDK中找不到。这时候可以卸载掉原先的器件包,重官方网站上下载最新的器件包即可。如下图所示:
卸载的过程如下:
接下来下载Keil.STM32F4xx_DFP.2.10.0即含有最新的STM32F412ZG器件的包:下载地址为:
2, 安装ST-Link驱动,相信大家这个已经非常熟悉啦,就不多说啦!
在这里简单解释一下STM32CubeF4固件包吧:这个固件包和以前标准库开发提供的固件包类似,不过里面提供的是现在ST推广的基于HAL库的官方程序例程。
浅淡选择ST的标注库 或者 HAL库?
ST 先后提供了两套固件库:标准库和 HAL 库。STM32 芯片面市之初只提供了丰富全面的标准库,大大便利了用户程序开发,为广大开发板所推崇,同时也为 ST 积累了大量标准库用户。有过 STM32 基础的同学想必对标准库非常熟悉。实际上,HAL 库和标准库本质上是一样的,都是提供底层硬件操作 API,而且在使用上也是大同小异。有过标准库基础的同学对 HAL 库的使用也很容易入手。在新型的 STM32芯片中,用 HAL 库逐步淘汰标准库。许多人可能觉得学习HAL比较麻烦,觉得可能耗费时间,其实不然。我们来简单比较一下标准库和HAL的串口配置的 1.标注库串口的代码
2.HAL库串口代码
HAL库和标准库的代码很相似,有标准库使用经验的,可以很快转到HAL库上来。
4.基本硬件的架构:
主要由两部分组成ST-link和STM32F412最下系统。硬件的原理图就不贴了,看不清楚,看上面提供的PDF。
5.下载第一个程序,简单的GPIO程序。
在STM32CubeF4固件包中:按照路径如下:
STM32Cube_FW_F4_V1.13.0ProjectsSTM32F412ZG-NucleoExamples
这里面包含了官方提供的一些GPIO、ADC、串口、TIM等等基础的程序,
我们在MDK-ARM文件夹(路径:STM32F412ZG-NucleoExamplesGPIOGPIO_IOToggleMDK-ARM)下,双击Project即可打开GPIO例程。
每次打开工程后,我们打开readme.txt文件,这里面包括了这个工程的使用说明,包括一些注意事项。
简单的解释一下代码吧,嘿嘿:
int main(void)
{
/* This sample code shows how to use GPIO HALAPI to toggle LED1 and LED3 IOs in an infinite loop. */
该例程代码演示了使用HAL库中的API函数来翻转LED灯。
HAL_Init();
/* Configure the system clock to 100 MHz */
SystemClock_Config();//系统时钟初始化为100MHz
/* -1- Enable GPIO Clock (to be able toprogram the configuration registers) */
//以下为使能GPIOB的时钟,三条语句实际上为一样,和标注库的配置一样。
LED1_GPIO_CLK_ENABLE();
LED2_GPIO_CLK_ENABLE();
LED3_GPIO_CLK_ENABLE();
/* -2- Configure IO in output push-pull modeto drive external LEDs *///设置GPIO为推挽输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;//无上拉
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;//设置IO速度
GPIO_InitStruct.Pin = LED1_PIN;//设置管脚
HAL_GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStruct);
GPIO_InitStruct.Pin = LED2_PIN;
HAL_GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStruct);
GPIO_InitStruct.Pin = LED3_PIN;
HAL_GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStruct);
/* -3- Toggle IO in an infinite loop */
while (1)
{
HAL_GPIO_TogglePin(LED1_GPIO_PORT,LED1_PIN);//对对LED1管脚翻转输出。
/* Insert delay 100 ms */
HAL_Delay(100);
HAL_GPIO_TogglePin(LED2_GPIO_PORT,LED2_PIN);
/* Insert delay 100 ms */
HAL_Delay(100);
HAL_GPIO_TogglePin(LED3_GPIO_PORT,LED3_PIN);
/* Insert delay 100 ms */
HAL_Delay(100);
}
}