|
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的翻轉函數
- #define LED_PORT GPIOB
- #define LED_PIN GPIO_PIN_3
- #define LED_GREEN_TOGGLE HAL_GPIO_TogglePin(LED_PORT,LED_PIN)
復制代碼 編輯main函數:
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- uint32_t wSysClock;
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- wSysClock = HAL_RCC_GetSysClockFreq();
- printf("System Clock is :%ld",wSysClock);
- HAL_UART_Transmit(&huart2,"my name is inc",sizeof("my name is inc"),1000);
- LED_GREEN_TOGGLE;
- HAL_Delay(1000);
- }
- /* USER CODE END 3 */
復制代碼 因為我們在main中使用了printf,所以我們需要重定向printf函數:
我們打開usart.c
在user code區域中添加一下代碼:- #pragma import(__use_no_semihosting)
-
- struct __FILE
- {
- int handle;
- /* Whatever you require here. If the only file you are using is */
- /* standard output using printf() for debugging, no file handling */
- /* is required. */
- };
- /* FILE is typedef’ d in stdio.h. */
- FILE __stdout;
- void _sys_exit(int x)
- {
- x = x;
- }
- int fputc(int ch, FILE *f)
- {
- while((USART2->ISR&0X40)==0);
- USART2->TDR = (uint8_t) ch;
- return ch;
- }
復制代碼
最后我們編譯工程,并且下載,對于軟件生成的工程,默認是沒有設置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)
2016-6-17 17:43 上傳
點擊文件名下載附件
小結:前面幾個工程,建立起來只需要幾分鐘,足以體現出Nucleo32與CubeMx聯合起來的強大之處,雖然樓主很少用
CubeMx,但是作為學習還是非常不錯的!偷懶的時候這是很不錯的工具!
- /**
- ******************************************************************************
- * File Name : main.c
- * Description : Main program body
- ******************************************************************************
- *
- * COPYRIGHT(c) 2016 STMicroelectronics
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of STMicroelectronics nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f0xx_hal.h"
- #include "spi.h"
- #include "usart.h"
- #include "gpio.h"
- /* USER CODE BEGIN Includes */
- #include "stdio.h"
- #include "bsp_OLED12864.h"
- /* USER CODE END Includes */
- /* Private variables ---------------------------------------------------------*/
- /* USER CODE BEGIN PV */
- /* Private variables ---------------------------------------------------------*/
- #define LED_PORT GPIOB
- #define LED_PIN GPIO_PIN_3
- #define LED_GREEN_TOGGLE HAL_GPIO_TogglePin(LED_PORT,LED_PIN)
- /* USER CODE END PV */
- /* Private function prototypes -----------------------------------------------*/
- void SystemClock_Config(void);
- /* USER CODE BEGIN PFP */
- /* Private function prototypes -----------------------------------------------*/
- /* USER CODE END PFP */
- /* USER CODE BEGIN 0 */
- /* USER CODE END 0 */
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- /* USER CODE END 1 */
- /* MCU Configuration----------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* Configure the system clock */
- SystemClock_Config();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_SPI1_Init();
- MX_USART2_UART_Init();
- /* USER CODE BEGIN 2 */
- bsp_OLED_Init();
- //OLED_DrawArea(0,0,100,100,1);
- OLED_DrawFrame(0,0,50,50,1);
- Repaint();
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- uint32_t wSysClock;
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- wSysClock = HAL_RCC_GetSysClockFreq();
- printf("System Clock is :%ld",wSysClock);
- HAL_UART_Transmit(&huart2,"my name is inc",sizeof("my name is inc"),1000);
- LED_GREEN_TOGGLE;
- HAL_Delay(1000);
- }
- /* USER CODE END 3 */
- }
- /** System Clock Configuration
- */
- void SystemClock_Config(void)
- {
- RCC_OscInitTypeDef RCC_OscInitStruct;
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
- RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI48;
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
- RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
- HAL_RCC_OscConfig(&RCC_OscInitStruct);
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
- HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
- HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
- /* SysTick_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
- }
- /* USER CODE BEGIN 4 */
- /* USER CODE END 4 */
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval None
- */
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* USER CODE BEGIN 6 */
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d", file, line) */
- /* USER CODE END 6 */
- }
- #endif
- /**
- * @}
- */
- /**
- * @}
- */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
復制代碼
|
|