物联网工程施工
STM32最简单的外设莫过于IO口的高低电平控制了,这次将通过一个经典的跑马灯程序,带大家开启 STM32 之旅。
前提工作:把文件放入创好的文件夹中并创好项目
1.打开HARDWARE->LED文件下的led.c,输入以下代码
#include "led.h"
//初始化 PA8 和 PD2 为输出口.并使能这两个口的时钟
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOD, ENABLE); //使能 PA,PD 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽输出
GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出 ,IO 口速度为 50MHz
GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高
}
2.在 led.h 中输入如下代码:
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PAout(8) // PA8
#define LED1 PDout(2) // PD2
void LED_Init(void);//初始化
#endif
这段代码里面最关键就是 2 个定义:
#define LED0 PAout(8) // PA8
#define LED1 PDout(2) // PD2
这里使用的是位带操作来实现操作某个 IO 口的 1 个位的
接着,我们点击Manage Project Items 管理
在里面新建一个 HARDWARE 的组,并把 led.c 加入到这个组里面,如图所示:
点击OK结束,然后你会发现在 Project Workspace 里面多了一个 HARDWARE 的组,在该组下面有一个 led.c 的文件。如图所示:
接着点击这个
按照以下步骤在里面将 led.h 头文件的路径加入到工程里面
回到主界面,在 main 函数里面编写如下代码:
#include "led.h"
#include "delay.h"
#include "sys.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与 LED 连接的硬件接口
while(1)
{ LED0=0;
LED1=1;
delay_ms(300); //延时 300ms
LED0=1;
LED1=0;
delay_ms(300); //延时 300ms
}
}
最后我们按下,编译工程,得到下图:
可以看到没有错误,也没有警告。从编译信息可以看出,我们的代码占用 FLASH 大小为: 1886 字节(1560+336),所用的 SRAM 大小为:1864 个字节(32+1832)。 这里我们解释一下,编译结果里面的几个数据的意义:
Code:表示程序所占用 FLASH 的大小(FLASH)。
RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。
RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM)
ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM)
有了这个就可以知道你当前使用的 flash 和 sram 大小了,所以,一定要注意的是程序的大 小不是.hex 文件的大小,而是编译后的 Code 和 RO-data 之和。接下来,我们就先进行软件仿真,验证一下是否有错误的地方,然后下载到 miniSTM32开发板看看实际运行的结果。
按照步骤新建两个信号PA8和PD2。
Display Type 选择 bit,然后单击 Close 关闭该对话框,可以看到逻辑分析窗口出来了两个信号
接着,点击运行,过一段时间后按下,暂停仿真,得到下图:
这里注意 Gird 要调节到 0.5s 左右比较合适,可以通过 Zoom 里面的 In 按钮来放大波形,通过 Out 按钮来缩小波形,或者按 All 显示全部波形。从上图中可以看到 PORTA.8 和 PORTD.2 交替输出,周期可以通过中间那根红线来测量。至此,我们的软件仿真已经顺利通过。在软件仿真没有问题了之后,我们就可以把代码下载到开发板上,看看运行结果是否与我们仿真的一致。至此,我们的这次学习就结束了,本章作为 STM32 的入门基础,介绍了 STM32 的 IO 口操作,进一步介绍了 MDK 的软件仿真功能。希望大家好好理解一下。