从点灯开始,开始stm32的学习之旅!
直奔主题:
keil软件版本:V5.35.00
单片机型号:STM32F103VET6(因手上的是野火的指南者开发板,姑且以此为例)
点灯步骤大致为:硬件图确认引脚和驱动电路——>软件配置相应引脚功能(时钟、输出模式)——>简单延时方法——>控制引脚输出高、低电平——>系统联调
step1:确认硬件连接、确认对应的GPIO引脚和驱动电路(软件需要根据具体硬件进行相关配置)
这里的小灯是一个RGB灯(红、绿、蓝),可以由三个IO口控制,输出不同颜色;同时,IO口输出低电平时灯亮,输出高电平时,灯灭
step2:知道了如何控制灯的亮灭,这里就开始配置对应的IO引脚,首先使用宏定义引脚,方便后续程序移植;
1 /** 2 ****************************************************************************** 3 * @file template/User/GPIO_LED.h 4 * @author ChuanWang 5 * @version V5.35 6 * @date 09-April-2023 7 * @brief led program body 8 ****************************************************************************** 9 * @attention 10 * 11 ****************************************************************************** 12 */ 13 14 #ifndef __GPIO_LED_H 15 #define __GPIO_LED_H 16 17 /* Includes ------------------------------------------------------------------*/ 18 #include "stm32_userconfig.h" 19 20 21 22 23 //Red 24 #define LED1_GPIO_PORT GPIOB 25 #define LED1_GPIO_CLK RCC_APB2Periph_GPIOB 26 #define LED1_GPIO_PIN GPIO_Pin_5 27 28 //Green 29 #define LED2_GPIO_PORT GPIOB 30 #define LED2_GPIO_CLK RCC_APB2Periph_GPIOB 31 #define LED2_GPIO_PIN GPIO_Pin_0 32 33 //Blue 34 #define LED3_GPIO_PORT GPIOB 35 #define LED3_GPIO_CLK RCC_APB2Periph_GPIOB 36 #define LED3_GPIO_PIN GPIO_Pin_1 37 38 39 40 41 /*LED使用的GPIO引脚初始化*/ 42 extern void LED_GPIO_Config(void); 43 44 45 46 #endif /*__GPIO_LED_H*/GPIO_LED.h
step3:配置引脚时钟、引脚模式、引脚速率以及初始状态
1 /** 2 ****************************************************************************** 3 * @file template/User/GPIO_LED.c 4 * @author ChuanWang 5 * @version V5.35 6 * @date 09-April-2023 7 * @brief led gpio program body 8 ****************************************************************************** 9 * @attention 10 * 11 ****************************************************************************** 12 */ 13 14 /* Includes ------------------------------------------------------------------*/ 15 #include "GPIO_LED.h" 16 17 18 19 /* Private functions ---------------------------------------------------------*/ 20 /** 21 * @brief LED_GPIO_Config program. 22 * @param None 23 * @retval None 24 */ 25 void LED_GPIO_Config(void) 26 { 27 /*定义一个GPIO_InitTypeDef类型的结构体*/ 28 GPIO_InitTypeDef GPIO_InitStructure; 29 30 /*开启LED相关的GPIO外设时钟*/ 31 RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE); //使用宏来赋值,方便移植 32 33 /*选择需要控制点GPIO引脚*/ 34 GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; 35 36 /*设置引脚模式为通用推挽输出*/ 37 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 38 39 /*设置引脚速率为50MHz*/ 40 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 41 42 /*调用库函数,初始化GPIO*/ 43 GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStructure); 44 45 46 /*选择需要控制点GPIO引脚*/ 47 GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN; 48 49 /*调用库函数,初始化GPIO*/ 50 GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStructure); 51 52 /*选择需要控制点GPIO引脚*/ 53 GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN; 54 55 /*调用库函数,初始化GPIO*/ 56 GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure); 57 58 59 /*关闭所有LED灯*/ 60 GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN); //使用宏控制RGB灯默认为关闭状态 61 GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN); 62 GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN); 63 }GPIO_LED.c
step4:在led_operation中对led控制,由于使用宏定义,没有自定义方法,故没有贴出来led_operation.c代码(空)
1 /** 2 ****************************************************************************** 3 * @file template/User/led_operation.h 4 * @author ChuanWang 5 * @version V5.35 6 * @date 02-April-2023 7 * @brief led program body 8 ****************************************************************************** 9 * @attention 10 * 11 ****************************************************************************** 12 */ 13 14 #ifndef __LED_OPERATION_H 15 #define __LED_OPERATION_H 16 17 /* Includes ------------------------------------------------------------------*/ 18 #include "stm32_userconfig.h" 19 20 21 ////Red 22 //#define LED1_GPIO_PORT GPIO_B 23 //#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB 24 //#define LED1_GPIO_PIN GPIO_Pin_5 25 26 ////Green 27 //#define LED2_GPIO_PORT GPIO_B 28 //#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB 29 //#define LED2_GPIO_PIN GPIO_Pin_0 30 31 ////Blue 32 //#define LED3_GPIO_PORT GPIO_B 33 //#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB 34 //#define LED3_GPIO_PIN GPIO_Pin_1 35 36 37 38 39 40 /*直接操作寄存器的方法控制 IO*/ 41 #define digitalHi(p,i) {p->BSRR=i;} //输出为高电平 42 #define digitalLo(p,i) {p->BRR=i;} //输出低电平 43 #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态 44 45 46 47 /*定义控制 IO 的宏*/ 48 #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN) 49 #define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN) 50 #define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN) 51 52 #define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN) 53 #define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN) 54 #define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN) 55 56 #define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN) 57 #define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN) 58 #define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN) 59 60 61 62 /*基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好*/ 63 /*#define 只会对当前行有效,所以使用续航符连接起来*/ 64 //红色 65 #define LED_RED \ 66 LED1_ON;\ 67 LED2_OFF;\ 68 LED3_OFF 69 70 //绿色 71 #define LED_GREEN \ 72 LED1_OFF;\ 73 LED2_ON;\ 74 LED3_OFF 75 76 77 //蓝色 78 #define LED_BLUE \ 79 LED1_OFF;\ 80 LED2_OFF;\ 81 LED3_ON 82 83 //黄色(红色+绿色) 84 #define LED_YELLOW \ 85 LED1_ON;\ 86 LED2_ON;\ 87 LED3_OFF 88 89 //紫色(红色+蓝色) 90 #define LED_PURPLE \ 91 LED1_ON;\ 92 LED2_OFF;\ 93 LED3_ON 94 95 96 //青色(绿色+蓝色) 97 #define LED_CYAN \ 98 LED1_OFF;\ 99 LED2_ON;\ 100 LED3_ON 101 102 103 //白色(红色+绿色+蓝色) 104 #define LED_WHITE \ 105 LED1_ON;\ 106 LED2_ON;\ 107 LED3_ON 108 109 110 //黑色(团灭) 111 #define LED_RGBOFF \ 112 LED1_OFF;\ 113 LED2_OFF;\ 114 LED3_OFF 115 116 117 118 119 120 #endif /*__LED_OPERATION_H*/led_operation.h
step5:在main中调用方法实现点灯
1 /** 2 ****************************************************************************** 3 * @file template/User/main.c 4 * @author ChuanWang 5 * @version V5.35 6 * @date 09-April-2023 7 * @brief Main program body 8 ****************************************************************************** 9 * @attention 10 * 11 ****************************************************************************** 12 */ 13 14 /* Includes ------------------------------------------------------------------*/ 15 #include "stm32_userconfig.h" 16 17 18 19 20 /* Private functions ---------------------------------------------------------*/ 21 22 23 24 25 26 /** 27 * @brief Main program. 28 * @param None 29 * @retval None 30 */ 31 int main(void) 32 { 33 LED_GPIO_Config(); 34 35 for(;;) 36 { 37 LED1_ON; //亮 38 Delay(3000000); 39 LED1_OFF; //灭 40 41 LED2_ON; //亮 42 Delay(3000000); 43 LED2_OFF; //灭 44 45 LED3_ON; //亮 46 Delay(3000000); 47 LED3_OFF; //灭 48 49 50 /*红绿蓝黄紫青白*/ 51 LED_RED; 52 Delay(3000000); 53 54 LED_GREEN; 55 Delay(3000000); 56 57 LED_BLUE; 58 Delay(3000000); 59 60 LED_YELLOW; 61 Delay(3000000); 62 63 LED_PURPLE; 64 Delay(3000000); 65 66 LED_CYAN; 67 Delay(3000000); 68 69 LED_WHITE; 70 Delay(3000000); 71 72 LED_RGBOFF; 73 Delay(3000000); 74 75 } 76 } 77 78 79 80 81 82 /** 83 * @brief SimpleDelay program. 84 * @param None 85 * @retval None 86 */ 87 void Delay(__IO uint32_t nCount) 88 { 89 /*简单的延时函数*/ 90 for(; nCount != 0; nCount--); 91 } 92 93 94 /************************END OF FILE*****************************/main.c
效果演示:
至此,led点灯完成
标签:LED1,LED3,LED2,LED,stm32,------,GPIO,define From: https://www.cnblogs.com/xugdawn666/p/17291275.html