| 本帖最后由 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 再点生成的时候.
 
 
 
 ![@RUU[8)DFXS({IE7~]0D1P0.png @RUU[8)DFXS({IE7~]0D1P0.png](data/attachment/forum/201705/18/135820rbkmx0jk9tlmbmm6.png)  
 
 此时, 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给勾选了
 
 
 ![VK(YQ%B~NKDC@Q_KT0]5{EH.png VK(YQ%B~NKDC@Q_KT0]5{EH.png](data/attachment/forum/201705/18/145237b06uq8x88i8dx8uz.png)  
 第一个上电实验 ,简单的点灯实验,就这么完成.  STM32CubeMX给了我们难以想象的便利. 另外,如果电脑和我一样不太给力的同学,如果不想仍受慢如蜗牛的编译速度.可以选用MDK5 自带的最新的 V6.6 编译器 .速度杠杠滴.. 这样设置, 就可以直接用新的编译器编译拉 ..  速度给力啊.
 
   
 发现个小问题 ,自动生成的工程的.c文件中, 函数goto defintion功能怎么没有了.. 莫非是v6.6编译器带来的副作用?? 求解
 
 项目代码在此:
 
  TEST1_GPIO.zip
(10.74 MB, 下载次数: 0) | 
上传出点问题,.