总体步骤
建立工程文件夹,Keil中新建工程,选择型号
工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹路径Start、Library、User。
工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
代码逐行解析
-
引入设备头文件:
#include "stm32f10x.h"
- 该头文件包含STM32F10x系列微控制器的所有常量定义、寄存器地址映射和外设功能声明。
-
主函数入口:
int main(void)
main
函数是C语言程序的入口,所有程序的执行都从这里开始。
-
使能GPIOC端口时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- 通过RCC的APB2外设时钟控制功能使能GPIOC的时钟,这一步是必要的初始化步骤,没有时钟,GPIO端口无法工作。
-
配置GPIO初始化结构体:
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- 创建一个
GPIO_InitTypeDef
类型的结构体实例,用于配置PIN的功能:GPIO_Mode_Out_PP
:将引脚设置为推挽输出模式。GPIO_Pin_13
:选择PC13为目标引脚。GPIO_Speed_50MHz
:设置输出速率为50MHz,适合于多数应用。
- 创建一个
-
初始化GPIO:
GPIO_Init(GPIOC, &GPIO_InitStructure);
- 调用此函数,通过传递之前配置好的结构体,将配置应用于GPIOC的PC13引脚。
-
控制GPIO电平:
GPIO_SetBits(GPIOC, GPIO_Pin_13); GPIO_ResetBits(GPIOC, GPIO_Pin_13);
GPIO_SetBits
:将PC13设置为高电平,即将引脚拉电压高状态。GPIO_ResetBits
:将PC13设置为低电平,即将引脚拉电压低状态。- 这两行代码实际上会非常快速的执行,因此你可能看不到LED的变化。
-
无限循环:
while(1) { }
- 程序进入一个空的无限循环,防止程序结束并让微控制器继续运行。
但是在有些老的编译器,它要求所有的局部变量定义必须放到函数的最前面,如果你的编译器是这样的话,就需要把这一行提到最前面去
我的编译器就是这样
应该将所有的变量声明放在代码块的最开始部分,在第一条可执行语句之前
#include "stm32f10x.h" // Device header
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
// GPIO_SetBits(GPIOC,GPIO_Pin_13);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
while(1)
{
}
}