day06:stm32f10x.h寄存器的映射代码(地址的宏定义)
在stm32f10x.h文件中集中定义各个寄存器和端口、总线的内存地址,这样能让代码变简洁,也方便代码管理和修改,同时,在编程的时候,不用写很多遍
重复代码,相当于Java中的接口定义一样。

main.c
#include "stm32f10x.h"
// 宏定义:指针
#define GPIO_RCC RCC_APB2ENR
#define GPIO_CRL GPIOC_CRL
#define GPIO_ODR GPIOC_ODR
// 延迟函数
void delay(unsigned int i)
{
for(; i!=0; i--);
}
int main(void)
{
/* 配置RCC寄存器,使能GPIO口的时钟 */
GPIO_RCC |= ( 1<<4 );
// 闪烁灯:D4和D5两个LED灯之间不断闪烁
while(1)
{
/* 配置CRL寄存器,配置为推挽输出 */
GPIO_CRL |= ( 1<<(4*2) );
/* 配置ODR寄存器 */
GPIO_ODR &= ~( 1<<2 ); // 位2置0,LED亮
delay(0X99999);
GPIO_ODR |= ( 1<<2 ); // 位2置1,LED不亮
/* 配置CRL寄存器,配置为推挽输出 */
GPIO_CRL |= ( 1<<(4*3) );
/* 配置ODR寄存器 */
GPIO_ODR &= ~( 1<<3 ); // 位3置0,LED亮
delay(0X99999);
GPIO_ODR |= ( 1<<3 ); // 位3置1,LED不亮
}
}
void SystemInit(void)
{
/* 函数体为空,目的是为了骗过编译器不报错 */
}
stm32f10x.h
/* 用于存放寄存器的映射代码,相当于51单片机的reg52.h */ /* 所有的外设基地址 */ #define PERIPH_BASE (unsigned int)0X40000000 /* 三条总线基地址 */ #define APB1_PERIPH_BASE PERIPH_BASE #define APB2_PERIPH_BASE PERIPH_BASE+0X00010000 #define AHB_PERIPH_BASE PERIPH_BASE+0X00018000 /* GPIOA - GPIOG端口的地址,它们均在APB2这条总线上 */ #define GPIOA_BASE APB2_PERIPH_BASE+0X00000800 #define GPIOB_BASE APB2_PERIPH_BASE+0X00000C00 #define GPIOC_BASE APB2_PERIPH_BASE+0X00001000 #define GPIOD_BASE APB2_PERIPH_BASE+0X00001400 #define GPIOE_BASE APB2_PERIPH_BASE+0X00001800 #define GPIOF_BASE APB2_PERIPH_BASE+0X00001C00 #define GPIOG_BASE APB2_PERIPH_BASE+0X00002000 /* GPIOC端口的寄存器地址 */ #define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0X00000000) #define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0X00000004) #define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0X00000008) #define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0X0000000C) #define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0X00000010) #define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0X00000014) #define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0X00000018) /* APB2外设时钟使能寄存器 */ #define RCC_APB2ENR *(unsigned int*)0X40021018
现象:
LED灯不断闪烁
这样做的目的是让代码更加简洁和方便管理,同时方便编程和修改代码,同时,代码的扩展性增强。

浙公网安备 33010602011771号