xzy610030

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

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

0
阅读(3292)

基本上,我们始于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的时候,就体会到了,所以这里就是玩玩,后面开发还是要使用标准库来开发。

Baidu
map