当前位置:首页 > 单片机 > 单片机
[导读]用STM32的GPIO来点亮跑马灯步骤:1.新建工程:复制模板中的一切文件夹,注意删除USER中模板Template产生的三个文件以及OBJ中的文件(OBJ中产生的是编译过程中产生的文件)。2.打开keil,对工程中的各县设置进行修改(

用STM32的GPIO来点亮跑马灯
步骤:
1.新建工程:复制模板中的一切文件夹,注意删除USER中模板Template产生的三个文件以及OBJ中的文件(OBJ中产生的是编译过程中产生的文件)。
2.打开keil,对工程中的各县设置进行修改(包括:右键Manage Project Items里面的各个组及头文件;魔术棒中的Output选项卡中HEX文件和Folder的修改;C/C++选项卡中Define和头文件路径的修改)
3.build工程,查看设置是否正确,注意此时各个文件前面有可能没有小加号,解决办法是Translate一下,要是还不行就关了重开。
至此新建工程完成



想要对外设进行驱动就要相应的编写函数,我们在这里只将具体要做什么事(如亮多久灭多久,一起亮还是轮流亮)放于main文件中,每个外设的初始化函数我们都放在HARDWARE文件夹下面相应的.c和.h文件中(初始化函数是要根据外设连接到了哪个端口来编写的,内容包括用了哪个端口,处于什么工作模式下等),在这里使用到了这两个文件,不要忘记添加头文件和相应的路径。

1.对.h文件的编写
(1).h文件一般用于存放函数的声明和宏定义等
(2)使用到的函数:ifndef,define,endif
#ifndef __XXXX_H
#define __XXXX_H

A
#else
B
#endif
这是一个宏定义,防止重复定义:如果没有定义(if not define,ifndef)过xxxx.h,那么定义(define)xxxx.h并执行A,如果定义过了就执行B,通常我们在用的时候不会用到else,那么也就直接跳过了这段代码(endif),其中的这些下划线和H是c语言的书写规范,并且都是用大写来写,如led.h就会写成_LED_H。
在本实验中的代码为:
#ifndef __LED_H//if not define led.h
#define __LED_H//define led.h,并执行下面的程序
void LED_Init(void);
#endif
注意:LED_Init是空函数,在末尾要加上分号,没有分号会报错。

2.对.c文件的编写
在本实验中,.c文件里面存放了led的初始化函数LED_Init,
LED_Init包括:
(1)include相应的.h文件
(2)对GPIO时钟的初始化:GPIO用的是时钟2,函数为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);
(3)对GPIO端口的初始化:
GPIO_InitTypeDefGPIO_InitStructure;//定义需要初始化的结构
GPIO_InitStructure.GPIO_Mode=//更改这个初始化了的结构中的成员Mode的初始值
GPIO_InitStructure.GPIO_Pin=//更改这个初始化了的结构中的成员Pin的初始值
GPIO_InitStructure.GPIO_Speed=//更改这个初始化了的结构中的成员Speed的初始值
GPIO_Init(GPIOx,&GPIO_InitStructure);//参数设置完成,调用初始化函数
GPIO_SetBits(GPIOx,GPIO_Pin_x);//更改端口的初始状态
下面来解释一下这些语句:
1.GPIO_Init(GPIOx,&GPIO_InitStructure);
这条语句为初始化语句,它要求我传过去两个参数,一个是到底是哪个端口,是GPIOA还是B还是C还是什么,另一个是我要初始化的东西,对于要初始化的参量,它们被放在一个名为GPIO_InitStructure的结构体里面了,对于这个结构体的定义,就是下一句话。
它所调用的函数是:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)。
2.GPIO_InitTypeDefGPIO_InitStructure;
用到了结构必然要先定义,这句话的意思是定义一个GPIO_InitTypeDef类型的结构,名字叫做GPIO_InitStructure(当然可以叫别的名字),
在这里我们只是定义了一个结构,并没有对里面的成员进行定义(里面的都是默认值,需要设置哪个再单独去改),下面三行语句是以引用成员的方式对其初始值进行了修改。
GPIO_InitStructure.GPIO_Mode=
GPIO_InitStructure.GPIO_Pin=
GPIO_InitStructure.GPIO_Speed=
关于这三个初始状态的设置,我们需要根据自己具体的用途来设置,格式可以gotodefinition去看,里面是枚举类型,要严格按照人家的规定来写。
3.GPIO_SetBits(GPIOx,GPIO_Pin_x);
对端口状态进行初始化:设置LED默认不点亮,置1是不点亮,至于为什么,看电路图就明白了,LED的正连的高电平,负连的管脚。

3.main.c的编写
(1)include各个需要的文件
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
(2)编写main主函数:
一般情况下,main中包含两部分:
1.用到的各个部分的初始化,在本实验中包括led的初始化(也就是刚刚在led.c里面写的那个初始化函数),delay(延时)函数的初始化
delay_init();
led_Init();
2.函数体,本实验中的while函数,基本上我们需要的函数都会放在while(1){ }里面,因为我们要让它一直执行,而不是执行一次就完事了,但是对于比较复杂的函数,往往不是这个样子的,会有许多的判断条件。
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_8);//设置LED默认不点亮
delay_ms(500);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);//设置LED默认不点亮
delay_ms(500);
}
说明:本实验中,main函数的返回值类型是int型的,这里要写成int main (void){}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