网站右侧浮动窗口,孝昌县建设局网站,创可贴设计网,phpstudy做正式网站按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别
点亮一个LED灯#xff1a;是直接控制输出引脚#xff0c;GPIO初始化推挽输出即可
按键控制LED#xff1a;是按键输入信号从而控制输出引脚#xff0c;GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入
但是…按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别
点亮一个LED灯是直接控制输出引脚GPIO初始化推挽输出即可
按键控制LED是按键输入信号从而控制输出引脚GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入
但是控制GPIO本质还是1.RCC时钟使能 2.结构体配置GPIO寄存器 3.控制GPIO
标准库写法
led.c
1.RCC时钟使能 2.结构体配置GPIO寄存器 3.控制GPIO我们这里封装成函数ON;OFF;swtich
#include stm32f10x.h // Device header
#include delay.h
void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//1.RCC时钟使能GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure); //2.结构体配置GPIO寄存器GPIO_SetBits (GPIOA,GPIO_Pin_1 | GPIO_Pin_2); //3.控制GPIO值为1
}/*** brief LED1灯亮* param 无* retval 无*/
void LED1_ON(void)
{GPIO_ResetBits (GPIOA,GPIO_Pin_1); //控制LED1亮
}/*** brief LED2灯亮* param 无* retval 无*/
void LED2_ON(void)
{GPIO_ResetBits (GPIOA,GPIO_Pin_2); //控制LED2亮
}/*** brief LED灭* param 无* retval 无*/
void LED1_OFF(void)
{GPIO_SetBits (GPIOA,GPIO_Pin_1); //控制LED1灭
}/*** brief LED灭* param 无* retval 无*/
void LED2_OFF(void)
{GPIO_SetBits (GPIOA,GPIO_Pin_2); //控制LED2灭
}/*** brief LED1灯状态切换* param 无* retval 无*/
void LED1_switch(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) 1){GPIO_ResetBits (GPIOA,GPIO_Pin_1);}else{GPIO_SetBits (GPIOA,GPIO_Pin_1);}
}/*** brief LED2灯状态切换* param 无* retval 无*/
void LED2_switch(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) Bit_SET){GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);}else{GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);}
}
led.h
#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);
void LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_switch(void);
void LED2_switch(void);#endifkey.c
这里按键获取函数采用的是delay检测是阻塞式的函数这不好等学到定时器中断我们再用定时器定时检测 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) 0) { Delay_ms(20); //按下消抖 while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) 0); Delay_ms(20); //松开消抖 keynum 1; }
#include stm32f10x.h // Device header
#include DELAY.h
void KEY_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//1.RCC时钟使能GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_1|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure); //2.结构体配置GPIO寄存器}/*** brief 按键获取函数* param 无* retval 按键值1-PB1,2-pb11*/
uint8_t KEY_Getstate(void)
{uint8_t keynum 0;if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) 0){Delay_ms(20); while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) 0);Delay_ms(20);keynum 1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) 0){Delay_ms(20); while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) 0);Delay_ms(20); keynum 2;} return keynum;
}
key.h
#ifndef __KEY_H
#define __KEY_Hvoid KEY_Init(void);
uint8_t KEY_Getstate(void);
#endifmain()
定义一个变量把按键状态接收通过不同按键值来控制LED状态
#include stm32f10x.h // Device header
#include Delay.h
#include LED.h
#include KEY.huint8_t keynum;
int main ()
{KEY_Init();LED_Init();while(1){keynum KEY_Getstate();if(keynum 1){LED1_switch();}else if(keynum 2){LED2_switch();}}
}
标准库写完了接下来我们写HAL库
HAL库分三步
1.建工程
2.设配置
3.写代码 HAL库写法
一. 关于建工程请参考江科大学习笔记之——HAL库点亮一个LED灯-CSDN博客在里面有详细步骤简单易懂
二.配置设置
这里我设置错了应该是PB11,你们自己注意一下 ctrls生成代码
三.写代码
为了方便我们把LEDKEY单独拿出来放在System文件夹下
在cubeIDE里面想建立自己的.C.H文件步骤如下
1.建立文件夹 2. 鼠标右键点击文件名–Properties
3. 进入Includes 添加文件的路径 同时还要增加源文件的路径 好准备工作做完了上面cube ide的模块化是我自己在网上找半天才找到的方法
STM32CubemxIDE 导入自定义的.c和.h文件_stm32cubeide添加源文件-CSDN博客
本想问别人但是想想还是提高自己解决问题的能力吧所以我就花了更多时间去自己搜索解决方法。 现在开始写代码
模块代码的逻辑都一样只是把标准库的函数我就不多赘述了换成了HAL库的函数
led.c
这里LED灯的熄灭与点亮有电平翻转函数HAL_GPIO_TogglePin关于HAL库的函数可以看
HAL库函数合集-CSDN博客 #include gpio.h/*** brief LED1灯亮* param 无* retval 无*/
void LED1_ON(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//控制LED1亮
}/*** brief LED2灯亮* param 无* retval 无*/
void LED2_ON(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET); //控制LED2亮
}/*** brief LED灭* param 无* retval 无*/
void LED1_OFF(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//控制LED1灭
}/*** brief LED灭* param 无* retval 无*/
void LED2_OFF(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//控制LED2灭
}/*** brief LED1灯状态切换* param 无* retval 无*/
void LED1_switch(void)
{HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
}/*** brief LED2灯状态切换* param 无* retval 无*/
void LED2_switch(void)
{HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
}
led.h
#ifndef __LED_H
#define __LED_Hvoid LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_switch(void);
void LED2_switch(void);#endifkey,c #include gpio.h
/*** brief 按键获取函数* param 无* retval 按键值1-PB1,2-pb11*/
uint8_t KEY_Getstate(void)
{uint8_t keynum 0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) 0){HAL_Delay(20);while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) 0);HAL_Delay(20);keynum 1;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11) 0){HAL_Delay(20);while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11) 0);HAL_Delay(20);keynum 2;} return keynum;
} key.h
#ifndef __KEY_H
#define __KEY_Huint8_t KEY_Getstate(void);
#endifmain
这里就定义了uint8_t keynum;
然后写了while,其他都是生产的代码 while (1){keynum KEY_Getstate();if(keynum 1){LED1_switch();}else if(keynum 2){LED1_OFF();}
}
/* USER CODE BEGIN Header */
/********************************************************************************* file : main.c* brief : Main program body******************************************************************************* attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include main.h
#include gpio.h/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t keynum;
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** brief The application entry point.* retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){keynum KEY_Getstate();if(keynum 1){LED1_switch();}else if(keynum 2){LED1_OFF();}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** brief System Clock Configuration* retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL16;if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2) ! HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** brief This function is executed in case of error occurrence.* retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* param file: pointer to the source file name* param line: assert_param error line source number* retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf(Wrong parameters value: file %s on line %d\r\n, file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */编译烧入现象和标准库一致