天天看點

STM32建立模闆之寄存器

建立寄存器的項目模闆相對比較簡單,這裡是基于庫檔案的模闆進行更改的,有不明白的小夥伴可以浏覽STM32建立模闆之庫檔案。

一、項目檔案

  1. 拷貝庫檔案的工程模闆重命名為“stm32f10x_register”
    STM32建立模闆之寄存器
  2. 删除STM32F10x_FWLib檔案
    STM32建立模闆之寄存器
  3. 删除CMSIS中不要的檔案,保留startup、core_cm3.h、stm32f10x.h檔案
    STM32建立模闆之寄存器
  4. 删除USER中不要的檔案,保留main.c檔案,其餘的全部删除,并建立sys.c和sys.h檔案
    STM32建立模闆之寄存器

二、建立工程項目

  1. 打開Keil軟體,建立項目,項目名為STM32F10x_Temp
    STM32建立模闆之寄存器
    STM32建立模闆之寄存器
    STM32建立模闆之寄存器
  2. 添加GROUP,添加兩個個GROUP,并改名為startup、USER
    STM32建立模闆之寄存器
    STM32建立模闆之寄存器
    STM32建立模闆之寄存器
  3. 為每個GROUP添加檔案
  • startup,将檔案startup_stm32f10x_hd.s添加到startup下
    STM32建立模闆之寄存器
  • USER,将檔案main.c、sys.c檔案添加到USER下
    STM32建立模闆之寄存器
  • 添加完成後如下圖所示:
    STM32建立模闆之寄存器
  1. 設定編譯檔案的輸出路徑
    STM32建立模闆之寄存器
    STM32建立模闆之寄存器
    STM32建立模闆之寄存器
  2. 設定預設編譯版本
    STM32建立模闆之寄存器
  3. 設定頭檔案路徑
    STM32建立模闆之寄存器

三、程式修改

  1. 修改startup_stm32f10x_hd.s
    STM32建立模闆之寄存器
    将圖中的内容更改後如下圖所示:
    STM32建立模闆之寄存器
  2. sys.c檔案
#include "stm32f10x.h"

#define uint unsigned int
#define uchar unsigned char

#define CLOCK 72/8 //時鐘=72M

/*------------------------------------------------------------
                         us延時函數 
------------------------------------------------------------*/
void delay_us(unsigned int us)
{
	u8 n;		    
	while(us--)for(n=0;n<CLOCK;n++); 	 
}

/*------------------------------------------------------------
                         ms延時函數
------------------------------------------------------------*/
void delay_ms(unsigned int ms)
{
	while(ms--)delay_us(1000);	 
}

/*------------------------------------------------------------
                      把所有時鐘寄存器複位
------------------------------------------------------------*/
void RCC_DeInit(void)
{									   
	RCC->APB2RSTR = 0x00000000;//外設複位			 
	RCC->APB1RSTR = 0x00000000;   	  
  	RCC->AHBENR = 0x00000014;  //flash時鐘,閃存時鐘使能.DMA時鐘關閉	  
  	RCC->APB2ENR = 0x00000000; //外設時鐘關閉.			   
  	RCC->APB1ENR = 0x00000000;   
	RCC->CR |= 0x00000001;     //使能内部高速時鐘HSION	 															 
	RCC->CFGR &= 0xF8FF0000;   //複位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]					 
	RCC->CR &= 0xFEF6FFFF;     //複位HSEON,CSSON,PLLON
	RCC->CR &= 0xFFFBFFFF;     //複位HSEBYP	   	  
	RCC->CFGR &= 0xFF80FFFF;   //複位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
	RCC->CIR = 0x00000000;     //關閉所有中斷
}


/*------------------------------------------------------------
                  外部8M,則得到72M的系統時鐘
------------------------------------------------------------*/	
void Stm32_Clock_Init(void)
{
	unsigned char temp=0;
	u8 timeout=0;
	RCC_DeInit();
	RCC->CR|=0x00010000;  //外部高速時鐘使能HSEON

	timeout=0;
	while(!(RCC->CR>>17)&&timeout<200)timeout++;//等待外部時鐘就緒	 

	//0-24M 等待0;24-48M 等待1;48-72M等待2;(非常重要!)	   
	FLASH->ACR|=0x32;//FLASH 2個延時周期

	RCC->CFGR|=0X001D2400;//APB1/2=DIV2;AHB=DIV1;PLL=9*CLK;HSE作為PLL時鐘源
	RCC->CR|=0x01000000;  //PLLON

	timeout=0;
	while(!(RCC->CR>>25)&&timeout<200)timeout++;//等待PLL鎖定

	RCC->CFGR|=0x00000002;//PLL作為系統時鐘
	while(temp!=0x02&&timeout<200)     //等待PLL作為系統時鐘設定成功
	{   
		temp=RCC->CFGR>>2;
		timeout++;
		temp&=0x03;
	}  
}

           
  1. sys.h檔案
#ifndef __SYS_H
#define __SYS_H	   

//us延時函數 
void delay_us(unsigned int us);
//ms延時函數
void delay_ms(unsigned int ms);
//把所有時鐘寄存器複位
void RCC_DeInit(void);
//外部8M,則得到72M的系統時鐘	
void Stm32_Clock_Init(void);

#endif

           
  1. main.c檔案
#include "stm32f10x.h"
#include "sys.h"
	
/*------------------------------------------------------------
                           主函數
------------------------------------------------------------*/
int main()
{
    
	Stm32_Clock_Init();//系統時鐘設定
	RCC->APB2ENR |= 0x00000001; //開啟afio時鐘
        //AFIO->MAPR = (0x00FFFFFF & AFIO->MAPR)|0x04000000;          //關閉JTAG 
				

	RCC->APB2ENR|=0X0000001c;//先使能外設IO PORTa,b,c時鐘

	GPIOB->CRH=0X33333333;    //推挽輸出
	GPIOB->CRL=0X33333333;    //推挽輸出

	while (1)
	{			
		delay_ms(1000);     	 
		GPIOB->ODR=0;	  		 //全部輸出0

		delay_ms(1000);
		GPIOB->ODR=0xffffffff;	 //全部輸出1 

	  
	}
}

           

四、編譯下載下傳

  1. 編譯程式
    STM32建立模闆之寄存器
  2. 通過isp下載下傳程式
    STM32建立模闆之寄存器
  3. 下載下傳完成後,可以看到LED燈會進行閃爍則說明項目建立成功,到此寄存器闆的工程模闆比庫檔案的建立簡單。

如本部落格的内容侵犯了你的權益,請與以下位址聯系,本人獲知後,馬上删除。同時本人深表歉意,并緻以崇高的謝意!

[email protected]