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

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

  • 一、HAL库实验中断开关点灯题目要求
  • 二、CubeMX中断方式点灯
    • 1、CubeMX工程设置
    • 2、生成代码
    • 3、编写代码
    • 4、烧录
  • 三、中断方式点灯展示
  • 四、HAL库实验串口中断题目要求
  • 五、CubeMX串口中断
    • 1、CubeMX配置
    • 撰写代码
  • 六、展示

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

用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
进行查表查看stm32F103C8T6管脚图,我们选择PA1连接LED,PB1连接开关
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第1张图片
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第2张图片

二、CubeMX中断方式点灯

1、CubeMX工程设置

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

设置指示灯LED引脚PA1,设置引脚模式为输出模式GPIO_Output
设置按键引脚PB1,设置引脚为外部中断功能,PB1与外部中断线EXIT1连接GPIO_EXIT1
设置后的引脚图如下:
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第3张图片

对于LED对应的PA1管脚,默认设置即可
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第4张图片

对于开关对应管脚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上升沿和下降沿
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第5张图片

使能对应的外部中断线,点击Enabled
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第6张图片

配置中断优先级
(大多数情况下不必设置中断优先级,直接使用中断编号设置的默认中断优先级)
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第7张图片

时钟设置
这里设置了36M
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第8张图片

2、生成代码

【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第9张图片

【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第10张图片
在这里插入图片描述
点击GENERATE CODE即可生成代码文件,然后点击open即可打开代码
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第11张图片

3、编写代码

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

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

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

然后就会执行HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。
前面的 __weak 表示此函数为虚函数,需要用户重写的。
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第12张图片
那么我们就在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);
	}
}

【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第13张图片
编译一下,没有错误
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第14张图片

4、烧录

连接C8T6和USB转TTL模块后进行烧录
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第15张图片

【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第16张图片
烧录成功

三、中断方式点灯展示

将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配置

参考中断方式点灯配置情况只需要部分配置不同
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第17张图片
串口中断使能
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第18张图片
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第19张图片
【STM32CubeMX】HAL库实验中断开关点灯及串口通信_第20张图片

撰写代码

在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

你可能感兴趣的:(嵌入式基础理解与应用,stm32,单片机,arm)