完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
软件初识-LED灯的闪烁与蜂鸣器
一、LED硬件连接 在硬件连接的过程中,需要先了解一下开发板的原理图,对于哪个器件对应连接到哪个位置,你心里得有数。这个是战舰版的原理图,在这里可以查看LED以及其他相关器件连接的引脚等等参数 这里就显示了LED灯与引脚的连接以及工作原理,LED灯与引脚相连,右端用一个3.3v的上拉电源连接,当PB5,PE5输出低电平时,灯亮,当输出高电平时,灯灭;同时此处在设置输出方式上选用推挽输出(可以输出强高电平) 二、LED软件设计 (1)库函数操作 终于开始了软件的编写,事先声明,需要有c语言的基础,而且我写这些博客的目的在于记录自己以及帮助一些小白梳理学习过程 首先,打开工程模板,这里建议电脑上保存一份全新的工程模板,需要用的时候就复制粘贴,本次实验的目的在于点灯以及控制灯的闪烁 ◆ 打开工程,在Template里新建一个HAREWARE组,用来存放外设相关代码(此处就需要灌输一个理念,模块化的理念,你使用什么外设,有条理的模块化操作),同时,在软件外的操作,找到你放的工程文件夹,新建一个HAREWARE文件夹,其中再新建一个LED文件夹,用来存放你配置外设的.c / .h文件 ◆ 进入软件新建两个文本(左上角文本符号或者Ctrl + N),保存,路径为刚刚的LED文件夹,命名为led.c及led.h ◆ 右键HAREWARE,manage project items… ,在HAREWARE组里添加led.c文件,然后点击魔术棒,c/c++里面include paths加上led.h所在文件夹 ◆ led.h内代码示意如下,在初始化LED的时候为了避免头文件内容重复定义,使用#ifndef和#define,#endif条件编译,这里解释一下#ifndef吧,也就免得百度了 #ifndef(if not define) 这是一个条件定义宏,拿下面例子来说,第一句条件定义宏检查 _LED_H 是否被定义过(这里的_LED_H随便什么都可以,只是一个字符串而已),如果被定义过,就执行#endif之后的语句,如果没有被定义过,就重定义_LED_H,执行下面的句子直至#endif led.h: 需要注意的一点在于:一般默认的时钟都是关闭的,在使用外设之前需要开启对应的时钟,即时钟使能 此段代码实现了配置GPIOB_Pin_5与GPIOE_Pin_5为推挽输出,速度为50Mhz,并且设置为高电平(理解一下SetBits()) led.c: main.c: 再总结一下代码流程吧 (1)先写外设初始化函数,led.h格式固定 (2)led.c中先导入led.h,使能GPIOB GPIOE,开启时钟,定义一个结构体,设置一个指针变量,接着配置结构体,GPIO_Init(GPIOB,&GPIO_InitStructure);这部分是必不可少的! (3)利用setbits函数设置高电平 (4)在main.c中,先导入库文件,延时函数初始化,LED初始化,利用setbits和resetbits设置高低电平 (2)寄存器操作 相较而言,对于我这种学C的时候都学不进去存储什么的来说,寄存器就显得很尴尬,我一听就觉得脑瓜疼,但是渐渐地熟悉了之后,发现寄存器真的是…很直接,就是一个字!直接! 这里的使能时钟其实就对外设时钟寄存器进行写入和修改数据,写是不好写啦,自己百度一下吧,代码附上,看看能不能理解叭~ led.c: main.c: 简单直接!从根本上解决问题! (3)位带操作 位操作原理在上一篇文章里面做了介绍,主要涉及到映射的知识,这个就属于会用,但是不强制清楚的那种,这里我也不是很清楚,之后再说,但是现在需要的就是会写程序,没有什么比会写程序更重要的了 说到底是对ODR寄存器的配置,下图展示了位操作定义IO口的位置,是在sys.h里面,差不多算是固定格式,完全了解等入门了再说,现在先记住怎么用 相信也发现了,在库函数,寄存器,位带操作三种方式里面,相当于是从三个方向实现功能,库函数就是利用现有的函数设置,肚脐读取IO口电平;寄存器就是从寄存器直接赋值与修改;而位带操作就是通过特定的指示对IO口定义,然后进行电平设置 三、自主学习蜂鸣器 为什么这部分名字会是自主学习呢,因为在代码上没什么新的点来讲,多一点的可能只是一点理论知识;上面就是利用 IO 口直接驱动LED,实现闪烁的,但是对于蜂鸣器来说,STM32的单个 IO 最大可以提供 25mA 电流(来自数据手册),而蜂鸣器的驱动电流是 30mA 左右,两者十分相近,但是全盘考虑, STM32 整个芯片的电流,最大也就 150mA,如果用 IO 口直接驱动蜂鸣器,其他地方用电就得省着点了…所以,我们不用 STM32 的 IO 直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样 STM32 的 IO 只需要提供不到 1mA 的电流就足够了**(IO口不可以直接驱动大功率器件)** 通过查阅原理图,发现如下: 用到一个 NPN 三极管(S8050)来驱动蜂鸣器, R60 主要用于防止蜂鸣器的误发 声。当 PB.8 输出高电平的时候,蜂鸣器将发声, 当 PB.8 输出低电平的时候,蜂鸣器停止发声 关于代码 这部分的代码和LED灯闪烁的代码差不多,所以就不加以描述了,可以尝试着不看教程,自己根据之前的记忆写一次,对知识的掌握很有帮助 感谢您的支持,希望您能有梦为马!不负青春~ |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1125 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1149 浏览 1 评论
581 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
436 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1041 浏览 2 评论
1626浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
290浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
297浏览 3评论
287浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
262浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-22 12:36 , Processed in 0.719849 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号