1、环境说明
(1)使用的是普中STM32F103开发板
(2)keil 5软件
2、目的
点亮开发板上的LED1灯。
3、步骤
(1)定义一系列寄存器的宏。
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
在stm32f10x.h头文件中,添加上面的内容。
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
首先定义基地址,将其转化为无符号整型。
对GPIOC寄存器进行设置
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
a、首先需要将上面的整型数据强转成指针类型。
(unsigned int*)(GPIOC_BASE+0x00)
b、将指针指向的内存单元中的内容取出来,根据C的知识,需要在其前面加上一个“*”。
*(unsigned int*)(GPIOC_BASE+0x00)
c、根据数据手册,将对应的地址内容使用一个便于是别的名字进行定义。
(2)完成对GPIOC的控制
a、配置时钟,根据数据手册,GPIO都是挂接在APB2下,这也是上面使用的头文件有APB2的原因。
只需要将第4位置1即可,为了不影响其他位的状态,需要做或操作。
RCC_APB2ENR |= (1<<4);
(3)设置GPIOC_0的状态为输出
a、先将低4位清0,在进行输出的设置,设置为最大时钟速度,输出模式使用通用推挽输出模式。
GPIOC_CRL &= ~(0x0f<<4*0);
GPIOC_CRL |= (0x03<<4*0);
(4)亮点LED1
根据开发板的原理图,当该引脚设置为0时,LED灯被点亮,设置为1时,熄灭。
GPIOC_BSRR |= (0x01<<(16 + 0));
(5)LED灯实现循环
while(1)
{
GPIOC_BSRR |= (0x01<<(16 + 0));
delay(0xfffff);
GPIOC_BSRR |= (0x01<<(0));
delay(0xfffff);
}
(6)整体代码
#include "stm32f10x.h"
typedef unsigned int uint32;
void SystemInit()
{
;
}
void delay(uint32 i)
{
while(i--);
}
int main()
{
RCC_APB2ENR |= (1<<4);
GPIOC_CRL &= ~(0x0f<<4*0);
GPIOC_CRL |= (0x03<<4*0);
GPIOC_BSRR |= (0x01<<(16 + 0)); /点亮LED1
while(1)
{
GPIOC_BSRR |= (0x01<<(16 + 0));//点亮LED1
delay(0xfffff);
GPIOC_BSRR |= (0x01<<(0)); //熄灭LED1
delay(0xfffff);
}
}