嵌入式系統第三週ARM開發環境入門

無由無發表於2020-10-08

STM32底座實驗指導書第3章的LED閃爍

1、實驗目的

安裝mdk5軟體和stm32包,熟悉mdk開發環境,完成一個stm32的簡單程式的編譯。

2、 軟體安裝

在win10下安裝mdk5和stm32pack麻煩請參考Win10下MDK5及stm32pack的安裝教程

3、mdk5的程式編譯

  1. 新建工程
    stmled1
  2. 選擇開發板
    stmled2
  3. 新建main.c檔案
    stmled3
  4. 進行編譯,編譯無錯
    stmled4
  5. 進行除錯,除錯成功
    stmled5
  6. 程式碼如下
//巨集定義,用於存放stm32暫存器對映
#define PERIPH_BASE           ((unsigned int)0x40000000)
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
//該地址為GPIOA的基地址 
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)
#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))
//定義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 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;
#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;
        Delay_ms(500);
        LED0=1;
        Delay_ms(500);
    }
}

Proteus 電路51程式設計和模擬

1、實驗目的

安裝並熟悉Proteus 電路模擬軟體,完成一個51程式設計和模擬

2、安裝C51支援包

在這裡插入圖片描述

程式設計和模擬

1.新建工程和C51LED.c檔案

該過程與上面mdk類似,這是我最後建立的結果
在這裡插入圖片描述
這是程式碼,借鑑了網上的資源

#include"reg51.h"		
#include"intrins.h"		//左右移函式標頭檔案
void delay1ms(unsigned char c)  //c=1時,大約為1ms
{  
	unsigned char a,b;  
	for(c ;c>0;c--)  
		for(b=142;b>0;b--)  
			for(a=2;a>0;a--);  
}

void main()
{
	unsigned char led,i; //設定兩個變數
	led=0xfe;  
	delay1ms(100); //大約延時100ms	
	while(1)
	{										  	
		for(i=0;i<7;i++)	   
		{
			P2=led;   
			delay1ms(100); 
			led=_crol_(led,1);	//左移函式,將led左移一位   _crol_(“變數”,“位數”)
		}
		for(i=0;i<7;i++)    //同上for的作用
		{
			P2=led;	
			delay1ms(100);
			led=_cror_(led,1);	 	//右移函式,將led右移一位
		}										
	}		
}

2. 編譯完成得到.hex檔案

在這裡插入圖片描述

3.在proteus繪圖中插入.hex檔案

在這裡插入圖片描述

4.執行得到結果

在這裡插入圖片描述

總結

這次實驗對於我們來說很有挑戰性,主要是這些一點沒學過,純粹從零開始。在這過程中有很多問題,還好網上無論是答疑還是教程都很多,所以勉勉強強還是完成了。當然,我做的很一般,有很多都是借鑑的網上的,有些地方不夠完善,甚至有些地方是錯誤的,還請不吝賜教。

相關文章