wordpress 角色,宁波seo网络推广推荐公众号,云南网站的设计公司简介,西安公司注册费用理论说明 输入 上拉输入#xff1a;拉高电平
下拉输入#xff1a;拉低电平
浮空输入#xff1a;不拉高也不拉低电平 输出 开漏输出#xff1a;不能输出高电平#xff08;P-MOS不可用#xff0c;则只能低电平#xff09;
推挽输出#xff1a;可输出高低电平 输出速率… 理论说明 输入
上拉输入拉高电平
下拉输入拉低电平
浮空输入不拉高也不拉低电平 输出
开漏输出不能输出高电平P-MOS不可用则只能低电平
推挽输出可输出高低电平 输出速率
Low2MHzMedium10MHzHigh50MHz 代码编写
几个功能例程的配置及代码 Cube IDE代码 LED灯闪烁
配置引脚功能 在main.c文件大概94行开始 /* USER CODE BEGIN WHILE */
while (1)
{//参数1GPIO口名字(PB)参数2GPIO数字(PB5中的5)参数3高低电平(0,1)HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);HAL_Delay(1000);HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);//HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //电平反转,无需设置高低电平HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}/* USER CODE END 3 */实验二
按键PE3控制蜂鸣器开关、按键PE4控制 LED2(PE5) 亮灭、光敏传感器控制 LED1(PB5) 亮灭
按键设置成上拉输入PE4则为高电平当按键按下时PE4为0则按键按下(其它按钮同理) LED灯、蜂鸣器(PB8)输出高低电平设置推挽输出
光敏传感器(PB11)高低电平由外界光照强度来决定设置浮空输入
按键配置 LED灯配置方面已经说明直接配置
蜂鸣器配置(PB8) 光敏传感器配置(PB11) 光敏传感器AO DO有什么区别
AO输出模拟信号
DO输出数字信号高低电平
在main.c文件大概94行开始
/* USER CODE BEGIN WHILE */
while (1)
{if(0 HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin)) //检测读取按键高低电平{HAL_Delay(120);if(0 HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin)) //检测读取按键高低电平{HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin); //电平反转,无需设置高低电平}}if(0 HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin)) //检测读取按键输入高低电平{HAL_Delay(120);if(0 HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin)) //检测读取按键高低电平{HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //电平反转,无需设置高低电平}}if(0 HAL_GPIO_ReadPin(SUN_GPIO_Port, SUN_Pin)) //检测读取光敏传感器输入高低电平{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}效果展示 代码过程
初始化时钟
初始化时钟
APB2ENR外设时钟使能寄存器 大概功能将APB2ENR(外设时钟使能寄存器)初始化IO端口B时钟开启
//初始化代码在gpio.c中48行
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();//__HAL_RCC_GPIOB_CLK_ENABLE(); 如下过程
#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \__IO uint32_t tmpreg; /*定义一个变量*/\SET_BIT(RCC-APB2ENR, RCC_APB2ENR_IOPBEN);\/* Delay after an RCC peripheral clock enabling(下方两个延时作用) */\tmpreg READ_BIT(RCC-APB2ENR, RCC_APB2ENR_IOPBEN);\UNUSED(tmpreg); \} while(0U)//SET_BIT(RCC-APB2ENR, RCC_APB2ENR_IOPBEN); 的解释//1.RCC_APB2ENR_IOPBEN
#define RCC_APB2ENR_IOPBEN_Pos (3U)
#define RCC_APB2ENR_IOPBEN_Msk (0x1UL RCC_APB2ENR_IOPBEN_Pos) /*RCC_APB2ENR_IOPBEN_Msk 等于0x1 3 结果0x00000008 */
//0x1 0000 0001 3 0000 1000(对应上图,位3为1) 0x00000008
#define RCC_APB2ENR_IOPBEN RCC_APB2ENR_IOPBEN_Msk /* RCC_APB2ENR_IOPBEN 等于0x00000008 *///2.RCC寄存器RCC_BASE强转成这个RCC_TypeDef类型的结构体
#define RCC ((RCC_TypeDef *)RCC_BASE)
//RCC_BASE 由总线矩阵偏移到AHB系统总线再偏移到复位和时钟控制(RCC)(可看参考手册的系统结构)(下面三行从下往上看)
#define RCC_BASE (AHBPERIPH_BASE 0x00001000UL)
#define AHBPERIPH_BASE (PERIPH_BASE 0x00020000UL)
#define PERIPH_BASE 0x40000000UL
//RCC_TypeDef结构体
typedef struct
{__IO uint32_t CR;__IO uint32_t CFGR;__IO uint32_t CIR;__IO uint32_t APB2RSTR;__IO uint32_t APB1RSTR;__IO uint32_t AHBENR;__IO uint32_t APB2ENR;__IO uint32_t APB1ENR;__IO uint32_t BDCR;__IO uint32_t CSR;
} RCC_TypeDef;//3.RCC-APB2ENR
RCC指向APB2ENR则就是结构体内的__IO uint32_t APB2ENR;//将APB2ENR的位3置1初始化引脚
GPIOx_BSRR端口位设置/清除寄存器
低16位中若有某一位 置1则这个引脚为1(高电平)若都为0则不影响
高16位中若有某一位 置1则这个引脚位0(低电平)若都为0则不影响 //gpio.c中第53行
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState ! GPIO_PIN_RESET) //GPIO_PIN_RESET为0{GPIOx-BSRR GPIO_Pin; //给BSRR寄存器 低16位赋值 置1}else{GPIOx-BSRR (uint32_t)GPIO_Pin 16u; //给BSRR寄存器 高16位赋值 置0}
}//GPIO_TypeDef *GPIOx 等于 LED2_GPIO_Port
#define LED2_GPIO_Port GPIOE
#define GPIOE ((GPIO_TypeDef *)GPIOE_BASE)
//GPIO_TypeDef 强转
typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;
#define GPIOE_BASE (APB2PERIPH_BASE 0x00001800UL)
#define APB2PERIPH_BASE (PERIPH_BASE 0x00010000UL)
#define PERIPH_BASE 0x40000000UL//GPIO_Pin 等于 LED2_Pin
#define LED2_Pin GPIO_PIN_5
#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
写实际需求输入read 判断输出write 0/1 Keil代码
修改的地方如下
main.c
//main函数中
while (1)
{if(0 HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin)) //检测读取按键高低电平{HAL_Delay(120);if(0 HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin)) //检测读取按键高低电平{HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin); //电平反转,无需设置高低电平}}if(0 HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin)) //检测读取按键输入高低电平{HAL_Delay(120);if(0 HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin)) //检测读取按键高低电平{HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //电平反转,无需设置高低电平}}if(0 HAL_GPIO_ReadPin(SUN_GPIO_Port, SUN_Pin)) //检测读取光敏传感器输入高低电平{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);}
}gpio.c
void MDK_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);/*Configure GPIO pins : PEPin PEPin */GPIO_InitStruct.Pin Key1_Pin|Key2_Pin;GPIO_InitStruct.Mode GPIO_MODE_INPUT;GPIO_InitStruct.Pull GPIO_PULLUP;HAL_GPIO_Init(GPIOE, GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin LED2_Pin;GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull GPIO_NOPULL;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED2_GPIO_Port, GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin SUN_Pin;GPIO_InitStruct.Mode GPIO_MODE_INPUT;GPIO_InitStruct.Pull GPIO_NOPULL;HAL_GPIO_Init(SUN_GPIO_Port, GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin LED1_Pin;GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull GPIO_NOPULL;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED1_GPIO_Port, GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin BEEP_Pin;GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull GPIO_PULLUP;GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(BEEP_GPIO_Port, GPIO_InitStruct);
}main.h
//60行开始
#define Key1_Pin GPIO_PIN_3
#define Key1_GPIO_Port GPIOE
#define Key2_Pin GPIO_PIN_4
#define Key2_GPIO_Port GPIOE
#define LED2_Pin GPIO_PIN_5
#define LED2_GPIO_Port GPIOE
#define SUN_Pin GPIO_PIN_11
#define SUN_GPIO_Port GPIOB
#define LED1_Pin GPIO_PIN_5
#define LED1_GPIO_Port GPIOB
#define BEEP_Pin GPIO_PIN_8
#define BEEP_GPIO_Port GPIOB若烧录完成后需要按复位按键才可正常可尝试以下设置
第一步 第二步