有一人,登场于金庸先生的《神雕侠侣》,以大理段氏“一阳指”自成一派,武学修为登峰造极,“天下五绝”之一,号称“南帝”,他就是“一灯大师”。如今,武林中逐渐被遗忘的“一灯大师”,却活跃在另一个行业——嵌入式开发中。
传说,每一个成功的mcu(俗称单片机)开发组中,都有一名“一灯大师”,他精通所有开发板的点灯方法,对于企业引入的新开发板,总是勤学苦练,从点灯开始,快速掌握新开发板的编程要点,带领团队走向胜利。
成为“一灯大师”,离不开持续的修行,离不开对一招一式的勤学苦练。本文将讲解如何通过编程来控制stm32点亮一个led。
学习环境:
1.软件:keil5
2.硬件:stm32开发板(笔者使用信盈达公司的m4开发板,芯片型号为stm32f407zgt6)
适合人群:
在校初入电子坑的小白,不懂stm32编程的硬件开发人员和想了解库函数编程的人。
文末将提供示例代码和文档的资料分享。
part 1
点灯的思路讲解
本文中的点灯,是指用stm32单片机点亮与之连接的led的操作。首先我们先了解一下led这种器件。
led的本质是一种发光二极管,所以点灯的核心就是:如何用stm32控制一个二极管电路。
市场上各类led(直插式/贴片式以及各种颜色的led,都有点区别)在导通时的压降一般在1.8~3.3v。所以点灯需要先查看电路图,确定驱动led的方法。
下图是笔者使用到stm32开发板的led部分的原理图。
本文接下来将以点亮led1为例进行讲解。通过上图,我们可以看到或总结出以下信息:
1.led1与单片机的pf6引脚连接。
2.由于led1是一个二极管,点亮led1需要pf6引脚上的电压值为低电平(满足发光二极管的导通压降需求即可)。
3.由于需要实现控制led1点亮和led1熄灭,需要将pf6引脚配置为输出模式,且输出电平可控。
故在编程步骤中主要需要完成两个部分:led初始化函数(主要是配置引脚pf6为输出模式)和 点亮/熄灭led1的接口(控制引脚pf6输出低/高电平)。
其中,led1初始化的主要步骤为:
激活外设gpiof(pf6是外设gpiof的io引脚之一)。将pf6配置为输出模式将pf6的输出类型配置为推挽输出配置pf6输出速度为低速(其他速度也可以)配置pf6的输出数据(点亮/熄灭led1)part 2
用库函数编程方法点灯
本方法是通过调用stm32官方提供的库函数,完成对引脚有关的一系列操作。库函数编程方法简单易用,适合新人学习。
step1,打开stm32f4xx官方库函数文档(stm32f4xx_dsp_stdperiph_lib_um.chm),找到以下函数。
void rcc_ahb1periphclockcmd (uint32_t rcc_ahb1periph, functionalstate newstate) 此函数用于激活ahb1总线上的外设(gpiof在此总线上)void gpio_init (gpio_typedef *gpiox, gpio_inittypedef *gpio_initstruct) 此函数将基于参数初始化gpioxvoid gpio_setbits (gpio_typedef *gpiox, uint16_t gpio_pin) 此函数用于控制指定io引脚输出高电平void gpio_resetbits (gpio_typedef *gpiox, uint16_t gpio_pin) 此函数用于控制指定io引脚输出低电平step2,通过在库函数帮助文档中点击函数名,查看函数的定义,明确参数填写方法。
比如,点击gpio_init() 函数,查看其详细信息
通过阅读图中文字,可知:第一个参数填写为gpiox,其中x需要用字母a~k替代(取决于引脚),由于本例使用pf6引脚,故填写为gpiof;第二个参数需要先定义一个gpio_inittypedef类型的结构体变量,对其成员赋值后,再将变量的地址传入。
继续查看gpio_inittypedef类型的定义。
gpio_inittypedef结构体类型中的这5个成员分别表示对以下内容的配置:io引脚的模式、输出类型、引脚序号、内置电阻 和 输出速度。
其他几个函数也可以参考此方法进行查看,从而确定函数的调用形式。
step3,结合前文“点灯的思路讲解”写出代码
//1. 激活外设gpiofrcc_ahb1periphclockcmd (rcc_ahb1periph_gpiof, enable);//2. 将pf6配置为输出模式//3. 将pf6的输出类型配置为推挽输出//4. 配置pf6输出速度为低速gpio_inittypedef gpio_initstruct ;gpio_initstruct.gpio_mode = gpio_mode_out ;gpio_initstruct.gpio_otype = gpio_otype_pp ;gpio_initstruct.gpio_pin = gpio_pin_6 ;gpio_initstruct.gpio_pupd = gpio_pupd_nopull ;gpio_initstruct.gpio_speed = gpio_low_speed ;gpio_init (gpiof , &gpio_initstruct);//5. 点亮/熄灭led1#define led1_on gpio_resetbits (gpiof, gpio_pin_6)#define led1_off gpio_setbits (gpiof, gpio_pin_6)step4,整理代码,将他们添加到用keil5软件建立的工程中。可参考以下形式。(细节详见文末提供的资料分享)
step5,编程工程,下载到开发板,观察现象。正常现象是led1以固定的频率交替进行亮和灭动作。
留给读者的思考,本文提供的开发板的led部分原理图中还有另外3个led,尝试编写代码,驱动他们。有条件的朋友建议购买开发板直接实物验证,将理论与实践结合,早日成为“一灯大师”!
解开MAXQ的秘密
帕塞瓦定理的两种常见形式
德州仪器推出两款可提供业界最佳功率性能比的差分放大器
开源AI模型全新飞跃,深空激光传输革新里程碑
Marvell全球首发400GbE以太网芯片
使用STM32单片机点亮LED
5G最新应用正在湖南华菱湘钢园区智慧工厂陆续落地
汽车互动技术如何改善驾驶及乘坐体验?
基于Nand Flash 存储技术的嵌入式linux 系统设计
华为基于iEVO算法实现多节点探针AI检测模型持续的优化测试
数字资产量化交易系统开发自动网格化交易软件开发
美国运输行业巨头诺福克南方铁路公司已加入了区块链运输联盟
豪威推出全新V50E图像传感器 具有HDR视频捕获能力
WAIC 2022商汤元创力论坛邀你洞见未来
人们为什么开始需要自动驾驶的平行宇宙
360推出球形室外监控摄像机:2K/双云台/360°全景
智能电表的的设计突破及面临哪些挑战
电瓶修复技术—电动车电池里是干的还是水的?
倾角传感器在汽车行业领域的应用
浅谈实现汽车零部件的射频类抗扰度EMS测试的软件