找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14984|回复: 5
打印 上一主题 下一主题
收起左侧

麻雀虽小,五脏俱全之【STM32F042 Nucleo32】评测 串口+GPIO SPI驱动OLED程序

[复制链接]
跳转到指定楼层
楼主
    2014年,ST意法半导体发布了集自由、灵活、易用、可扩展、便宜等优点于一身的Nucleo64系列开发平台深受工程师喜爱。
      2015年,ST意法半导体发布了Nucleo32系列,Nucleo32与Nucleo64相比较,虽说引脚少了一般,但是,体积小了5倍,功能齐全,可谓是
麻雀虽小,五脏俱全,同时,Nucleo32兼容Arduino Nano的扩展接口,使之具有非常强大的可扩展性。
      
包装上,Nucleo没有任何一点改变,但是从图上看出,Nucleo32体积真的非常小。那么问题来了,这么小,板子带ST-Link开发仿真工具吗?
答案是肯定的,不然怎么会说麻雀虽小,五脏俱全呢?下面让我们一起欣赏一下这STM32F042-Nucleo32开发板吧!

STM32F042K6T6,基于Cortex-M0架构,运行频率最大48Mhz,具有32K Flash, 6K SRAM的强大芯片资源,可谓是开发无压力!
同时nucleo兼容Arduion Nano,让nucleo具备强大的Arduion生态圈开发手段!
板载ST-LINK/V2-1仿真器,具备在线仿真,虚拟串口调试等功能,让开发者只需要一根microUSB线即可完成仿真,串口通信等功能。
同时nucleo支持mbed的云平台开发功能!


板子正面,具有一个microUSB接口,主芯片,电源管理芯片,复位按键灯,引脚排列在两边,同时,板子采用4层板结构,让板子面积
更小,性能更加稳定!

STlink,降压芯片等位于板子底面,同时将仿真接口引出,使开发者可以使之参加开发者自己的板子调试功能,整块nucleo板子体积跟
市面上贩售的STlink体积几乎无差别。


接上电脑后,电脑会显示一个NODE-F042K6的盘符,同时nucleo板子上的LED会匀速闪烁,我们也可以发现,在板子引脚上看到一个
跳线帽,当跳线帽被拔出后,Nucleo板子上的LED闪烁速度会变快。


小结
简单介绍了ST最新推出的STM32F042 Nucleo32开发板,板子兼容Arduino Nano接口设计,板载STLink/V2-1,支持ARM mbed在线编译器以及第三方IDE开发工具,简单,易用,方便,是作为我们开发者学习和开发产品的非常好的一个选择!

STM32F042评测之:玩玩串口+GPIO
    添加味道,上午对STM32F042做了比较简单的介绍,现在我们来让nucleo32跑起来!
    为了省时,我使用了CubeMx作为架构生成平台:
STEP 1:
        打开CubeMx软件,并且选择Board Selector,Verdor选择默认,Type of board 选择Nucleo32,Mcu Series选择STM32F0,然后确定完成
芯片,板型号选择步骤。


STEP 2:
进行引脚,外设配置,在这里,芯片默认会使用内部RC8M作为系统时钟,哥不喜欢,哥喜欢快,所以点击Clock Configuration:显示时钟配置界面,
然后选用HSI RC 48Mhz作为系统时钟,详细配置如图所示:

然后,我们继续进行芯片外设引脚配置,第一,使用uart2(nuceleo32 F042使用usart2连接stlink 的vcp)所以我们不需要另外的转串口工具。
配置如图所示:

我们采用异步串口,所以选用Asynchronous,这里我们还没有完毕,我们还需要配置uart的参数,我们采用115200,8-n-1配置
1、点击configuration:
2、双击connectivity中的USART2
3、Baud Rate选项输入115200
4、Word Length 选择8bit,其他保持默认
5、点击Apply,OK
6、此时我们已经完成了串口的发送,接收功能配置


接下来,我们配置LED,板载LED连接PB3
所以我直接配置PB3为output,其实我们可以看出,芯片默认已经有串口的引脚配置了,我们只需要使能Usart2即可,如果没有
我们也可以设置PA2为USART2_TX,PA15为USART2_RX
配置好后,如下图所示

SETP 3:
这样,板子硬件我们已经配置好了,接下来就是生成工程,点击toolbar上的齿轮符号(Generate source code based on user settings),
会弹出Project settings窗口,分别输入project name(项目名) project location(项目路径) IDE(项目工作平台),
然后切换到Code Generator界面并且按照如下如所示设置即可:

最后我们按确定,open project,项目环境就建立好了

STEP 4:
编辑User Code:
编辑LED的翻转函数
  1.     #define LED_PORT            GPIOB
  2.     #define LED_PIN             GPIO_PIN_3
  3.     #define LED_GREEN_TOGGLE    HAL_GPIO_TogglePin(LED_PORT,LED_PIN)
