STM32引脚输入

发布时间:2026/10/6 12:09:07

STM32引脚输入 文章目录前言一、看原理图二、开始编程1.开启时钟2.配置GPIOA.0 上拉输入3.读取 GPIOA.0 引脚 GPIOA_IDR 0位上是1按键松开输入就是高电平否则就是低电平按键按下三、完整程序四 测试效果五、参考别人的按键代码连续和不连续触发功能六 生成自己的 .c .文件6.1 key.c6.2 key.h6.3 延时函数 delay.c6.4 延时函数delay.h6.5 完整代码6.6 测试6.6 手把手视频总结前言提示这里可以添加本文要记录的大概内容课程需要提示以下是本篇文章正文内容下面案例可供参考一、看原理图确定要用哪个引脚确定用第一个图 PA0 上拉输入二、开始编程1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);2.配置GPIOA.0 上拉输入代码如下示例GPIO_InitStruct.GPIO_PinGPIO_Pin_0;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_SetBits(GPIOA,GPIO_Pin_0);//ODR 寄存器要输出13.读取 GPIOA.0 引脚 GPIOA_IDR 0位上是1按键松开输入就是高电平否则就是低电平按键按下读取到状态为1说明对应引脚上是高电平反之为低电平代码如下示例tempGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);if(temp0){//led 亮GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{//led 灭GPIO_ResetBits(GPIOA,GPIO_Pin_1);}三、完整程序#includestm32f10x.hintmain(){u8 temp;GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_PinGPIO_Pin_0;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);//LED 指示用GPIO_InitStruct.GPIO_PinGPIO_Pin_1;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);while(1){tempGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);if(temp0){//led 亮GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{//led 灭GPIO_ResetBits(GPIOA,GPIO_Pin_1);}}}//#include stm32f10x.h//#define BIT(n) (1n)//int main()//{// //PC1 配置为推挽输出// *((unsigned int*)(0x400210000x18)) | 0X00000010;////// RCC-APB2ENR | 0X00000010;// RCC-APB2ENR | 0X00000020;////// GPIOC-CRL 1111 1111 1111 1111 1111 1111 1111 0000 1111 0X FFFF FF0F// GPIOC-CRL 0XFFFFFF0F;//// GPIOC-CRL 0000 0000 0000 0000 0000 0000 0011 0000 0X 0000 0030// GPIOC-CRL | 0X00000030;//// GPIOD-CRL 0XFF0FFFFF;// GPIOD-CRL | 0X00300000;//////// while(1)// {////// GPIOC-ODR | 0X00000002; //给高电平的//// GPIOC-ODR ~ 0X00000002; //给低电平的//// GPIOC-ODR 0XFFFFFFFD; //给低电平的//////// GPIOC-ODR | 11; //给高电平的 PC1//// GPIOC-ODR ~(11); //给高电平的 PC1//////// GPIOC-ODR | BIT(1); //给高电平的 PC1// GPIOC-ODR ~BIT(1); //给高电平的 PC1//// GPIOD-ODR | BIT(5); //给高电平的 PD1// GPIOD-ODR ~BIT(5); //给高电平的 PD1////// }////}四 测试效果按键输入2024-09-26 09-58-45-909五、参考别人的按键代码连续和不连续触发功能#defineKEY0GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键0#defineKEY1GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键1#defineWK_UPGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2#defineKEY0_PRES1//KEY0#defineKEY1_PRES2//KEY1#defineWKUP_PRES3//WK_UP//按键处理函数//返回按键值//mode:0,不支持连续按;1,支持连续按;//返回值//0没有任何按键按下//KEY0_PRESKEY0按下//KEY1_PRESKEY1按下//WKUP_PRESWK_UP按下//注意此函数有响应优先级,KEY0KEY1WK_UP!!u8KEY_Scan(u8 mode){staticu8 key_up1;//按键按松开标志if(mode)key_up1;//支持连按if(key_up(KEY00||KEY10||WK_UP1)){delay_ms(10);//去抖动key_up0;if(KEY00)returnKEY0_PRES;elseif(KEY10)returnKEY1_PRES;elseif(WK_UP1)returnWKUP_PRES;}elseif(KEY01KEY11WK_UP0)key_up1;return0;// 无按键按下}六 生成自己的 .c .文件6.1 key.c//PC5#includekey.hvoidkey_init(){GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStruct.GPIO_PinGPIO_Pin_5;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOC,GPIO_InitStruct);GPIO_InitStruct.GPIO_PinGPIO_Pin_15;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);GPIO_InitStruct.GPIO_PinGPIO_Pin_0;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IPD;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);}//按键处理函数//返回按键值//mode:0,不支持连续按;1,支持连续按;//返回值//0没有任何按键按下//KEY0_PRESKEY0按下//KEY1_PRESKEY1按下//WKUP_PRESWK_UP按下//注意此函数有响应优先级,KEY0KEY1WK_UP!!u8KEY_Scan(u8 mode){staticu8 key_up1;//按键按松开标志if(mode)key_up1;//支持连按if(key_up(KEY00||KEY10||WK_UP1)){//delay_ms(10);//去抖动key_up0;if(KEY00)returnKEY0_PRES;elseif(KEY10)returnKEY1_PRES;elseif(WK_UP1)returnWKUP_PRES;}elseif(KEY01KEY11WK_UP0)key_up1;return0;// 无按键按下}6.2 key.h#ifndef__KEY_H#define__KEY_H#includestm32f10x.h#defineKEY0GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)//读取按键0#defineKEY1GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//读取按键1#defineWK_UPGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键2#defineKEY0_PRES1//KEY0#defineKEY1_PRES2//KEY1#defineWKUP_PRES3//WK_UPvoidkey_init();u8KEY_Scan(u8 mode);#endif/* __KEY_H */6.3 延时函数 delay.c#includedelay.h/** * brief 微秒级延时 * param xus 延时时长范围0~233015 * retval 无 */voidDelay_us(uint32_txus){SysTick-LOAD72*xus;//设置定时器重装值SysTick-VAL0x00;//清空当前计数值SysTick-CTRL0x00000005;//设置时钟源为HCLK启动定时器while(!(SysTick-CTRL0x00010000));//等待计数到0SysTick-CTRL0x00000004;//关闭定时器}/** * brief 毫秒级延时 * param xms 延时时长范围0~4294967295 * retval 无 */voidDelay_ms(uint32_txms){while(xms--){Delay_us(1000);}}/** * brief 秒级延时 * param xs 延时时长范围0~4294967295 * retval 无 */voidDelay_s(uint32_txs){while(xs--){Delay_ms(1000);}}6.4 延时函数delay.h#ifndef__DEALAY_H#define__DEALAY_H#includestm32f10x.hvoidDelay_us(uint32_txus);voidDelay_ms(uint32_txms);voidDelay_s(uint32_txs);#endif/* __DEALAY_H */6.5 完整代码#includestm32f10x.h#includekey.hvoidled_init(){//LED 指示用GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_PinGPIO_Pin_1;GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);}intmain(){u8 temp;led_init();key_init();// GPIO_InitTypeDef GPIO_InitStruct;// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA, ENABLE);// //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// GPIO_InitStruct.GPIO_Pin GPIO_Pin_5;// GPIO_InitStruct.GPIO_Mode GPIO_Mode_IPU;// GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;// GPIO_Init(GPIOC, GPIO_InitStruct);//////LED 指示用//// GPIO_InitStruct.GPIO_Pin GPIO_Pin_1;// GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP;// GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz;// GPIO_Init(GPIOA, GPIO_InitStruct);while(1){// tempGPIO_ReadInputDataBit( GPIOC, GPIO_Pin_5);//// if(temp0) {//// //led 亮// GPIO_SetBits( GPIOA, GPIO_Pin_1);//// }// else{//// //led 灭////// }tempKEY_Scan(1);if(temp0){GPIO_SetBits(GPIOA,GPIO_Pin_1);}}}//#include stm32f10x.h//#define BIT(n) (1n)//int main()//{// //PC1 配置为推挽输出// *((unsigned int*)(0x400210000x18)) | 0X00000010;////// RCC-APB2ENR | 0X00000010;// RCC-APB2ENR | 0X00000020;////// GPIOC-CRL 1111 1111 1111 1111 1111 1111 1111 0000 1111 0X FFFF FF0F// GPIOC-CRL 0XFFFFFF0F;//// GPIOC-CRL 0000 0000 0000 0000 0000 0000 0011 0000 0X 0000 0030// GPIOC-CRL | 0X00000030;//// GPIOD-CRL 0XFF0FFFFF;// GPIOD-CRL | 0X00300000;//////// while(1)// {////// GPIOC-ODR | 0X00000002; //给高电平的//// GPIOC-ODR ~ 0X00000002; //给低电平的//// GPIOC-ODR 0XFFFFFFFD; //给低电平的//////// GPIOC-ODR | 11; //给高电平的 PC1//// GPIOC-ODR ~(11); //给高电平的 PC1//////// GPIOC-ODR | BIT(1); //给高电平的 PC1// GPIOC-ODR ~BIT(1); //给高电平的 PC1//// GPIOD-ODR | BIT(5); //给高电平的 PD1// GPIOD-ODR ~BIT(5); //给高电平的 PD1////// }////}6.6 测试有按键按下6.6 手把手视频建立自己模块化工程 2024-09-26总结123
延伸阅读

