点亮第一个LED灯
文章目录
- 一、查手册
- 二、寄存器
- 2.1.使能 APB2 时钟
- 2.2.配置为输出模式
- 2.3.输出高低电平
- 三、代码编写
一、查手册
本文章通过汇编和简单的 C 语言操控 STM32F103C8T6 的 GPIO 寄存器,进行控制测试灯的闪烁。使用外设之前,必须查看手册,了解了 GPIO 的基地址和偏移值,即可操控某个寄存器。在 STM32F10xxx 参考手册里找到:
红色框是 RCC 的基地址,用来开启 GPIOC 的时钟。
其中 0x4001 1000 就是 GPIOC 的基地址。
二、寄存器
通过手册里面的介绍,每个寄存器都会有它的地址,它的绝对地址是基地址 + 偏移地址。
2.1.使能 APB2 时钟
GPIO 是挂载在 APB2 总线上面的,使用该外之前必须开启它的时钟:
RCC_APB2ENR 的基地址加上偏移地址:0x40021000+0x18,就是该寄存器的绝对地址。使能 IOPC,需要将 1 左移 4,就可以了。
2.2.配置为输出模式
找到 GPIO 控制器,通过以上方法找到该寄存器的绝对地址:0x40011000+0x04:
配置 IO13,控制 20 ~ 23 位寄存器即可,CNF13 配置为 00 为通用推挽输出模式,MODE13 配置为 11 为最大输出速度。
2.3.输出高低电平
最后控制 GPIOx_ODR 寄存器,控制 IO 口输出高低电平,写 1 置为高电平,写 0 置为低电平。
三、代码编写
在 Keil5 里新建一个工程,芯片选择 STM32F103C8T6,新建一个 main.c:
/* 编写一个简单的延迟函数,实现灯的闪烁 */
void delay(int data)
{while(data--);
}int main(void)
{unsigned int *pReg;/* 开启GPIOC时钟 */pReg = (unsigned int*)(0x40021000+0x18);*pReg |= (1<<4);/* 配置GPIO_Pin_13为输出引脚 */pReg = (unsigned int*)(0x40011000+0x04);*pReg |= (11<<20);/* 让指针指向GPIOx_ODR寄存器 */pReg = (unsigned int*)(0x40011000+0x0C);while(1){/* PC13引脚置0 */*pReg |= (1<<13);delay(10000);/* PC13引脚置1 */*pReg &= ~(1<<13);delay(10000);}
}
写完 main 函数里,再模仿官方的源文件:start_stm32f10x_md.s,里面的汇编代码,实现启动单片机:
PRESERVE8THUMB; Vector Table Mapped to Address 0 at ResetAREA RESET, DATA, READONLYEXPORT __Vectors__Vectors DCD 0 ; ReservedDCD Reset_Handler ; Reset HandlerAREA |.text|, CODE, READONLY; Reset handler
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT mainLDR SP, =(0x20000000+0x5000) ;在魔术棒里查看自己的栈大小,进行设计,用来存放变量BL mainENDPEND