ARM入門
- 一、所需軟體環境
- 二、參考教程
- 三、實驗及步驟
- (一)MDK5的stm32開發
- (二)Proteus 8 Professional仿真
- 四、出現的問題與總結
一、所需軟體環境
我使用的是MDK5.10以及兩個包
ARM.CMSIS.3.20.4.pack
Keil.STM32F1xx_DFP.1.0.4.pack
仿真實驗所需軟體Proteus 8 Professional
二、參考教程
手動配置環境點我跳轉B站
MDK5內配置湖廣午王代碼編譯可能會出現很多錯誤,我是網上隨便找的一個代碼,
Proteus 8 Professional入門介紹這里
三、實驗及步驟
(一)MDK5的stm32開發
1.安裝ARM和STM包
安裝完MDK5.10后,安裝所需的兩個包,其它包以后有需要再安裝,建議離線安裝,雙擊即可安裝,
2.新建工程
點擊Project,再點擊新建工程,選擇路徑,

3.選擇芯片
理論上一類芯片都可以用以下代碼,我選擇的是STM32F103C8,

4.配置環境
選擇以下環境,如果選擇GPIO,會出現很多的問題,建議先不要選,
5.撰寫主程式

//宏定義,用于存放stm32暫存器映射
#define PERIPH_BASE ((unsigned int)0x40000000)//AHB
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
//GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,該地址為GPIOA的基地址
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
//GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,該地址為GPIOB的基地址
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,該地址為GPIOC的基地址
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
//GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,該地址為GPIOD的基地址
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
//GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,該地址為GPIOE的基地址
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
//GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,該地址為GPIOF的基地址
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
//GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,該地址為GPIOG的基地址
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))
//#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8
//定義typedef型別別名
typedef struct
{
volatile unsigned int CR;
volatile unsigned int CFGR;
volatile unsigned int CIR;
volatile unsigned int APB2RSTR;
volatile unsigned int APB1RSTR;
volatile unsigned int AHBENR;
volatile unsigned int APB2ENR;
volatile unsigned int APB1ENR;
volatile unsigned int BDCR;
volatile unsigned int CSR;
} RCC_TypeDef;
#define RCC ((RCC_TypeDef *)0x40021000)
//定義typedef型別別名
typedef struct
{
volatile unsigned int CRL;
volatile unsigned int CRH;
volatile unsigned int IDR;
volatile unsigned int ODR;
volatile unsigned int BSRR;
volatile unsigned int BRR;
volatile unsigned int LCKR;
} GPIO_TypeDef;
//GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的資料型別為GPIO_TypeDef
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
void LEDInit( void )
{
RCC->APB2ENR|=1<<2; //GPIOA 時鐘開啟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;
}
//粗略延時
void Delay_ms( volatile unsigned int t)
{
unsigned int i,n;
for (n=0;n<t;n++)
for (i=0;i<800;i++);
}
int main(void)
{
LEDInit();
while (1)
{
LED0=0;//LED熄滅
Delay_ms(500);//延時時間
LED0=1;//LED亮
Delay_ms(500);//延時時間
}
}
編譯成功后就是這樣
(二)Proteus 8 Professional仿真
打開軟體,選擇新建工程,
注:AT89C51芯片所需的編譯包,需要到官網或者其它渠道獲得,我是在網上找的.hex檔案和代碼,用來熟悉操作,
1.連接電路

2.編輯對應的.hex檔案
左鍵點擊AT89C51芯片,在Program File里選擇.hex檔案
也可以右鍵點擊AT89C51芯片,點擊Edit Source Code,選擇環境和編譯器,再撰寫代碼進行編譯,(參考這里)

3.運行效果
四、出現的問題與總結
編譯stm32時出現以下問題

建議新手先不要用GPIO,如果有大佬能夠幫忙解答,十分感謝!(已經百度過了,還是無法解決)
如果出現.\test2.axf: error: L6002U: Could not open file .\main.o: No such file問題可以解決,但是用戶的一些資料會改變(僅修改用戶),
總結:新手用MDK來開發stm先要熟悉流程,然后再深入學習其中的一些原理和操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/166670.html
標籤:其他
上一篇:Flink深入淺出: 應用部署與原理圖解(v1.11)
下一篇:csdn積分獲取方法