更多相关文章

2026/10/6 12:04:06

USB信号不稳定?共模电感选型是关键:从原理到实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 12:04:06

ESP32-S3硬件设计五大铁律与PCB七道电磁关卡

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 12:59:09

机器学习驱动的自动音乐生成优化:从符号建模到可控采样

简介:基于机器学习的自动音乐生成软件,核心采用长短期记忆网络模型,代替常见的简单循环神经网络与WaveNet方案,在最少人为干预下生成一段短曲并播放,缓解同质化问题。资源面向深度学习与音乐生成交叉方向的学习者&…

2026/10/6 12:59:09

AGV调度仿真平台实战:从A*路径规划到多车避让与死锁恢复

简介:这份AGV调度系统仿真平台资料包,面向物流、智能制造、人工智能及自动化方向的在校生与科研人员,可用于毕业设计、课程设计或项目初期原型验证。资源聚焦AGV任务调度与路径规划的可视化仿真,让使用者无需搭建实体设备即可观察…

2026/10/6 12:59:09

基于NUT的医院UPS实时监测系统实战解析

设备科半夜接到电话,CT室市电闪断,UPS顶上去了,可三分钟后电池电量掉到15%,还没等值班工程师赶到现场,设备已经因为电量耗尽强制关机。片子没出完,患者多等了两小时,科室主任的脸色比报告单还难…

2026/10/6 12:59:09

招生宣传管理系统毕设指南:从源码部署到答辩全流程

每年到了毕业季,计算机相关专业的学生就开始循环纠结同一件事:选题怎么定、系统怎么做、论文怎么写、答辩怎么过。你要是打开各类资源平台搜“招生宣传管理系统”,大概率会看到“源码 lw 部署文档 讲解”这种打包交付的毕设项目。今天我不…

2026/10/6 12:59:09

Claude Code 全局 Skill 配置指南:一次配置,所有项目可用

1. 这个配置思路到底解决什么问题先说个场景。我最初接触 Claude Code 时,Skill 功能刚出来不久,社区里的玩法五花八门,但大家基本都遵循一个习惯:每个项目目录下自己放一份.claude文件夹,把要用到的 Skill 塞进去。单…

2026/10/6 12:54:09

UE USTRUCT 转 JSON:反射序列化与 FJsonObjectConverter 完整指南

项目标题:将 USTRUCT 类型的实例对象,转换成对应的 JSON 字符串格式服务端要做一份配置下发接口,要求客户端把玩家当前状态打包成 JSON 字符串 POST 上去。我第一次图省事,用FString::Printf一段一段手工拼 JSON,十几个…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