本帖最后由 harvardx 于 2017-5-18 16:41 编辑
写在前面, STM32CubeMx是st的一项创举, 大大降低了,入门stm32 mcu的难度. 特别是新出不同系列不同核心的,如M0 到M3 到M4,变迁时, 我们不再需要再痛苦的去适应新架构,新寄存器, 我们要做的是一脉相承的写好应用, HAL层, 有效的屏蔽了差异性, 让我们更好的专注于应用.
说话间,STM32CubeMx已经升级到了最新的4.21.0版本.
如今的,stm32CubeMx经过多次的更新升级,已经华丽蜕变,变得成熟易用,不断的消灭bug,增加新的芯片. 可以到
http://www.st.com/en/development-tools/stm32cubemx.html
主要更新如下:
STM32CubeMX Software V4.21.0 / 05 April 2017
Major release
- Added support of code generation, clock and power consumption calculation for STM32F1, STM32F4, STM32H7, STM32L0, STM32L1 and STM32L4 Series new part numbers.
- Added support for code generation using the Low Level libraries for the STM32L0 and STM32F0 Series.
- Project can be generated as a general purpose makefile.
- Possibility to generate the code using the HAL library or the LL library for each peripheral instance.
- MCU selection for a new project is using the same interface as STMCUFinder.
下载最新的版本.如果已经安装旧版本, 可以很方便的在STM32CubeMx中直接升级.重启一下,就会自动替换就的版本,这单比以前的老版本强太多了.另外值得表扬的就是,现在的库的更新速度,非常快.在100M的常用网速下.对于动辄几百M的库文件,也是分分钟搞定. 彻底告别之前, 网速很快,但是 更新很慢的不足;
发现一个问题,似乎最近在HAL之后,又出现了LL的库.
百度了下,
LL库 LL库(Low Layer)是ST最近新增的库,与HAL捆绑发布,文档也是和HAL文档在一起的,比如:在STM32F3x的HAL库说明文档中,ST新增了LL库这一章节,
LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。使用方法: - 独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。
- 混合使用,和HAL库结合使用。
难道是为了满足, 我们有时候要去进行类似于寄存器控制的,操作, 而推出的么? LL , 应该就是字如其名,更加底层吧. 在后面的评测中, 会重点关注这一特性.
言归正传,开始我们的开箱上电第一弹.
用microusb ,也就是大多数安卓手机的充电线, 将Nucleo-L496ZG,连接上电脑. 因为我的电脑之前也用过许多的Nucleo板.所以一阵搜索后, Nucleo-L496ZG,所需的各种驱动已经安装完毕; 如果是第一次使用, 要自行下载安装下, 反正st的官网也是足够的强大,需要什么都可以找到.重点是网速不慢. st的本土化也做的很好.尤其在我们社区的资料下载栏中,可以下载到已经稳定应用的各种软件和文档:
文档 - 意法半导体STM32/STM8技术社区 - 提供最新的ST资讯和技术交流
https://www.stmcu.org.cn/document/list/index/category-1066
安装完毕后,应该如图所示:
驱动
社区 在电脑系统里会多了一个U盘.无所多数,这个是nucleo板,mbed模式时的一种下载方式,将生成的bin直接拖入或者复制粘贴过去, 系统就会自动运行新的代码.
社区的各种Nucleo 开发板活动推出多年. 相信大家都已经非常熟稔这一系列的热身动作了. 虽说近1-2年,Nucleo 又衍生细分出Nucleo-32 Nucleo-64, Nucleo-144, 但是基本是一脉相承的, 只是弥补了原来只能demo 64pin mcu的单一性的问题. 现在的Nucleo家族更全面 更加实用.
--------------------------------------------------------------------------
-- < 开始评测 >---
----------------------------------------------------------------------------
1,首先通过STM32CubeMx进行项目配置,选择board, NUCLEO-L496ZG
自动生成的工程,按照我们在界面上的选择和此款Nucleo板的特性,对IO进行了一个默认配置.- /** System Clock Configuration
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
- /**Initializes the CPU, AHB and APB busses clocks
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
- RCC_OscInitStruct.MSIState = RCC_MSI_ON;
- RCC_OscInitStruct.MSICalibrationValue = 0;
- RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- /**Initializes the CPU, AHB and APB busses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- /**Configure the main internal regulator output voltage
- */
- if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
- {
- _Error_Handler(__FILE__, __LINE__);
- }
- /**Configure the Systick interrupt time
- */
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
- /**Configure the Systick
- */
- HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
- /* SysTick_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
- }
- /** Configure pins as
- * Analog
- * Input
- * Output
- * EVENT_OUT
- * EXTI
- PD8 ------> USART3_TX
- PD9 ------> USART3_RX
- PA8 ------> USB_OTG_FS_SOF
- PA10 ------> USB_OTG_FS_ID
- PA11 ------> USB_OTG_FS_DM
- PA12 ------> USB_OTG_FS_DP
- */
- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOH_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- __HAL_RCC_GPIOD_CLK_ENABLE();
- __HAL_RCC_GPIOG_CLK_ENABLE();
- HAL_PWREx_EnableVddIO2();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_RESET);
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(USB_PowerSwitchOn_GPIO_Port, USB_PowerSwitchOn_Pin, GPIO_PIN_RESET);
- /*Configure GPIO pin : B1_Pin */
- GPIO_InitStruct.Pin = B1_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
- /*Configure GPIO pins : LD3_Pin LD2_Pin */
- GPIO_InitStruct.Pin = LD3_Pin|LD2_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- /*Configure GPIO pins : STLK_RX_Pin STLK_TX_Pin */
- GPIO_InitStruct.Pin = STLK_RX_Pin|STLK_TX_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
- /*Configure GPIO pin : USB_PowerSwitchOn_Pin */
- GPIO_InitStruct.Pin = USB_PowerSwitchOn_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
- HAL_GPIO_Init(USB_PowerSwitchOn_GPIO_Port, &GPIO_InitStruct);
- /*Configure GPIO pin : USB_OverCurrent_Pin */
- GPIO_InitStruct.Pin = USB_OverCurrent_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(USB_OverCurrent_GPIO_Port, &GPIO_InitStruct);
- /*Configure GPIO pins : USB_SOF_Pin USB_ID_Pin USB_DM_Pin USB_DP_Pin */
- GPIO_InitStruct.Pin = USB_SOF_Pin|USB_ID_Pin|USB_DM_Pin|USB_DP_Pin;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- }
- /* USER CODE BEGIN 4 */
复制代码
我们在CubeMx中,将此处的频率从1MHZ修改成4MHZ 再点生成的时候.
此时, MDK产生了,提示,发现.h和.c已经修改,提示,是否重新加载, 可见,CubeMX实现了图形化配置与代码自动生成的功能.
最后一步, 很简单的一步, 在main.c 里面的while 1主循环中,写下我们的用户代码
/* LED 端口写1 */
HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_SET);
HAL_Delay(500);
/* LED 端口写0 */
HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
点击LOAD图标,将代码下载到板子中, 自动生成的工程中,已经帮我自动选择好了stlink下载. 请注意在use debug drvier的 settings设置中.将reset and run给勾选了
第一个上电实验 ,简单的点灯实验,就这么完成. STM32CubeMX给了我们难以想象的便利. 另外,如果电脑和我一样不太给力的同学,如果不想仍受慢如蜗牛的编译速度.可以选用MDK5 自带的最新的 V6.6 编译器 .速度杠杠滴.. 这样设置, 就可以直接用新的编译器编译拉 .. 速度给力啊.
发现个小问题 ,自动生成的工程的.c文件中, 函数goto defintion功能怎么没有了.. 莫非是v6.6编译器带来的副作用?? 求解
项目代码在此:
TEST1_GPIO.zip
(10.74 MB, 下载次数: 0)
|