STM32复习

107 阅读12分钟
        首先学习寄存器版本的建立工程

1. 使用的软件是keil5
2. 建立文件夹分别为Listing   Output   LED
3. LED 存放 startup_stm32f429_439xx.s、 stm32f4xx.h、 main.c 文件   
4. Listing 暂时为空  Output 暂时为空

新建工程后,需要添加启动代码
1. startup_stm32f429_439xx.s 启动文件,系统上电后第一个运行的程序,由汇编编写 。

2. 文件在这个目录:F4 固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\Libraries
\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f429_439xx.s 

3. stm32f4xx.h  用户手动新建,用于存放寄存器映射的代码,暂时为空。 



#include "stm32f4xx.h"

//欺骗编译器
void SystemInit ()
{
}

//延迟代码
void delay ()
{
	int a = 0x1FF000;
	while(a--);
}


int main (void )
{
	//使能时钟
	RCC_AHB1ENR |= 1<<7 ;
	
	//GPIOH的模式寄存器
	GPIOH_MODER &= ~( 0x03<< (2*11));
	GPIOH_MODER |= 1<<(2*11) ;
	
	//GPIOH的类型寄存器
	GPIOH_OTYPER &= ~(1<<1*11);
	GPIOH_OTYPER |= (0 < 11);
	
	//GPIOH的输出类型寄存器
	GPIOH_OSPEEDR &= ~(3 << (2*11)) ;
	GPIOH_OSPEEDR |= (1 << (2*11)) ;
	
	//GPIOH的上拉下拉
	GPIOH_PUPDR &= ~( 0x03<< (2*11));
	GPIOH_PUPDR |= 1<<(2*11) ;
	
	//先输出1
	GPIOH_ODR |= (1<<11);
			
	while(1)
	{
		//输出的信号是0
		GPIOH_ODR &= ~(1<<11);
		delay ();
		
		//输出为1
		GPIOH_ODR |= (1<<11);
		delay();
	}
}



#define  	periaddr   	    (unsigned int )0x40000000

#define    	GPIO_Addr   	    periaddr+0x21C00
#define    	RCC_Addr   	    periaddr+0x23800

#define 	GPIOH_MODER 	    *(unsigned int *)(GPIO_Addr)

#define 	GPIOH_OTYPER	    *(unsigned int *)(GPIO_Addr+0x04)

#define		GPIOH_OSPEEDR	    *(unsigned int *)(GPIO_Addr+0x08)

#define		GPIOH_PUPDR	    *(unsigned int *)(GPIO_Addr+0x0C)

#define		GPIOH_ODR	    *(unsigned int *)(GPIO_Addr+0x14)

#define 	GPIOH_BSRR 	    *(unsigned int *)(GPIO_Addr+0x18)


#define		RCC_AHB1ENR	    *(unsigned int *)(RCC_Addr+0x30)