导入库函数
在ST官方固件库中找到STM32F10x_StdPeriph_Lib_V3.5.0.zip文件,解压,打开Libraries,接着打开STM32F10x_StdPeriph_Driver文件夹,继续点击src,看到库函数源文件:
将其复制到keil建立的工程的文件中,接着回到STM32F10x_StdPeriph_Driver文件夹,打开inc文件夹,继续复制到工程中;文件为上图。
除了库函数文件,还需添加一些文件,作用是配置库函数头文件包含关系与存放中断函数的:
回到STM32F10x_StdPeriph_Lib_V3.5.0,打开Project,继续打开STM32F10x_StdPeriph_Template,复制以下文件:
将其复制到keil建立的工程的文件中,并使他们生效,生效步骤为:
在keil中打开头文件#include"stm32f10x.h",找到第8296到8298行,复制USE_STDPERIPH_DRIVER到魔术棒的C/C++中的定义界面(因为头文件里的逻辑是必须定义USE_STDPERIPH_DRIVER才能使用conf文件)即可。
编写代码
点灯
对上一节的寄存器点灯方法改装(http://t.csdnimg.cn/S2jgX):
1.配置使能时钟:使用RCC_APB2PeriphClockCmd(a,b);
参数a为外设,参数b为新的状态。输入该函数名到keil上,右键点击(或Ctrl+F)可以直接查看他的源代码与参数(下面的函数均可这样操作):
上一节中,使用的外设是GPIOB和GPIOE,状态为使能,则代码为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
2.配置端口模式:使用GPIO_init(a,b);
参数a为选择的GPIO,b为包含参数的结构体(需自己定义);参数的结构体包括GPIO的模式/端口/速度;
则先定义b:
GPIO_InitTypeDef GPIO_InitStructure;//定义名字为GPIO_InitStructure的结构体(名字任意,也可以为b)GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//GPIO的模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //引脚/端口GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速度
(结构体的参数值也需通过Ctrl+F点击参数名查找),如模式:
先进入结构体:
点击模式的注释部分中的GPIOMode_TypeDef,Ctrl+F点击查找:
填入需要的参数,我们需要的是GPIO_Mode_Out_PP,再按该方法填入另外两个即可。
定义完结构体就可以使用GPIO_init函数了:
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_Init(GPIOE,&GPIO_InitStructure);
3.设置端口高低电平:
使用函数GPIO_SetBits(a,b);
参数a为GPIO端口,参数b为GPIO引脚。填入后,输出高电平;
使用函数GPIO_ResetBits(a,b);
参数意义两者相同,填入后,输出低电平;
高电平代码为:
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
这样就配置完毕了,改装后,代码为:
#include "stm32f10x.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_Init(GPIOE,&GPIO_InitStructure);
while(1)
{GPIO_SetBits(GPIOB,GPIO_Pin_5);GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
}
现象与上一节相同,LED0与1同时亮;
两灯交换闪:
#include "stm32f10x.h" // Device header
int main(void)
{ int i=0,j=0;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_Init(GPIOE,&GPIO_InitStructure);while(1){GPIO_ResetBits(GPIOE,GPIO_Pin_5);GPIO_SetBits(GPIOB,GPIO_Pin_5);for(i=0;i<2550;i++){for(j=0;j<2400;j++){}}GPIO_ResetBits(GPIOB,GPIO_Pin_5);GPIO_SetBits(GPIOE,GPIO_Pin_5);for(i=0;i<2550;i++){for(j=0;j<2400;j++){}}}
}
现象为LED0与1一亮一灭,半秒后变为一灭一亮。