历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2019年10月19日 | STM32实验一:GPIO之流水灯

2019-10-19 来源:eefocus

前面写过一篇关于STM32单片机的GPIO的文章,本来是打着从实用角度来做的实验,但是发现不积跬步无以至千里啊,咱们从头开始,先做一个最简单的,入门级的,单片机系统中的hello world,流水灯实验!


我手中有一个神舟3的开发板,我就用这个板子来做实验,板子中的实验一共用到4个LED灯来做流水灯的实验,这里我们也用这4个灯,他们分别是GPIOF中的6、7、8、9这4个。


1、首先我们复制我们之前做过的模板工程到一个新建文件夹中,(如,你可以取个名字叫流水灯实验的文件夹)神舟开发板的例程中在项目中添加了两个文件,分别是led.c和led.h,这是一种习惯,每做一个项目的时候都在其中添加一个.c和对应的.h文件,这样可以是工程看起来更加规整!本来我是不想添加这个的,这里为了良好的编程习惯,我们也添加一个!并且我更改了模板文件中的一些名字,在下图中我将标志出来



2、接下来我们来看一下程序,程序一共分为两部分,一个main.c,一个led.c,因为程序比较简单,所以在led.h中我们就不做任何定义了,这也省去了一些麻烦!按照习惯,我们先从main程序看起!


#include "stm32f10x.h"

#include "led.h"

void LED_config(void);//使用函数前先进行函数声明

 

/*******************************************************

                                                      

* 函数名称: delay

*     输入: 无

*     输出: 无

* 功能描述: 延时函数                          

                                                      

*******************************************************/

 

void delay(vu32 nCount)

{

  for(; nCount != 0; nCount--);

}

 

/*******************************************************

                                                      

* 函数名称: main

*     输入: 无

*     输出: 无

* 功能描述: 主函数                         

                                                      

*******************************************************/

 

int main(void)

{

  LED_config(); //调用4个LED灯初始化函数

 

  while(1)

  {

GPIO_ResetBits(GPIOF,GPIO_Pin_6);//第一灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_6); //第一灯灭

 

delay(800000); //延时

 

GPIO_ResetBits(GPIOF,GPIO_Pin_7); //第二灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_7); //第二灯灭

 

delay(800000); //延时

 

GPIO_ResetBits(GPIOF,GPIO_Pin_8); //第三灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_8); //第三灯灭

delay(800000); //延时

 

GPIO_ResetBits(GPIOF,GPIO_Pin_9); //第四灯亮

 

delay(800000); //延时

 

GPIO_SetBits(GPIOF,GPIO_Pin_9); //第四灯灭

 

delay(800000); //延时

  }

}


分析一下程序,LED_config();这个函数是调用了led.c中的函数,一会会贴出led.c文件,GPIO_ResetBits、

GPIO_SetBits这两个函数是库文件为我们提供的GPIO操作函数,我们贴出来看一下


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BRR = GPIO_Pin;

}

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));

  

  GPIOx->BSRR = GPIO_Pin;

}

这两个函数的作用就是将端口置1或者清0

我们再来看一下led.c文件


void LED_config(void)

{

GPIO_InitTypeDef  GPIO_InitStructure;

 

/* 配置神舟III号LED灯使用的GPIO管脚模式*/

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); /*使能LED灯使用的GPIO时钟*/

 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; 

 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式

 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  

  GPIO_Init(GPIOF, &GPIO_InitStructure);  /*神州III号使用的LED灯相关的GPIO口初始化*/

}

这里主要就是GPIO的配置,前面我们也说过,一共3个步奏,

1)、使能GPIOD的时钟


2)、填充GPIO的属性结构体


3)、传递参数至初始化函数


这里要注意,我们将管脚模式配置为推挽输出模式,这个需要注意一下,因为之后的实验中我们还会给关键配置成其他的模式


程序编写完毕,编译下载到实验板中完成实验!

推荐阅读

史海拾趣

富之光(Fujicon)公司的发展小趣事

随着全球化进程的加速,富致科技也积极实施国际化战略。公司不仅在欧洲、北美等地设立了销售和服务网络,还通过参加国际展会、建立海外研发中心等方式,不断提升品牌影响力和市场竞争力。同时,富致科技还注重与全球顶尖企业和研究机构的合作,共同推动PPTC技术的创新与发展。

锋鸣电子(Fengming)公司的发展小趣事

在稳固光伏胶膜市场的同时,福斯特并未停止前进的步伐。公司积极拓展产品品类,进入电子新材料领域。2014年,公司开始开发PCB用感光干膜,进军电子信息产业。感光干膜作为PCB产业最核心的工艺材料之一,对电子信息产业的发展具有重要意义。福斯特凭借其技术实力和市场洞察力,迅速在该领域取得突破,成为行业内的佼佼者。至2020年,公司感光干膜销量大幅增长,为公司带来了新的增长点。

HALO Electronics公司的发展小趣事

在稳固光伏胶膜市场的同时,福斯特并未停止前进的步伐。公司积极拓展产品品类,进入电子新材料领域。2014年,公司开始开发PCB用感光干膜,进军电子信息产业。感光干膜作为PCB产业最核心的工艺材料之一,对电子信息产业的发展具有重要意义。福斯特凭借其技术实力和市场洞察力,迅速在该领域取得突破,成为行业内的佼佼者。至2020年,公司感光干膜销量大幅增长,为公司带来了新的增长点。

DURACELL公司的发展小趣事

为了进一步扩大市场份额和品牌影响力,DURACELL公司积极寻求品牌授权合作。通过在全球范围内与相关企业进行合作开发,DURACELL公司成功将品牌延伸到更多领域和地区。这种合作模式不仅为DURACELL公司带来了更多的市场机会,也推动了整个电池行业的发展。

GE Sensing ( Amphenol Advanced Sensors )公司的发展小趣事

DURACELL公司自成立以来,一直致力于提供高品质的电池产品。公司不断投入研发资源,推动电池技术的创新。金霸王碱性电池以其“卓越品质,持久电力”的出众品质行销全球近百个国家和地区。此外,DURACELL公司还积极拓展产品线,生产和销售锂电池等高性能电池产品,以满足不同领域的需求。

高创科技(gotrend)公司的发展小趣事

在开拓重庆市场时,DURACELL公司面临了巨大的挑战。当地电池市场竞争激烈,价格参差不齐。然而,DURACELL公司凭借其独特的营销策略和高质量的产品,迅速打开了市场。他们选择了与当地贸易代理商合作的方式进入市场,并通过“三步走式”的营销策略迅速占领了市场份额。这一成功案例展示了DURACELL公司灵活的市场策略和对品质的坚持。

问答坊 | AI 解惑

关于低频信号发生器的问题,请高手们指教

我的电路设计和程序都编写好了,但是输出波形很不理想,只有方波OK,三角波,锯齿波,正弦波都失真很厉害,求大侠们帮小弟解决下这个问题! ORG 0000H MAIN:          MOV A,#00H      MO ...…

查看全部问答>

讨论:各位在单片机中用什么算法去做菜单?

讨论:各位在单片机中用什么算法去做菜单?   比如我要用89s52和smc1602做个菜单。这个菜单有很多层的,即有子菜单。   不知道各位用的是什么方法和算法?   小弟我一开始就用树和链表方式做的。不好。 & ...…

查看全部问答>

自己做个数子示波器,液晶屏是用那款好!

动手做个示波器,液晶显示屏不知用那款好些.有的说用 NS 12864C,也有的的说用 NS 12864R 有点拿不准.想请教高手.用那款实用好些,二者有何区别.请给欲我答复.感激.谢谢!…

查看全部问答>

深入浅出ARM7

深入浅出ARM7-LPC213x_214x(上).pdf 深入浅出ARM7_LPC213x__214x_下册.pdf…

查看全部问答>

cyclone v使用报告——内存内存控制器

使用Altera的UniPHY控制器,采用软核和硬核两种模式,使用的时候一般是PHY跟controller一起使用,例化的时候已经将两者合为一体了。使用软核或硬核的区别只是下图的一个check box是否选上。 本来还好好的,默认没有选上,一点击使用硬核之后,图表 ...…

查看全部问答>

ucosII 移植到LM3S9B92上还真是不简单

一直想把ucosII V2.92移植到LM3S9B92上去,但前前后后搞了将近三个星期了,还是没有一点结果,指针总是越界,第一个任务还没启动起来就会进入死循环,真是郁闷啊。…

查看全部问答>

为什么EPM570会被程序弄死?

写了个串口调试程序用来测试板子各个工作点状态的,但是居然第一次烧录几次后CPLD就不能再烧录了干脆坏掉了,只能换芯片,要知道100脚的epm570更换起来多费时间。是不是程序导致芯片内部短路了?…

查看全部问答>

msp430F5529和F169之间异步通信可以吗

msp430F5529和F169之间异步通信可以吗?已经做通5529与5529通信,1X与1X之间的通信? …

查看全部问答>

LED恒流驱动电源最新

我有个论文要写,关于LED恒流驱动的,市面是否有新颖或新款的电路。有创新点的。评职称用很愁啊。 …

查看全部问答>

关于ZigBee节点的求助

求大神指教!!! ZigBee技术中,网络中的设备按照各自的作用的不同可以分为协调器节点、路由器节点和终端节点。 是不是终端节点之间是不能相互通信的,只有路由器节点之间才能相互通信的?然后协调器节点相当于“大脑”,我的理解应该木有错吧! ...…

查看全部问答>