完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F4 的 IO 可以由软件配置成如下 8 种模式中的任何一种: 1、输入浮空 2、输入上拉 3、输入下拉 4、模拟输入 5、开漏输出 6、推挽输出 7、推挽式复用功能 8、开漏式复用功能 二、蜂鸣器实验 1.引脚配置 1、查看手册,正点原子的蜂鸣器接在PF8上。 2、设置PF8为GPIO_Output模式。 3、设置PF8的GPIO参数 2.时钟配置 同前文的配置,F4选择84M,F1选择72M。 3.代码实现 通过GPIO的置高函数和置低函数,实现对蜂鸣器的设置。 代码如下(示例): HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET);//开启蜂鸣器 HAL_Delay(500);//500ms延时 HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET);//关闭蜂鸣器 4.Define使代码简化,可读性高 在某些经常操作的函数,可以使用宏定义的方式,使得代码可读性更高,所以我们可以将LED和蜂鸣器的操作用几个宏定义来实现。 #define LED0_ON() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET); #define LED0_OFF() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_SET); #define LED1_ON() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET); #define LED1_OFF() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET); #define BEEP_ON() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_SET); #define BEEP_OFF() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_8, GPIO_PIN_RESET); 上方代码的写入,我们在主函数里面使用宏定义会让代码更容易理解(下面代码将用宏定义) 三、按键实验 1.引脚配置 1、查看手册,正点原子的四个按键分别是KEY0->PE4、KEY1->PE3、KEY2->PE2、WK_UP->PA0。 2、设置PE2、PE3、PE4、PA0为GPIO_Input模式。 3、设置PE2、PE3、PE4、PA0的GPIO参数。 注意:相同配置的引脚可以用control或者shift选中后一键配置 2.时钟配置(F4->84M,F1->72M) 如有不理解之处,请查看上一篇博客。 3.代码实现 1、按照前面所说,对于各个引脚的操作进行宏定义 #define LED0_ON() HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, GPIO_PIN_RESET) #define LED0_Reversal() HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9)//翻转LED0 #define LED1_Reversal() HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10)//翻转LED1 #define BEEP__Reversal() HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8)//翻转BEEP #define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)//读取PE4电平 #define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)//读取PE3电平 #define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)//读取PE2电平 #define WK_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)//读取PA0电平 #define KEY0_Press 1//KEY0被按下标志位 #define KEY1_Press 2//KEY1被按下标志位 #define KEY2_Press 3//KEY2被按下标志位 #define WK_UP_Press 4//WK_UP被按下标志位 2、在主函数内添加按键判断函数(放在BEGIN和END之间) uint8_t KEY_Scan(uint8_t mode); 1 uint8_t KEY_Scan(uint8_t mode) { static uint8_t key_up=1;//按键松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) { HAL_Delay(10);//去抖动 key_up=0; if(KEY0==0)return KEY0_Press; else if(KEY1==0)return KEY1_Press; else if(KEY2==0)return KEY2_Press; else if(WK_UP==1)return WK_UP_Press; }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; return 0;//无按键按下 } 3、在主函数内添加按键处理函数(放在BEGIN和END之间) uint8_t key = 0; LED0_ON();//先点亮LED0 1 2 key=KEY_Scan(0);//得到键值 if(key) { switch(key) { case WK_UP_Press: //控制蜂鸣器翻转 BEEP__Reversal(); break; case KEY0_Press: //控制LED0翻转 LED0_Reversal(); break; case KEY1_Press: //控制LED1翻转 LED1_Reversal(); break; case KEY2_Press: //同时控制LED0、LED1翻转 LED0_Reversal(); LED1_Reversal(); break; } }else HAL_Delay(10); 总结 以上就是今天要学习的内容,本文仅仅简单介绍GPIO的两种模式,大家可以深入了解一下其他的模式,后面我们也会更新┗|`O′|┛ 嗷~~。 为了更好的结合原子的视频,代码均改写自STM32F4开发指南库函数版本。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1618 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1545 浏览 1 评论
979 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1597 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
645浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
516浏览 3评论
532浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
505浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 14:34 , Processed in 0.828724 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号