首页 > 百科知识 正文

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架

时间:2024-03-22 16:00:01 阅读:844 作者:永远的夏

在上一节中,我们在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所示。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第1张

图1 查看函数GPIO_InitTypeDef

单击后可以进入到GPIO_InitTypeDef函数体内,如图2所示。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第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表示操作为使能。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第3张

图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灯初始化状态为灭。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第4张

图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所示。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第5张

图5 创建外设文件夹LED

步骤二:在LED文件夹下创建两个文件led.c和led.h,如图6所示。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第6张

图6 创建文件

步骤三:进入keil中,为HARDWARE添加文件led.c,如图7所示。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第7张

图7 添加文件

步骤四:为项目添加HARDWARE下的LED头文件,如图8所示。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第8张

图8 添加头文件

步骤五:回到主界面,对程序进行编译,这时可以看到HARDWARE下的led.c和led.h,如图9所示。

零基础学习STM32智能家居系统之STM32模板程序解读,stm32应用框架-第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 开发模板程序的解读,欢迎共同讨论,纠错。期待点赞、转发。粉丝朋友可直接私信索要相关资料(包括模板及源代码)。

版权声明:该问答观点仅代表作者本人。如有侵犯您版权权利请告知 cpumjj@hotmail.com,我们将尽快删除相关内容。