复制代码
编辑main函数:
  1.     /* USER CODE BEGIN WHILE */
  2.       while (1)
  3.       {
  4.         uint32_t wSysClock;
  5.         /* USER CODE END WHILE */

  6.         /* USER CODE BEGIN 3 */
  7.         wSysClock = HAL_RCC_GetSysClockFreq();
  8.         printf("System Clock is :%ld",wSysClock);
  9.         HAL_UART_Transmit(&huart2,"my name is inc",sizeof("my name is inc"),1000);
  10.         LED_GREEN_TOGGLE;
  11.         HAL_Delay(1000);
  12.       }
  13.       /* USER CODE END 3 */
复制代码
因为我们在main中使用了printf,所以我们需要重定向printf函数:
我们打开usart.c
在user code区域中添加一下代码:
  1.     #pragma import(__use_no_semihosting)            
  2.                
  3.     struct __FILE
  4.     {
  5.             int handle;
  6.             /* Whatever you require here. If the only file you are using is */
  7.             /* standard output using printf() for debugging, no file handling */
  8.             /* is required. */
  9.     };
  10.     /* FILE is typedef’ d in stdio.h. */
  11.     FILE __stdout;      

  12.     void _sys_exit(int x)
  13.     {
  14.             x = x;
  15.     }

  16.     int fputc(int ch, FILE *f)
  17.     {      
  18.             while((USART2->ISR&0X40)==0);  
  19.             USART2->TDR = (uint8_t) ch;      
  20.             return ch;
  21.     }
复制代码

最后我们编译工程,并且下载,对于软件生成的工程,默认是没有设置stlink下载后的工作的,所以我们可以点击option,debug,stlink,setting,flash download,然后勾选reset and run,最后确定返回。
最后一步,下载工程。
以下是运行现象:



-------------------------------------------------------------
STM32F042 Nucleo32评测之SPI驱动OLED
   晚上回到家,小睡一下觉得无聊,试试用 STM32F042来玩玩OLED,硬件平台当然是我们的Nucleo32主角了。
OLED驱动方式有很多,而我手上的OLED接口均为SPI,SPI速度快,占用IO少,比IIC速度快许多,适合刷屏。
关于SPi,为了省时间,我么仍然用CubeMx软件生成。

首先,打开我们之前的工程。按照之前的步骤在Pin界面上配置外设,由于我们的OLED具有SPI加普通IO组成,
所以,我们打开SPI,模式选用Transmit Only Master,因为OLED的SPI模式下是没法进行读取的,所以我们也不需要
设置双工了,直接发送即可,另外,我们还得设置软件SPI_CS,OLED_REC, OLED_DC这3个控制IO,均设置为Output,
具体请看下图:

然后,我们选中Configuration,并且双击SPI1,设置DataSize为8bit,First Bit为MSB First(高位在前),分频系数为4,即
SPI时钟速度为12Mbit/s, Clock Polarity(CPOL)为Low,CLOCK Phase(CPHA)为1 Edge,具体请看下图:
然后点击Apply, OK。

然后我们就可以生成工程了。

最后,我们把写好的OLED驱动文件加进工程,修改GPIO和OLED写数据命令函数即可结束:
关于详细修改,请看附件工程!


最后,我们把OLED驱动起来看看效果:


最后的最后,源代码工程附上:编译IDE:MDKV5
因为附件的OLED代码是完全由楼主自己想自己写出来的,所以可能写得比较难懂,没有其他的好看,所以喜欢的用自己的
驱动文件代替即可
Demo.rar (833.68 KB, 下载次数: 60)

