stm32应用框架(零基础学习STM32智能家居系统之STM32模板程序解读)
在上一节中,我们在MDK5中建立了STM32的模板程序,今天,我们来对程序进行解读。我们先来上程序,然后对程序当中主要的语句进行解读。
4.1 模板主程序解读
#include "stm32f10x.h" #引入头文件
void Delay(u32 count) #延迟函数
{
u32 i=0;
for(;i<count;i );
}
int main(void)#进入主程序
{
GPIO_InitTypeDef GPIO_InitStructure;//①
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //②
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //③
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //④
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //⑤
GPIO_Init(GPIOC, &GPIO_InitStructure); //⑥
GPIO_SetBits(GPIOC,GPIO_Pin_13); //⑦
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);⑧
Delay(3000000);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
Delay(3000000);
}
}
解读程序:
①GPIO_InitTypeDef GPIO_InitStructure;
这一句声明了一个GPIO_InitStructure的结构体,该结构体用来初始化stm32的GPIO。
GPIO_InitStructure的结构体采用函数GPIO_InitTypeDef来初始化。如果想要查看函数GPIO_InitTypeDef的具体定义,可以选择GPIO_InitTypeDef后,单击鼠标右键,在打开的快捷菜单中选择Go To Definition Of 'GPIO_InitTypeDef'选项,如图1所示。
图1 查看函数GPIO_InitTypeDef
单击后可以进入到GPIO_InitTypeDef函数体内,如图2所示。
图2 函数GPIO_InitTypeDef
具体内容为:
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
结构体中的第一句uint16_t GPIO_Pin定义了相应的IO口;第二句GPIOSpeed_TypeDef GPIO_Speed是对所定义IO的引脚速度;第三句GPIOMode_TypeDef GPIO_Mode定义了IO口的引脚模式。
②RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
第二句是对外设时钟的处理,RCC_APB2PeriphClockCmd函数用来开启或关闭APB2外设时钟。RCC_APB2Periph_GPIOC表示给端口GPIOC(PC)执行操作;ENABLE表示操作为使能。
图3 STM32时钟树(摘自正点原子STM32材料)
图3表示的是STM32的时钟树。
③ ④ ⑤ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
③ ④ ⑤这三句是根据GPIO_InitTypeDef的参数给IO引脚进行赋值。
第③ 句 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;表示引脚定义为PC13;
第④句 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;表示IO口设置为推挽输出;GPIO的引脚为了保证正常工作常接两个保护二极管(MOS管),根据两个MOS管的工作状态可以分为若干种输出方式,推挽是其中的一种,两个二极管都工作。
第⑤句 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;表示速度为50HZ .
⑥GPIO_Init(GPIOC, &GPIO_InitStructure);按以上GPIO_InitStructure的设置初始化GPIOC口
⑦GPIO_SetBits(GPIOC,GPIO_Pin_13); 对PC13端口设置高电平。
⑧GPIO_ResetBits(GPIOC,GPIO_Pin_13); 对PC13端口设置低电平。
图4为LED灯的接线图,可以看出LED灯接在PC13引脚上,所以系统先对PC13引脚进行初始化,最后设置PC13引脚的电平为高电平,LED灯初始化状态为灭。
图4 LED灯接线图
在后面的主程序中:
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
Delay(3000000);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
Delay(3000000);
}
通过GPIO_ResetBits()和GPIO_SetBits()来改变PC13的电平,并结合Delay()延迟函数来控制LED灯循环亮和灭。
4.2 HARDWARE 文件夹中的外设规范化处理
为了规范化处理外设,模板中应该单独设置HARDWARE 文件夹来单独处理与外设相关的操作。处理的步骤如下:
步骤一:在 HARDWARE 文件夹下创建外设文件夹,以 LED 灯为例,如图 5所示。
图5 创建外设文件夹LED
步骤二:在LED文件夹下创建两个文件led.c和led.h,如图6所示。
图6 创建文件
步骤三:进入keil中,为HARDWARE添加文件led.c,如图7所示。
图7 添加文件
步骤四:为项目添加HARDWARE下的LED头文件,如图8所示。
图8 添加头文件
步骤五:回到主界面,对程序进行编译,这时可以看到HARDWARE下的led.c和led.h,如图9所示。
图9 led.c和led.h文件
步骤七:向led.c和led.h中添加代码。
led.c
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED2 PCout(13)
void LED_Init(void);
#endif
4.3 编写main.c代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while( 1)
{
LED2=0;
delay_ms(300); //延时300ms
LED2=1;
delay_ms(300); //延时300ms
}
}
以上是STM32 开发模板程序的解读,欢迎共同讨论,纠错。期待点赞、转发。粉丝朋友可直接私信索要相关资料(包括模板及源代码)。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com