xzy610030

一起探讨,一起进步,一起分享!

stm32F4----像51那样点亮一盏灯(三)

0
阅读(3337)

基本上,我们始于51,于是乎,像51那样点个灯玩玩...

于是我们不用标准库,直接简单粗暴一些。。。

(一)新建一个工程

这里直接关闭,因为我们不用标准库

在这个目录找到startup文件:startup_stm32f412zx.s(类似于单片机的startup.a51)并去掉可读属性

D:\Keil_v5\ARM\PACK\Keil\STM32F4xx_DFP\2.11.0\Projects\STM32F412ZG-Nucleo\Examples\BSP\MDK-ARM

拷贝到工程目录

新建stm32f4xx.h(类似于reg52.h)

新建main.c

于是工程有这几个文件

(二)工程实现

编写stm32f4xx.h,由于只要点亮led,这里就只要gpio和RCC的定义就可以了。

#define PERIPH_BASE ((unsigned int)0x40000000)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)

 #define GPIOB_MODER *(unsigned int*)(GPIOB_BASE+0x00)
 #define GPIOB_OTYPER *(unsigned int*)(GPIOB_BASE+0x04)
 #define GPIOB_OSPEEDR *(unsigned int*)(GPIOB_BASE+0x08)
 #define GPIOB_PUPDR *(unsigned int*)(GPIOB_BASE+0x0C)
 #define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x10)
 #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x14)
 #define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE+0x18)
 #define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x1C)
 #define GPIOB_AFRL *(unsigned int*)(GPIOB_BASE+0x20)
 #define GPIOB_AFRH *(unsigned int*)(GPIOB_BASE+0x24)

 #define RCC_BASE (AHB1PERIPH_BASE + 0x3800)
 #define RCC_AHB1ENR *(unsigned int*)(RCC_BASE+0x30)


在启动代码中,我们注释SystemInit这几句,我们在main里面开启时钟

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
;        IMPORT  SystemInit
        IMPORT  __main

;                 LDR     R0, =SystemInit
;                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP


编写main函数

#include "stm32f4xx.h"
	
int main(void) 
{
 RCC_AHB1ENR |= (1<<1);

 //output
 GPIOB_MODER = 0x55555555;
 
//ÍÆÍì
 GPIOB_OTYPER = 0;

//Ëٶȣº2MHz
 GPIOB_OSPEEDR = 0;
 
//ÏÂÀ­
 GPIOB_PUPDR = 0xaaaaaaaa;
 //Êä³ö
 GPIOB_ODR = 0x0000FFFF;

 while (1);
	
}


工程配置:



这样就编写完了,就可以下载了。下载观察实验现象正常;


这样直接操作寄存器/地址的方式确实直观,但远没有标准库用起来方便,之前在玩DSP C2000的时候,就体会到了,所以这里就是玩玩,后面开发还是要使用标准库来开发。