当前位置: 首页 > 后端技术 > PHP

如何快速成为灯光师?

时间:2023-03-30 01:37:00 PHP

大家好,我是良旭。随着疫情趋于稳定,近期全国各地逐步开放。但不幸的是,我的几个号主朋友不小心中招成了“杨过”。良旭在此提醒各位朋友,放手不代表平躺,一定要做好自己该做的防护。病毒虽然没有刚爆发时那么可怕,但绝不是什么大感冒。据他身边的大侠杨某反馈,一旦中招,会相当难受,所以不要自己试毒。好了,回到主题。最近在录一套STM32的课程,导致公众号的原创比较少。我想对我所有的朋友说对不起。以后我也会在公众号更新一些STM32相关的内容。毕竟我是嵌入式开发工程师(不是你想的云维哈)~学习嵌入式,最经典的第一个实验就是点亮一个LED灯。不要小看这个实验。据我辅导过的学生反映,很多初学者连这么简单的case都做不了。高手出自菜鸟,成长需要一个过程。前两天,我在抖音上发了一个视频——挑战点亮一个LED灯20秒,结果被喷得像筛子一样。真不知道那些喷我的人是什么用意。想要成为一名优秀的灯光大师,第一步就是学习STM32最基本的外设——GPIO。1.什么是GPIO?1.1定义GPIO是通用输入/输出(general-purposeinput/output)端口的缩写。简单的说就是STM32的可控引脚。STM32芯片的GPIO引脚与外部设备连接,实现对外通信、控制和数据。采集功能。这是比较正式的说法,是不是有点意外?说的简单一点,就是从芯片中引出一串引脚,这些引脚可以在我们的控制下输出高电平/低电平,或者可以通过这些引脚向芯片输入一些信号,从而达到你的一些目的。1.2命名规则以STM32F103C8T6芯片为例。它共有37个GPIO端口。如何命名它们?总不能叫翠花、二蛋、狗生吧?我们有一个正式的命名规则,就是群号+pin号。什么是群号?即GPIOA、GPIOB、GPIOC、GPIOD..GPIOG,一般最多GPIOG。什么是引脚编号?那是0、1、2、3……15。所以组合是:PA0,PA1,PA2..PA15PB0,PB1,PB2..PB15PC0,PC1,PC2..PC15...但是并不是所有的芯片都有A到G组,比如我们的芯片只有四个组一个?D。并且不是每组都有15个针脚,比如D组只有0和1两个针脚。1.3内部框架上图来自官方手册。是不是看起来有点吓人?吓唬你是对的,我第一次看到的时候吓哭了。不过作为初学者,先不用研究太底层的内容,还是先点灯吧,不然学了很多理论知识,到头来连一盏灯都点不起来,不就是本末倒置吗?1.4推挽输出和开漏输出我们先来看看这两种输出的电路图。从电路图可以看出,这两种输出有本质区别:推挽输出:可以输出高电平和低电平。开漏输出:开漏输出不能真正输出高电平,即没有驱动能力,需要借助外部上拉电阻来完成外部驱动。2.如何点亮LED灯?我们先来看看LED灯的接线。可以看到LED灯的一侧被电阻拉高,另一侧连接到GPIO引脚。所以必须将GPIO引脚拉低,这样才会产生电压,相应的LED灯才会亮起。以LED1为例,它接在哪个管脚上?我们在看原理图的时候,一定要遵循一个原则:标号相同的线物理连接在一起。显然,LED1引脚连接到PB8的GPIO端口。因此,我们只要编程将PB8拉低,就可以点亮LED1。3、编程实现照明3.1常用的GPIOHAL库函数对于MCU编程,一般有寄存器编程、标准库编程、HAL库编程三种方法。目前HAL库编程方式是ST公司主推的编程方式,也是大势所趋,所以我们主要介绍HAL库编程方式。GPIO常用HAL库函数有以下这几个:voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState);GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);HAL_GPIO_Init此函数初始化GPIO引脚。如果你使用CubeMX,初始化代码会自动生成,你甚至不需要自己写。HAL_GPIO_WritePin可以将对应的引脚拉高或者拉低,我们开灯的时候会用到这个函数。而它的兄弟HAL_GPIO_ReadPin则是获取某个pin的状态(拉高或拉低)。最后一个HAL_GPIO_TogglePin可以翻转引脚电平。例如,如果是高电平,则翻转为低电平;如果它是低电平,它将被翻转到高电平。3.2CubeMXConfiguration配置调试模式配置在PB8引脚右侧选择PB8引脚,然后选择GPIO_Output模式。在中间一栏,点击对应的GPIO管脚,然后如图设置属性。特别要注意的是,一开始我们要把PB8拉高,否则一上电LED1就亮了。我们将用代码点亮它。配置项目注意,不要把项目放在有中文路径的地方,否则会出现异常情况!配置完成后,可以点击右上角的GENERATECODE生成工程。3.3编写代码至此,我们的大部分工作已经完成。CubeMX的强大之处在于它可以通过几次简单的点击自动生成初始化代码。比如下面的GPIO口初始化代码,如果自己写的话,至少需要几分钟,但是已经自动帮你写好了,非常方便!voidMX_GPIO_Init(void){GPIO_InitTypeDefGPIO_InitStruct={0};/*GPIO端口时钟启用*/__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*配置GPIO引脚输出电平*/HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);/*配置GPIO引脚:PB8*/GPIO_InitStruct.Pin=GPIO_PIN_8;GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull=GPIO_NOPULL;GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);}接下来,我们就可以在main函数的同时循环自己写这么一段代码,就可以实现LED1每1秒亮1秒的效果。一定要注意,把代码放在USERCODEBEGIN和USERCODEEND,否则如果你修改cubemx的配置,自动生成的代码会覆盖你写的代码,你的代码就白做了!HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);HAL_Delay(1000);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);HAL_Delay(1000);点灯操作到此结束,后续会继续更新STM32的其他干货内容,敬请期待~我还建了一个嵌入式交流群,专门用于技术交流,也会发小好处。到时候我也会把源码放在群里。想进群的朋友可以扫描以下二维码进群:4.总结千里之行,始于足下。点亮LED并不困难,但这是您学习STM32的第一步。不要太狂妄自大,觉得这个太简单了,那就不要自己动手了。很多朋友认为学编程很容易,然后就不自己动手了。学了一段时间,突然发现自己好像什么都没学到~所以,做才是硬道理。不要自大和盲目自信。!!

最新推荐
猜你喜欢