STM32笔记5:模拟写库的结构

一些写在前面的笔记:
 引入文件概念,将不同功能的代码封装起来,用头文件包含
 stm32f4xx.h:存放外设,寄存器映射的代码,寄存器的结构体定义
 stm32f4xx_gio.c:跟外设相关的固件库函数的具体内容:eg:GPIO_SetBits()函数的写法以及 GPIO_ReSetBits()等函数
 stm32f4xx_gio.h:与外设GPIO相关的宏定义写在此处,即GPIO.c中用到的宏下载此处
 第三行第四行的文件放在gpio文件夹中
注意:编译器编译文件只会在工程根目录下寻找(工程根目录的路径也要在include path有时需要手动添加),因stm32f4xx_gio.c和stm32f4xx_gio.h是放在根目录下的名为gpio的文件夹,所以编译器是找不到的,故而报错。
需要在魔术棒的C/C++里的include path里面添加gpio这个文件夹的路径(视频8.3)


防止重定义的技巧:条件编译



main.c:

#include"stm32f4xx.h"		//包含f4xx.h即将gpio外设的存储器映射包含进来
#include"stm32f4xx_gpio.h"
 int main(void)
{
																		// RCCAHB1PERIPH_BASE |= (1<<7);
																		 
																		// GPIOH_MODER &= ~(3<<2*10); 
																		// GPIOH_MODER |= (1<<2*10); 
																	 
																		// GPIOH->MODER &= ~(3<<2*10);
																		// GPIO->MODER |= (1<<2*10);
																		// PH10输出低电平
																		// GPIOH_ODR &= ~(1<<10);

	RCC_AHB1ENR |= (1<<7);
	GPIO_SetBits(GPIOH, 10);	//若想要找到GPIOH的definition,若是找不到,可能是keil的options for target中的output中的Brows information 没有勾上。
	GPIO_ReSetBits(GPIOH, 10);
	
	while(1);
}





stm32f4xx_gpio.c:

#include"stm32f4xx_gpio.h"//f4xx_gpio.c中写的函数的声明需要放在f4xx_gpio.h中
 
 /*	函数功能:设置引脚为高电平
	参数说明:GPIOx:结构体指针,指向GPIO端口。GPIO_Pin:要被置位引脚号

*/
void GPIO_SetBits(GPIO_Typedef *GPIOx, uint16_t GPIO_Pin)		//因为此处使用了f4xx.h中定义的结构指针,所以需在f4xx_gpio.h中包含f4xx.h。
{
	GPIOx->BSSRL |= (1<<GPIO_Pin)
}

/*	函数功能:设置引脚为低电平
	参数说明:GPIOx:结构体指针,指向GPIO端口。GPIO_Pin:要被置位引脚号

*/
void GPIO_ResetBits(GPIO_Typedef *GPIOx, uint16_t GPIO_Pin)
{
	GPIOx->BSSRL |= (1<<GPIO_Pin)
}









stm32f4xx_gpio.h:
 
#ifndefine		_STM32F4XX_GPIO.H		//头文件中都要有这种条件编译以防出现重定义
 #define 		_STM32F4XX_GPIO.H
 #include"stm32f4xx.h"	//因为f4xx_gpio.c中使用了f4xx.h中定义的结构指针,所以需在f4xx_gpio.h中包含f4xx.h
 
void GPIO_SetBits(GPIO_Typedef *GPIOx, uint16_t GPIO_Pin);
void GPIO_RetsetBits(GPIO_Typedef *GPIOx, uint16_t GPIO_Pin);

endif 	/*_STM32F4XX_GPIO.H*/









stm32f4xx.h:

#ifndefine	_STM32F4XX_H	//为什么_STM32F4XX_H加下划线?习惯性写法,以防错认为是宏定义
#define		_STM32F4XX_H 	
//peripheral
#define PERIPHERAL	((unsigned int)(0x40000000))
#define AHB1_BASE	((unsigned int)(PERIPHERAL + 0x0002 0000))
#define GPIOA_BASE	((unsigned int)(AHB1_BASE+0x0000 0000))
#define GPIOB_BASE	((unsigned int)(AHB1_BASE+0x0002 0400))
#define GPIOC_BASE	((unsigned int)(AHB1_BASE+0x0002 0800))
#define GPIOD_BASE	((unsigned int)(AHB1_BASE+0x0002 0c00))
#define GPIOE_BASE	((unsigned int)(AHB1_BASE+0x0002 1000))
#define GPIOF_BASE	((unsigned int)(AHB1_BASE+0x0002 1400)
#define GPIOG_BASE	((unsigned int)(AHB1_BASE+0x0002 1800))
#define GPIOH_BASE	((unsigned int)(AHB1_BASE+0x0002 1C00))
#define GPIOI_BASE	((unsigned int)(AHB1_BASE+0x0002 2000))


#define GPIOH_MODER 	*(unsigned int*)(GPIOH_BASE+0x00)
#define GPIOH_OTYPER 	*(unsigned int*)(GPIOH_BASE+0x04)
#define GPIOH_OSPEEDR	*(unsigned int*)(GPIOH_BASE+0x08)
#define GPIOH_PUPDR 	*(unsigned int*)(GPIOH_BASE+0x0c)
#define GPIOH_IDR		*(unsigned int*)(GPIOH_BASE+0x10)
#define GPIOH_ODR 		*(unsigned int*)(GPIOH_BASE+0x14)
#define GPIOH_BSRR 		*(unsigned int*)(GPIOH_BASE+0x18)
#define GPIOH_LCKR 		*(unsigned int*)(GPIOH_BASE+0x1c)
#define GPIOH_AFRL		*(unsigned int*)(GPIOH_BASE+0x20)
#define GPIOH_AFRH 		*(unsigned int*)(GPIOH_BASE+0x24)

typedef unsigned int	uint32_t;
typedef unsigned int 	uint16_t;


typedef unsigned int	uint32_t;
typedef unsigned int 	uint16_t;

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 BSSRH;
	uint32_t LCKR;
	uint32_t AFR[2];	
}GPIO_Typedef;

//将GPIOA_BASE变成一个结构体指针
#define GPIOA ((GPIO_Typedef *)(GPIOA_BASE))
#define GPIOB ((GPIO_Typedef *)(GPIOB_BASE))
#define GPIOC ((GPIO_Typedef *)(GPIOC_BASE))
#define GPIOD ((GPIO_Typedef *)(GPIOD_BASE))
#define GPIOE ((GPIO_Typedef *)(GPIOE_BASE))
#define GPIOF ((GPIO_Typedef *)(GPIOF_BASE))
#define GPIOG ((GPIO_Typedef *)(GPIOG_BASE))
#define GPIOH ((GPIO_Typedef *)(GPIOH_BASE))
#define GPIOI ((GPIO_Typedef *)(GPIOI_BASE))

#endif	/*_STM32F4XX_H*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值