寄存器编程---是如何过渡到固件库
1:头文件
#ifndef _STM32F4XX_H
#define _STM32F4XX_H
#include <stdint.h>
#define GPIOF_BASE ((unsigned int)0x40021400)
#define RCC_BASE ((unsigned int)0x40023800)
#define GPIOF_MODER *(unsigned int *)(GPIOF_BASE+0x00)//把这个数加(unsigned int *)强制转换成地址,之后加*转换为指针
#define GPIOF_OTYPER *(unsigned int *)(GPIOF_BASE+0x04)
#define GPIOF_ODR *(unsigned int *)(GPIOF_BASE+0x14)
#define RCC_AHB1ENR *(unsigned int *)(RCC_BASE+0x30)
//
//typedef unsigned int uint32_t;
//typedef unsigned short int uint16_t; //这两句在stdint.h里面有定义
//外设寄存器结构体定义
typedef struct
{
uint32_t MODER;
uint32_t OTYPER;
uint32_t OSPEEDR;
uint32_t PUPDR;
uint32_t IDR;
uint32_t ODR;
uint16_t BSRRL;
uint16_t BSRRH;
uint32_t LCKR;
uint32_t AFRL;
uint32_t AFRH;
}GPIO_TypeDef;//结构体
#define GPIOF ((GPIO_TypeDef *)GPIOF_BASE)//结构体类型的指针,结构体指针会自动增加
#endif
//A.c
//B.c 目的是只编译一次,如果两个C文件都编译同一个头文件会报错
2:主函数
#include "stm32f4xx.h"
void delay(unsigned int a)
{
for( ;a>0;a--);
}
int main (void)
{
#if 0
//第一步:开GPIOF端口时钟
RCC->AHB1ENR |=(1<<5);
//第二部:配置GPIO为输出
GPIOF->MODE &=~(3<<(2*9));
GPIOF->MODE |=(1<<(2*9));//如果在配置时之前就已经配置过11了,这时候在配置01,或的结果为11,
//所以说有两个为控制配置功能的我们首先将两个位配置清零;
//两个位为一组,只控制目标位
//第三步:让GPI0输出0或者1,ODR寄存器或者BSRR寄存器
GPIOF->ODR |=(1<<6);//先置1
GPIOF->ODR &=~(1<<6);
while(1)
{
GPIOF->ODR |=(1<<9);//先置1
delay(0xfffff);
GPIOF->ODR &=~(1<<9);
delay(0xfffff);
}
#elif 1
//第一步:开GPIOF端口时钟
RCC_AHB1ENR |=(1<<5);
//第二部:配置GPIO为输出
GPIOF->MODER &=~(3<<(2*9));
GPIOF->MODER |=(1<<(2*9));//如果在配置时之前就已经配置过11了,这时候在配置01,或的结果为11,
//所以说有两个为控制配置功能的我们首先将两个位配置清零;
//两个位为一组,只控制目标位
//第三步:让GPI0输出0或者1,ODR寄存器或者BSRR寄存器
GPIOF->ODR |=(1<<6);//先置1
GPIOF->ODR &=~(1<<6);
while(1)
{
GPIOF->ODR |=(1<<9);//先置1
delay(0xfffff);
GPIOF->ODR &=~(1<<9);
delay(0xfffff);
}
#endif
}
void SystemInit(void)
{
//骗过编译器不报错
}