新手入門 keil MDK5 建立STM32工程


keil uvison 是用來開發 單片機的,Keil mdk 是用來開發 ARM 的。

芯片型號是:STM32F103RB6

1,新建工程

配置屬性

晶振為8M 根據實際晶振選擇

生成 HEX 文件,選中

 

2,復制啟動文件,頭文件,這里為了簡單,全部放在了項目文件夾中,不像有的教程,要建這個,配置那個,新手容易頭大。

啟動文件在,STM32F10x_StdPeriph_Lib_V3.5.0.rar 里面,解壓LIB庫文件。

復制 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 里面的 core_cm3.h core_cm3.c 到項目文件夾中。

復制 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 里面的 3個文件 stm32f10x.h system_stm32f10x.c  system_stm32f10x.h 到項目文件夾中。

復制啟動文件 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 里面的 startup_stm32f10x_md.s

md hd ld 根據芯片FLASH 容量決定用哪個。

16K < FLASH < 32K ld
64K < FLASH < 128K md
256K < FLASH < 512K hd

文件復制好以后就是這個樣子。

雙擊,添加文件到項目中。

 

新建一個 main.c 文件,並添加到項目中。

 1 #include "stm32f10x.h"
 2 #include "bitband.h"
 3 
 4 void delay()
 5 {
 6     int i=30000;
 7       while(i--);
 8 }
 9 
10 int main(void)
11 {
12     //初始化引腳
13     //PA2 接 BEEP    
14       //初始化 PA 時鍾
15       RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
16       //配置引腳模式
17       GPIOA->CRL &= ~(0x3<<(4*2+2));
18       GPIOA->CRL |= 0x3<<(4*2);
19     
20         while(1)
21         {
22               GPA_ODR(2) = 1;
23               delay();
24               GPA_ODR(2) = 0;
25               delay();
26         }
27     return 0;
28 }

 

bitband.h 是一個 bit 位映射功能 操作時簡單,不用比較位,節省時間。
 1 /**
 2  * (*(volatile unsigned long *) 是 先把一個 long 數字轉為指針 在加 * 就是取它的內容
 3  * volatile 是告訴編譯器不要優化
 4  */
 5 #define BITBAND(addr, bitnum) ((addr&0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
 6 #define MEM_ADDR(addr) *((volatile unsigned long  *)(addr)) 
 7 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) 
 8 
 9 #define GPA_IDR(n) BIT_ADDR(GPIOA_BASE+0x8, n)
10 #define GPB_IDR(n) BIT_ADDR(GPIOB_BASE+0x8, n)
11 #define GPC_IDR(n) BIT_ADDR(GPIOC_BASE+0x8, n)
12 #define GPD_IDR(n) BIT_ADDR(GPIOD_BASE+0x8, n)
13 #define GPE_IDR(n) BIT_ADDR(GPIOE_BASE+0x8, n)
14 
15 #define GPA_ODR(n) BIT_ADDR(GPIOA_BASE+0xc, n)
16 #define GPB_ODR(n) BIT_ADDR(GPIOB_BASE+0xc, n)
17 #define GPC_ODR(n) BIT_ADDR(GPIOC_BASE+0xc, n)
18 #define GPD_ODR(n) BIT_ADDR(GPIOD_BASE+0xc, n)
19 #define GPE_ODR(n) BIT_ADDR(GPIOE_BASE+0xc, n)
20 #define GPF_ODR(n) BIT_ADDR(GPIOF_BASE+0xc, n)
21 
22 #define GPA_BSRR(n) BIT_ADDR(GPIOA_BASE+0x10, n)
23 #define GPB_BSRR(n) BIT_ADDR(GPIOB_BASE+0x10, n)
24 #define GPC_BSRR(n) BIT_ADDR(GPIOC_BASE+0x10, n)
25 #define GPD_BSRR(n) BIT_ADDR(GPIOD_BASE+0x10, n)
26 #define GPE_BSRR(n) BIT_ADDR(GPIOE_BASE+0x10, n)
27 #define GPF_BSRR(n) BIT_ADDR(GPIOF_BASE+0x10, n)
28 
29 #define GPA_BRR(n) BIT_ADDR(GPIOA_BASE+0x14, n)
30 #define GPB_BRR(n) BIT_ADDR(GPIOB_BASE+0x14, n)
31 #define GPC_BRR(n) BIT_ADDR(GPIOC_BASE+0x14, n)
32 #define GPD_BRR(n) BIT_ADDR(GPIOD_BASE+0x14, n)
33 #define GPE_BRR(n) BIT_ADDR(GPIOE_BASE+0x14, n)
34 #define GPF_BRR(n) BIT_ADDR(GPIOF_BASE+0x14, n)

這里的 0xc 0x8 0x10 就是根據 寄存器的位置來決定的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM