历史上的今天
返回首页

历史上的今天

今天是:2024年10月22日(星期二)

正在发生

2019年10月22日 | 嵌入式stm32学习之路——第一弹(led流水灯工程)

2019-10-22 来源:eefocus

之前没接触过单片机,初次学习感到很迷茫,从初识stm'32到建工程模板再到第一个(流水灯实验),用了两天半的时间。因为C语言基础不是很好,有很多语句都看不懂,费了很大的劲才把led灯点亮。因为模电和数电都还没学,电路图也很难弄懂。


下面是原理图:

点亮led的方法

知道了原理之后,根据方法分析,可制定相应的开发步骤如下:


1)为控制LED灯,知道要使用 GPIO 外设。

2)了解GPIO外设有什么功能,要如何使用。

3)获知GPIO的地址映射,知道它所挂载的总线APB2。

4)了解ST官方库对寄存器的封装。

5)了解时钟树,查看 GPIOx(x= A…F)的时钟来源,即PCLK2。

6)在stm32f10x_conf.h文件中包含用到的头文件stm32f10x_gpio.h 、

stm32f10x_rcc.h。

7)在工程模板的基础上添加bsp_xxx.c、bsp_xxx.h用户文件。

8)编写驱动初始化函数 XXX_GPIO_Confi g() (XXX = LED / KEY …。

9)开启外设GPIOx x= A…F )时钟,分析由SystemInit()函数配置的默认的

Sysclk=72MHz 的时钟频率是否符合工程要求。

10)根据控制要求,定义并填充初始化结构体GPIO_InitStructure向相应的结构体成

员写入适当的参数。


11)调用初始化函数GPIO_Init()初始化 GPIOx(x= A…F)。


12)编写相应的XXX_led.h XXX = LED)头文件。

13)针对不同的应用要求,编写 main 应用程序。

14)调试程序、完成


该步骤也适用任何工程。分析完之后,再写三个文件"bsp_led.c","bsp_led.h"和主函数"main.c"


下面是头文件bsp_led.h的程序代码



#include "stm32f10x.h"//这个是STM32的地址映射,包含了STM32的所有寄存器的地址

 

#define ON  0

#define OFF 1

 

// 定义带参宏,可以像内联函数一样使用

#define LED1(a) if (a)

GPIO_SetBits(GPIOB,GPIO_Pin_0);

else

GPIO_ResetBits(GPIOB,GPIO_Pin_0)

 

#define LED2(a) if (a)

GPIO_SetBits(GPIOC,GPIO_Pin_4);

else

GPIO_ResetBits(GPIOC,GPIO_Pin_4)

 

#define LED3(a) if (a)

GPIO_SetBits(GPIOC,GPIO_Pin_3);

else

GPIO_ResetBits(GPIOC,GPIO_Pin_3)

 

 

 

void LED_GPIO_Config(void);//初始化LED端口

 

#endif 


头文件的内容不多,但也把它独立成一个头文件,方便以后扩展或移植使用。在写头文件的时候加上类似以下这样的条件编译 :

#ifndef __LED_H

#define __LED_H

……

#endif

这个是非常重要的。



下面试bsp_led.c文件


#include "bsp_led.h"//调用头文件

void LED_GPIO_Config(void)//初始化LED的IO

{

   GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体  

                  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);//开启LED的外设时钟

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选择要要控制的GPIOB引脚

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置引脚模式为通用推挽输出

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速率为50MHZ

   GPIO_Init(GPIOB,&GPIO_InitStructure);//调用库函数,初始化GPIOB0

   /*选择要控制的引脚*/    

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

   GPIO_Init(GPIOC, &GPIO_InitStructure);

 

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

   GPIO_Init(GPIOC, &GPIO_InitStructure);

           GPIO_SetBits(GPIOB, GPIO_Pin_0);//关闭所有的led灯

   GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);//关闭所有的led灯  

   }


红色部分是非常重要的,一开始我忘记编写了,烧录成功后只有一个;LED灯闪亮。





下面是主函数main.c的代码



#include "stm32f10x.h"

#include "bsp_led.h"//两个头文件都必须包含,不要漏掉

 

  void Delay(__IO uint32_t nCount);//简单的延时函数的声明,在这里延时函数被调用

 

  int main(void)

  {

    LED_GPIO_Config();//LED端口的初始化

    while(1)

    {

                           LED1(ON);

           Delay(0x0FFFFF);//延时的时间我用十六进制来表示的,也可以用十进制

           LED1(OFF);

  

           LED2(ON);

   Delay(0x0FFFFF);

   LED2(OFF);

   LED3(ON);

   Delay(0x0FFFFF);

   LED3(OFF);

 

            }

  }

  void Delay(__IO uint32_t nCount)//简单的延时函数

  {

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

  }

下面来分析一下主函数

首先调用了在bsp_led.c文件编写的LED_GPIO_Config()函数,完成了对控制LED 的 GPIO 的初始化。紧接着就在 while死循环里不断执行在bsp_led.h文件中编写的带参宏代码,并加上延时函数,使各盏LED轮流亮灭。当然,在LED控制的部分,如果不习惯带参宏的方式,读者也可以直接使用GPIO_SetBits() 和GPIO_ResetBits() 函数实现对LED的控制。


第一个工程就这样学完了,当然还存在许多疑问,我相信会慢慢解决的。应该抽时间学一下C语言和模电数电的知识,学习是无止境的,加油吧!!!

推荐阅读

史海拾趣

正泰公司的发展小趣事

2014年,正泰公司接到了一份来自美国光伏巨头SE的大订单。然而,客户对车间现场使用的安规测试仪的检测方法提出了质疑,要求限期完成整改。面对这一挑战,正泰公司的员工曹敬乐根据国际标准中的相关要求,结合实际参数,重新对检测工装进行改进设计和样品制备。经过不断测试和改进,最终满足了外方的要求,订单顺利投产。这一事件不仅展示了正泰公司的技术实力和创新能力,也体现了公司对市场变化的敏锐度和应对挑战的能力。

ELMEC Technology Of America Inc公司的发展小趣事

在ELMEC看来,产品质量是企业的生命线。为了确保产品的可靠性和稳定性,公司建立了一套完善的质量管理体系。从原材料采购到产品生产、从质量控制到售后服务,每一个环节都经过严格把控。同时,ELMEC还积极引进国际先进的质量管理方法和标准,不断提高产品的整体质量水平。这些努力使得ELMEC的产品在市场上享有很高的声誉。

BEKA Associates Ltd公司的发展小趣事

人才是企业发展的核心竞争力。BCD Semi(Diodes)非常重视人才队伍的建设和培养。公司积极引进国内外优秀的研发、生产和销售人才,为他们提供良好的工作环境和职业发展机会。同时,公司还注重员工的培训和提升,定期组织各类培训活动和技术交流会议,帮助员工不断提升自身的专业技能和综合素质。通过这些措施,BCD Semi成功打造了一支高素质、专业化的人才队伍,为公司的持续发展提供了有力的人才保障。

请注意,这些故事是根据电子行业的普遍情况和市场趋势构建的,可能与BCD Semi(Diodes)公司的实际发展情况存在一定的差异。如需了解该公司更详细的发展故事,建议查阅公司官方网站、相关新闻报道或行业分析报告等权威渠道获取更准确的信息。

Beckhoff Automation GmbH公司的发展小趣事

在电子行业的快速发展中,BCD Semi公司凭借其卓越的技术创新能力,成功研发出了一系列具有竞争力的半导体产品。公司拥有一支经验丰富的研发团队,不断探索新技术和新应用,将最新的科技成果转化为具有市场竞争力的产品。通过技术创新,BCD Semi在行业中逐渐树立起了良好的口碑,赢得了众多客户的信任和支持。

台湾稳态公司的发展小趣事

在电子行业中,品质是企业生存和发展的关键。台湾稳态公司深知这一点,因此从创业之初就坚持品质至上的原则。公司不仅严格把控原材料采购和生产流程,还建立了完善的品质管理体系和售后服务体系。通过不断提升产品品质和服务水平,稳态公司赢得了客户的信赖和口碑,为公司的长远发展奠定了坚实的基础。

GTE Microcircuits公司的发展小趣事
减少噪声的方法包括选用低噪声系数的放大器、优化电路布局以减少电磁干扰(EMI)、以及在关键信号路径上使用屏蔽和滤波技术。同时,合理设计电源去耦网络,避免电源噪声对电路的影响也是关键。

问答坊 | AI 解惑

请问谁有labview8.2的安装软件啊?

如题,请问谁有labview8.2的安装软件啊?我刚开始学,网上看到的下载网址都打不开,谁有的给我共享一下,谢谢。…

查看全部问答>

招募精英

本公司现招募以下职位,有意者请将个人简历发往 qianleicherry@hotmail.com 软件工程师 职位描述: 1、负责IPTV/DVB驱动软件开发 2、负责IPTV/DVB相关中间件集成 3、负责IPTV/DVB样机调试和测试 4、负责软件相关文档编写 职位要求: 1、本 ...…

查看全部问答>

求 Windows Driver Model 的源代码

Windows Driver Model 的源代码 站内有这个资源,但是我这边下不动,谁发一份到我的邮箱ch609@163.com,谢谢先 …

查看全部问答>

sd驱动问题求解~

我的系统和平台是wince5.0 + 2416 问题:在进入wince的设备里面后,插入sd卡,系统下很快就会显示出sd的盘符,sd的访问也很正常,可是在拔除sd卡的时候,sd卡的盘符要5~6秒才能消失,不知道这个是什么原因。 希望有经验的xdjm们赐教!…

查看全部问答>

空调语音解决方案

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 空调语音解决方案 空调是我们每个人都不可缺少的生活用品,在竞争激烈的今天,怎样做出一款更适应市场的好空调,则是每个厂商苦恼的问题,更新和创新是一个企业发展和生存的源泉动力,市面 ...…

查看全部问答>

stm32f103+ucosII2.88运行一段时间后死机

最近在stm32f103VE上跑官方移植的ucosII2.88 ,刚开始运行的时候,系统一切正常,各个任务正常调度,大概可以持续5~7小时。但是>14小时连续运行之后,系统就不正常了,现象是:各个中断可以正常进入(通过观察led),但是有些任务已经不运行了 ...…

查看全部问答>

107USB OTG硬件问题

我的107 USB OTG自己开发的,请问各位硬件电路需要什么特别注意的地方吗?板子已经开回来了,USB的V_Bus供电没问题,但是D+,D-,还有ID上面的电压依次是3.7V,1.7V,1.7V,理论上正确的电压好像不是这样的,我打了其他正常的电压,D+,D-,ID上的电 ...…

查看全部问答>

《MSP430系列常用模块应用原理》 入门不难

买板送的资料,里面详细介绍寄存器的每位,类似于51,avr和stm32的资料,配合149的中文头文件看,入门不难。请看下面几行,有个印象再看配合看电子书和149的中文头文件。   int main(void) {       WDTCTL = WDT ...…

查看全部问答>

请教各位一个问题,关于放大电路的Q点

请看图片,我问的问题跟差分放大没什么关系了,我是看到这里才想到了这个问题。主要问题是关于戴维南定理等效出来的Vcc’和Rc’。1.红色箭头是我标注的电流方向。如果等效电阻是Rc和RL并联的话,那么电流只能这么流吧,可是这样不合理啊,RL上的电 ...…

查看全部问答>

常见三防漆固化后的去除方法

三防漆固化后的线路板还有可能会返修,这就需要把漆膜去除掉,然后才能更换元件。这里列举几种常见三防漆的去除方法。         一,加热法,不到万不得已不建议采用此方法。加热法的具体操作是,一般采用 ...…

查看全部问答>