- ดาวน์โหลด ST-LINK/V2 USB ที่นี่ โดยเลือกให้ตรงกับระบบปฏิบัติการที่ใช้ แล้วทำการติดตั้ง ใช้สำหรับการ Debug โปรแกรม
- ดาวน์โหลดโปรแกรม STM32CubeMX ที่นี่ แล้วทำการติดตั้ง ใช้ในการ Generate Code เพื่อใช้งาน HAL Library
- ดาวน์โหลดโปรแกรม Em::Blocks ที่นี่ แล้วทำการติดตั้ง ใช้สำหรับการเขียนโค้ดและ Debug เพื่อใช้งานกับบอร์ด STM32F3Discovery
- ดาวน์โหลดโปรแกรม CubeMX2EmBlocks ที่นี่ เพื่อใช้สำหรับการเปลี่ยนแปลงโค้ดที่ Generate ได้จากโปรแกรม STM32CubeMX ให้สามารถใช้งานกับโปรแกรม Em::Blocks ได้
- เริ่มต้นการสร้างไฟกระพริบโดยเปิดโปรแกรม STM32CubeMX แล้วเลือก New Project

สร้าง Project ใหม่ใน STM32CubeMX - หลังจากนั้นเลือกบอร์ดเป้าหมาย ดังภาพด้านล่าง

เลือกบอร์ดที่ใช้งานในที่นี้คือ STM32F3Discovery - หลังจากนั้นเข้าไปตั้งค่าการ Generate Code โดยเข้าไปที่เมนู Project >> Settings ... ทำการตั้งชื่อโปรเจ็ค, เลือกโฟลเดอร์สำหรับบันทึกโปรเจ็ค และทำการเลือก Toolchain/IDE เป็น TrueSTUDIO ดังภาพด้านล่าง ซึ่งในการใช้งานโปรแกรมครั้งแรกจะต้องมีการเชื่อมต่ออินเตอร์เน็ตเพราะโปรแกรมจะทำการดาวน์โหลด Firmware หลังจากที่การตั้งค่าเสร็จสิ้น

ตั้งค่าการ Generate Code - ทำการ Generate Code โดยเข้าไปที่เมนู Project >> Generate Code จะได้โฟลเดอร์ของโปรเจ็คตามที่ได้ตั้งค่าไว้
- เปิดโปรแกรม CubeMX2EmBlocks แล้วกดปุ่ม Select Project Folder เลือกไปยังโฟลเดอร์ที่ Generate จากขั้นตอนที่ 8. หากสำเร็จจะแสดงหน้าต่างดังภาพด้านล่าง
- เปิดโปรแกรม Em::Blocks แล้วเข้าไปที่เมนู File >> Open... ให้เลือกไปยังโฟลเดอร์ที่ผ่านขั้นตอนที่ 9. มาแล้ว หลังจากนั้นเลือกเปิดไฟล์ที่มีนามสกุลเป็น .ebp และกดปุ่ม Open เพื่อเป็นการเปิด Emblocks Project
- เปิดไฟล์ main.c ที่อยู่ภายในโปรเจ็คขึ้นมา เพื่อทำการเขียนโปรแกรมไฟกระพริบ

เปิดไฟล์ main.c เพื่อเขียนโปรแกรมไฟกระพริบ - เมื่อเปิดไฟล์ main.c แล้วจะพบว่ามีโค้ดที่ได้จากการ Generate Code มาแล้ว ให้เราทำการเพิ่มโค้ดคือ การเพิ่มฟังก์ชัน delay() และเพิ่มโค้ดในลูป while เพื่อทำให้ไฟ LED กระพริบ ดังต่อไปนี้
. . . void delay(){ int i; for(i=0; i<2000000; i++) __ASM("nop"); } int main(void) { . . . while (1) { /* USER CODE END WHILE */ HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_11); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15); delay(); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_12); delay(); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_9); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_13); delay(); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_10); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_14); delay(); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } - ดังนั้นโค้ดทั้งหมดในไฟล์ main.c จะมีลักษณะดังต่อไปนี้
/** ****************************************************************************** * File Name : main.c * Date : 02/04/2015 10:22:56 * Description : Main program body ****************************************************************************** * * COPYRIGHT(c) 2015 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 "stm32f3xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ void delay(){ int i; for(i=0; i<2000000; i++) __ASM("nop"); } 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(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_11); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15); delay(); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_12); delay(); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_9); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_13); delay(); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_10); HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_14); delay(); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Configuration */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1); __SYSCFG_CLK_ENABLE(); } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI PA11 ------> USB_DM PA12 ------> USB_DP PB6 ------> I2C1_SCL PB7 ------> I2C1_SDA */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __GPIOE_CLK_ENABLE(); __GPIOC_CLK_ENABLE(); __GPIOF_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); __GPIOB_CLK_ENABLE(); /*Configure GPIO pins : PE2 PE4 PE5 PE0 PE1 */ GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_0 |GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pins : PE3 PE8 PE9 PE10 PE11 PE12 PE13 PE14 PE15 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 |GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PA5 PA6 PA7 */ GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PA11 PA12 */ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF14_USB; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PB6 PB7 */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /* 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\r\n", file, line) */ /* USER CODE END 6 */ } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - เมื่อเขียนโค้ดเสร็จแล้วให้ทำการ Build โดยเข้าไปที่เมนู Build >> Build target หรือกดปุ่ม F7 หลังจากนั้นต่อบอร์ด STM32F3Discovery กับคอมพิวเตอร์แล้วทำการ Debug โดยเข้าไปที่เมนู Debug >> Start/stop Debug Session หรือกดปุ่ม F8 หลังจากเสร็จสิ้นแล้ว ให้กดปุ่ม Reset ที่บอร์ดเพื่อเริ่มการทำงานของโปรแกรม
วันอาทิตย์ที่ 5 เมษายน พ.ศ. 2558
[STM32F3] Blinking LED โดยโปรแกรม Em::Blocks
ในบทความนี้จะกล่าวถึงวิธีการทำไฟกระพริบด้วยบอร์ด STM32F3Discovery โดยใช้โปรแกรม Em::Blocks ในการเขียนโค้ด ซึ่งมีวิธีการดังต่อไปนี้
สมัครสมาชิก:
ส่งความคิดเห็น (Atom)

ไม่มีความคิดเห็น:
แสดงความคิดเห็น