Keil uVision5 如何新建專案(不使用官方的函式庫)
在介紹開始前,先把一些重要資料先蒐集到,方便我們後續的程式撰寫,按一下名稱就可以下載了。
開發環境:MDK 5.20
使用MCU:STM32F051R8T6
1.開發板燒錄器:
2.開發板電路訊息:
3.STM32F0時脈設定工具:
開始要來建立第一個專案,亮滅一個LED當作測試。
STEP1:
執行 Keil uVision5 軟體,選擇 Project->New uVision Project...
STEP2:
選擇儲存目錄和輸入檔案名稱之後,再存檔
STEP3:
選擇Device(STM32F051R8)之後,再選OK完成
STEP4:
選擇CMSIS->CORE 和 Device->Startup 兩項打勾,再選擇OK完成
STEP5:
滑鼠選擇Source Group 1 後,按滑鼠右鍵選擇 Add New Item to Group 'Source Group 1'...,
再選擇C File(.c),並在Name欄位輸入 main,再選擇Add完成
STEP6:
開始寫main.c,代碼如下
#include "stm32f0xx.h" // File name depends on device used #include "RTE_Components.h" // Component selection volatile uint32_t msTicks; // Counter for millisecond Interval /*--------------------------------------------------------------------------------*/ // SysTick Interrupt Handler /*--------------------------------------------------------------------------------*/ void SysTick_Handler(void) { msTicks++; // Increment Counter } /*--------------------------------------------------------------------------------*/ // Delay: delay a number of Systicks /*--------------------------------------------------------------------------------*/ void Delay(uint32_t dlyTicks) { uint32_t currentTicks; currentTicks = msTicks; while((msTicks - currentTicks) < dlyTicks) __NOP(); } /*--------------------------------------------------------------------------------*/ // Configure SystemCoreClock using HSI /*--------------------------------------------------------------------------------*/ void ConfigureSystemClock(void) { RCC->CR |= ((uint32_t)RCC_CR_HSION); // Enable 8MHz HSI RC while ((RCC->CR & RCC_CR_HSIRDY) == 0) __NOP(); // Wait for HSI Ready RCC->CFGR = RCC_CFGR_SW_HSI; // Set HSI as system clock while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // Wait for HSI used as system clock FLASH->ACR = FLASH_ACR_PRFTBE; // Enable Prefetch Buffer FLASH->ACR |= FLASH_ACR_LATENCY; // Flash 1 wait state RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // HCLK = SYSCLK RCC->CFGR |= RCC_CFGR_PPRE_DIV1; // PCLK = HCLK RCC->CR &= ~RCC_CR_PLLON; // Disable PLL to set PLL clk // PLL configuration: = HSI/2 * 12 = 48 MHz RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMUL); #if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F070x6) \ || defined(STM32F078xx) || defined(STM32F071xB) || defined(STM32F072xB) \ || defined(STM32F070xB) || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC) /* HSI used as PLL clock source : SystemCoreClock = HSI/PREDIV * PLLMUL */ RCC->CFGR2 = (RCC_CFGR2_PREDIV_DIV2); RCC->CFGR |= (RCC_CFGR_PLLSRC_HSI_PREDIV | RCC_CFGR_PLLMUL12); #else /* HSI used as PLL clock source : SystemCoreClock = HSI/2 * PLLMUL */ RCC->CFGR |= (RCC_CFGR_PLLSRC_HSI_DIV2 | RCC_CFGR_PLLMUL12); #endif RCC->CR |= RCC_CR_PLLON; // Enable PLL while((RCC->CR & RCC_CR_PLLRDY) == 0) __NOP(); // Wait till PLL is ready RCC->CFGR &= ~RCC_CFGR_SW; // Select PLL as system clock source RCC->CFGR |= RCC_CFGR_SW_PLL; while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); // Wait till PLL is system clock src } /*--------------------------------------------------------------------------------*/ // GPIOC_Init /*--------------------------------------------------------------------------------*/ void GPIOC_Init(void) { RCC->AHBENR |= (1ul << 19); // Enable GPIOC clock /* Configure LED (PC.8) pins as push-pull outputs, No pull-up, pull-down */ GPIOC->MODER &= ~((3ul << 2*8)); // set GPIOC pin 8 as output pin GPIOC->MODER |= ((1ul << 2*8)); // 01: General purpose output mode GPIOC->OTYPER &= ~((1ul << 8)); // set pin 8 as O/P push-pull GPIOC->OSPEEDR &= ~((3ul << 2*8)); // set pin 8 as medium speed O/P GPIOC->OSPEEDR |= ((1ul << 2*8)); GPIOC->PUPDR &= ~((3ul << 2*8)); // set pin 8 as no pull-up & pull-down } /*--------------------------------------------------------------------------------*/ // LED_on(); Turn on LED /*--------------------------------------------------------------------------------*/ void LED_on(void) { GPIOC->BSRR |= ((1ul << 8)); // set pin 8 = 1 to turn on LED } /*--------------------------------------------------------------------------------*/ // LED_off(); Turn off LED /*--------------------------------------------------------------------------------*/ void LED_off(void) { GPIOC->BSRR |= (1ul << (8+16)); // set pin 8 = 0 to turn off LED } /*--------------------------------------------------------------------------------*/ // The processor clock is initialized by CMSIS startup + system file /*--------------------------------------------------------------------------------*/ // User application starts here int main(void) { ConfigureSystemClock(); // Configure system clock SystemCoreClockUpdate(); // Set system clock value to variable SystemCoreClock GPIOC_Init(); // Initialize GPIOC pin 8 to control LED //System Tick Configuration: Initializes the System Timer and its interrupt, // and starts the System Tick Timer. // Counter is in free running mode to generate periodic interrupts. // param [in] ticks Number of ticks between two interrupts. SysTick_Config(SystemCoreClock/1000); // set up SysTick 1ms interrupt while(1) { LED_on(); Delay(1000); LED_off(); Delay(1000); } }
STEP7:
設定一些參數,以利於編譯源代碼
先選擇左邊的Project->Target1->Options for Target 'Target 1'... ,會開一個視窗,如圖片並依照相關選項選取後,再點選OK完成。
STEP8:
選擇選單Project->Build Target ,或是下圖點選Icon並編譯。
STEP9:
選擇選單Flash->Download,或是下圖點選Icon,並燒錄到開發板上(必須將開發闆接到電腦並安裝完驅動)。
STEP10:
這樣就完成,LED(PC8)就會一秒亮,一秒滅的循環,如圖片為實物和PC8所量測出的波形。