小结:前面几个工程,建立起来只需要几分钟,足以体现出Nucleo32与CubeMx联合起来的强大之处,虽然楼主很少用
CubeMx,但是作为学习还是非常不错的!偷懒的时候这是很不错的工具!

  1. /**
  2.   ******************************************************************************
  3.   * File Name          : main.c
  4.   * Description        : Main program body
  5.   ******************************************************************************
  6.   *
  7.   * COPYRIGHT(c) 2016 STMicroelectronics
  8.   *
  9.   * Redistribution and use in source and binary forms, with or without modification,
  10.   * are permitted provided that the following conditions are met:
  11.   *   1. Redistributions of source code must retain the above copyright notice,
  12.   *      this list of conditions and the following disclaimer.
  13.   *   2. Redistributions in binary form must reproduce the above copyright notice,
  14.   *      this list of conditions and the following disclaimer in the documentation
  15.   *      and/or other materials provided with the distribution.
  16.   *   3. Neither the name of STMicroelectronics nor the names of its contributors
  17.   *      may be used to endorse or promote products derived from this software
  18.   *      without specific prior written permission.
  19.   *
  20.   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  23.   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  24.   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25.   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  26.   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  27.   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  28.   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29.   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.   *
  31.   ******************************************************************************
  32.   */
  33. /* Includes ------------------------------------------------------------------*/
  34. #include "stm32f0xx_hal.h"
  35. #include "spi.h"
  36. #include "usart.h"
  37. #include "gpio.h"

  38. /* USER CODE BEGIN Includes */
  39. #include "stdio.h"
  40. #include "bsp_OLED12864.h"

  41. /* USER CODE END Includes */

  42. /* Private variables ---------------------------------------------------------*/

  43. /* USER CODE BEGIN PV */
  44. /* Private variables ---------------------------------------------------------*/
  45. #define LED_PORT            GPIOB
  46. #define LED_PIN             GPIO_PIN_3
  47. #define LED_GREEN_TOGGLE    HAL_GPIO_TogglePin(LED_PORT,LED_PIN)
  48. /* USER CODE END PV */

  49. /* Private function prototypes -----------------------------------------------*/
  50. void SystemClock_Config(void);

  51. /* USER CODE BEGIN PFP */
  52. /* Private function prototypes -----------------------------------------------*/

  53. /* USER CODE END PFP */

  54. /* USER CODE BEGIN 0 */

  55. /* USER CODE END 0 */

  56. int main(void)
  57. {

  58.   /* USER CODE BEGIN 1 */

  59.   /* USER CODE END 1 */

  60.   /* MCU Configuration----------------------------------------------------------*/

  61.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  62.   HAL_Init();

  63.   /* Configure the system clock */
  64.   SystemClock_Config();

  65.   /* Initialize all configured peripherals */
  66.   MX_GPIO_Init();
  67.   MX_SPI1_Init();
  68.   MX_USART2_UART_Init();

  69.   /* USER CODE BEGIN 2 */
  70.     bsp_OLED_Init();
  71.     //OLED_DrawArea(0,0,100,100,1);
  72.     OLED_DrawFrame(0,0,50,50,1);
  73.     Repaint();

  74.   /* USER CODE END 2 */

  75.   /* Infinite loop */
  76.   /* USER CODE BEGIN WHILE */
  77.   while (1)
  78.   {
  79.       uint32_t wSysClock;
  80.   /* USER CODE END WHILE */

  81.   /* USER CODE BEGIN 3 */
  82.     wSysClock = HAL_RCC_GetSysClockFreq();
  83.     printf("System Clock is :%ld",wSysClock);
  84.     HAL_UART_Transmit(&huart2,"my name is inc",sizeof("my name is inc"),1000);
  85.     LED_GREEN_TOGGLE;
  86.     HAL_Delay(1000);
  87.   }
  88.   /* USER CODE END 3 */

  89. }

  90. /** System Clock Configuration
  91. */
  92. void SystemClock_Config(void)
  93. {

  94.   RCC_OscInitTypeDef RCC_OscInitStruct;
  95.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  96.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
  97.   RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  98.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  99.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI48;
  100.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  101.   RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
  102.   HAL_RCC_OscConfig(&RCC_OscInitStruct);

  103.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  104.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  105.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  106.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  107.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);

  108.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  109.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  110.   /* SysTick_IRQn interrupt configuration */
  111.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  112. }

  113. /* USER CODE BEGIN 4 */

  114. /* USER CODE END 4 */

  115. #ifdef USE_FULL_ASSERT

  116. /**
  117.    * @brief Reports the name of the source file and the source line number
  118.    * where the assert_param error has occurred.
  119.    * @param file: pointer to the source file name
  120.    * @param line: assert_param error line source number
  121.    * @retval None
  122.    */
  123. void assert_failed(uint8_t* file, uint32_t line)
  124. {
  125.   /* USER CODE BEGIN 6 */
  126.   /* User can add his own implementation to report the file name and line number,
  127.     ex: printf("Wrong parameters value: file %s on line %d", file, line) */
  128.   /* USER CODE END 6 */

  129. }

  130. #endif

  131. /**
  132.   * @}
  133.   */

  134. /**
  135.   * @}
  136. */

  137. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:129745 发表于 2016-7-8 21:24 | 只看该作者
下载不了,晕
回复

使用道具 举报

板凳
ID:141412 发表于 2016-10-6 09:18 | 只看该作者
来学习了~
回复

使用道具 举报

地板
ID:206752 发表于 2017-6-1 16:15 | 只看该作者
下载来看看,,,,,
回复

使用道具 举报

5#
ID:123924 发表于 2018-1-7 02:28 | 只看该作者
为保存而回复
回复

使用道具 举报

6#
ID:161151 发表于 2018-4-21 21:07 | 只看该作者
谢谢分享,学习中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表