|
这几天都在熟悉STM32CubeMX软件,通过软件建立的模板,参考坛友lising的相关帖子,试验了通过按键控制LED灯闪烁的频率,按键检测采用中断方式,在主程序中定义一个变量,每次检测到按键时变量自加125毫秒,超过1000毫秒时又从125毫秒开始。在主程序while()循环里先对LED灯翻转,然后按照这个变量值进行延时。下面是主程序:
- int main(void)
- {
-
- /* 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();
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_USART1_Init();
- MX_I2C2_Init();
- MX_SPI1_Init();
- systick_init();
-
- led_flag = 0;
- LCD_init();
- LCD_clear();
- scree_start();
-
- while (1)
- {
- HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); //LD4端口翻转
- delay_ms(led_time);
-
- }
- }
复制代码
这是按键的处理函数,每次按键中断变量 自增125毫秒。
- /****************************************************************
- * 中断回调函数,
- * 接收中断处理函数调用EXTI4_15_IRQHandler()传递的中断引脚号 *
- ****************************************************************/
- void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
- {
- if(GPIO_Pin == KEY0_Pin) //确认PC13产生下降沿脉冲
- {
- led_time = led_time + 125;
- if(led_time > 1000) led_time = 125;
- }
- }
复制代码
下面是GPIO引脚定义和按键中断配置的函数:
- void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOB_CLK_ENABLE();
- //用户按键引脚初始化(中断方式)
- GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
- GPIO_InitStructure.Pull = GPIO_NOPULL;
- GPIO_InitStructure.Pin = KEY0_Pin;
- HAL_GPIO_Init(KEY0_GPIO_Port, &GPIO_InitStructure);
- //用户按键接PC13端口,即外部中断“EXTI Line 4 to 15 Interrupts”;
- //设置中断优先级(0~3),此处设置为最高“0”;M0+内核不支持中断子优先级,此处设置为“0”;
- HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
- //使能PC13引脚中断
- HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
- //用户LED引脚初始化
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStructure.Pull = GPIO_PULLUP;
- GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStructure.Pin = LED0_Pin;
- HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStructure);
- // GPIOA->MODER &= ~(0X3<<10); //[11:10]清0
- // GPIOA->MODER |= (1<<10); //[11:10]=01 设置PA5输出模式
- //LCD5110引脚初始化
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStructure.Pull = GPIO_PULLUP;
- GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStructure.Pin = LCD_RST | LCD_CE | LCD_DC | LCD_DIN | LCD_CLK;
- HAL_GPIO_Init(LCD_GPIO_Port, &GPIO_InitStructure);
-
- }
复制代码 |
|