【STM32CubeMX】HAL库实验中断开关点灯及串口通信

一、HAL库实验中断开关点灯题目要求

用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
进行查表查看stm32F103C8T6管脚图,我们选择PA1连接LED,PB1连接开关
在这里插入图片描述
在这里插入图片描述

二、CubeMX中断方式点灯

1、CubeMX工程设置

使用CubeMX选择Stm32F103c8芯片创建工程,来到管脚定义界面

设置指示灯LED引脚PA1,设置引脚模式为输出模式GPIO_Output
设置按键引脚PB1,设置引脚为外部中断功能,PB1与外部中断线EXIT1连接GPIO_EXIT1
设置后的引脚图如下:
在这里插入图片描述

对于LED对应的PA1管脚,默认设置即可
在这里插入图片描述

对于开关对应管脚PA1,设置其触发方式为上升沿触发

External Interrupt Mode with Rising edge trigger detection上升沿
External Interrupt Mode with Falling edge trigger detection下降沿
External Interrupt Mode with Rising/Falling edge trigger detection上升沿和下降沿
在这里插入图片描述

使能对应的外部中断线,点击Enabled
在这里插入图片描述

配置中断优先级
(大多数情况下不必设置中断优先级,直接使用中断编号设置的默认中断优先级)
在这里插入图片描述

时钟设置
这里设置了36M
在这里插入图片描述

2、生成代码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
点击GENERATE CODE即可生成代码文件,然后点击open即可打开代码
在这里插入图片描述

3、编写代码

在Keil文件中的gpio.c文件可以找到中断服务函数

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

当捕获到上升沿,触发中断,就会进入到这个函数里面

然后就会执行HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。
前面的 __weak 表示此函数为虚函数,需要用户重写的。
在这里插入图片描述
那么我们就在main.c文件里找个地方写HAL_GPIO_EXTI_Callback(GPIO_Pin)函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    
    
	if( GPIO_Pin == GPIO_PIN_1)
	{
    
    
   //

		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
	}
}

在这里插入图片描述
编译一下,没有错误
在这里插入图片描述

4、烧录

连接C8T6和USB转TTL模块后进行烧录
在这里插入图片描述

在这里插入图片描述
烧录成功

三、中断方式点灯展示

将PA1连接LED负极,LED正极连接VCC,PB1做开关
展示:
在这里插入图片描述

四、HAL库实验串口中断题目要求

采用串口中断方式重做上周的串口通信作业,分别实现:
1)当stm32接收到字符“s”时,停止持续发送“hello windows!”; 当接收到字符“t”时,持续发送“hello windows!”(提示:采用一个全局标量做信号灯);
2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!”(提示:要将接收到的连续字符保存到一个字符数组里,进行判别匹配。写一个接收字符串的函数。

五、CubeMX串口中断

1、CubeMX配置

参考中断方式点灯配置情况只需要部分配置不同
在这里插入图片描述
串口中断使能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

撰写代码

在main.c下加入下面函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance==USART1)
  {
   
    
    HAL_UART_Receive_IT(&huart1,&RxBuffer,1);
   

    
    if(RxBuffer=='s')
    {
      RxFlag=0;//ÊäÈës
      HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
    }
    else if(RxBuffer=='t')
    {
      RxFlag=1;             //ÊäÈët
      HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
    }
  }
  
}

主函数如下

int main(void)
{
    
    
  uint8_t  Hello[]={
    
    "hello windows!"};
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
 HAL_UART_RxCpltCallback(&huart1);
  while (1)
  {
    
    
     if(RxFlag==1)
    {
    
    
      HAL_Delay(100);
      HAL_UART_Transmit_IT(&huart1,(uint8_t*)Hello,14);
    }
  }
}

六、展示

QQ录屏20221021162834

猜你喜欢

转载自blog.csdn.net/qq_52201641/article/details/127395118