harvardx 发表于 2017-5-17 12:18:43

【NUCLEO-L496ZG评测】第一部 : 开箱上电( 基于最新CubmeMx)

本帖最后由 harvardx 于 2017-5-18 16:41 编辑

213325660

      写在前面, 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-32Nucleo-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编译器带来的副作用?? 求解

项目代码在此:














zero99 发表于 2017-5-17 14:50:22

版主,看不到图片啊..

harvardx 发表于 2017-5-18 08:26:58

:lol SORRY
上传出点问题,.

harvardx 发表于 2017-5-18 15:05:27

文末提到的问题 ,确实是编译器引起的 .难道v6.6的快速编译 是通过牺牲没有brow information换来的??太可惜了

harvardx 发表于 2017-5-18 15:07:58

页: [1]
查看完整版本: 【NUCLEO-L496ZG评测】第一部 : 开箱上电( 基于最新CubmeMx)