STM32的定时器与串口综合实验

文章介绍了在STM32平台上如何使用GPIO控制LED灯的开关,实现LED流水灯效果,并通过串口与上位机进行通信,包括发送字符串和接收命令控制LED2灯。还展示了如何使用定时器和串口回调函数进行时间同步和错误处理。
摘要由CSDN通过智能技术生成

  • 开机后,依次点亮 led1,led2 然后熄灭,进行灯光检测 LED1: PA11 LED2:PA12

/*宏定义*/
#define LED1_KAI() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET)          //宏定义LED1开灯
#define LED1_GUAN() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET)       //宏定义LED1关灯
#define LED2_KAI() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET)          //宏定义LED2开灯
#define LED2_GUAN() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET)       //宏定义LED2关灯
​
#define LED1_TOG() HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11);                     //对LED1进行电平反转
#define LED2_TOG() HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_12);                     //对LED2进行电平反转
​
void LED_SHANS()                                                            //LED流水灯函数
{
  LED1_KAI();                                                                  //开灯1
  HAL_Delay(500);                                                              //延时
  LED2_KAI();                                                                  //开灯2
  HAL_Delay(500);                                                              //延时
​
  LED1_GUAN();                                                                 //关灯1
  HAL_Delay(500);                                                              //延时
  LED2_GUAN();                                                                 //关灯2
  HAL_Delay(500);                                                              //延时
}

  • 通过串口1向上位机发送一个字符串“STM32 hello“

uint8_t str1[]="=============STM32 HELLOW=============";                      //定义字符串
uint8_t str_buff[64];                                                         //定义用于储存格式化后字符串的参数
​
HAL_UART_Transmit(&huart1,str1,sizeof(str1),1000);                           //利用HAL_UART_Transmit函数通过串口发送字符串

  • LED1作为秒闪灯,系统向上位机发送一个字符串后,开始亮0.5秒,灭0.5秒。。。循环闪烁,并开始启动系统运行时间的记录,其格式为"xx:xx:xx"

uint8_t hh = 0, mm = 0, ss = 0, ss05=0 ;                                      //定义时间字符串/时/分/秒
​
​
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)                  //重写时间xx:xx:xx的回调函数
 {
    LED2_TOG();                                                               //LED1进行反转闪烁
    ss05++;                                                                   //0.5毫秒进行自加
​
    if (ss05 == 2 ){                                                         //当自加到1秒时    
      ss05=0;                                                                 //毫秒清零
      ss++;                                                                   //秒自加1
​
      if (ss==60){                                                           //当秒自加到60时      
        ss=0;                                                                 //秒清零
        mm++;                                                                 //分自加一
​
        if (mm==60){                                                         //当分自加到60时        
          mm=0;                                                               //分清零
          hh++;                                                               //时自加一
        }        
      }  
    }
 }
​
 

  • 上位机通过一个由3个字节组成的命令帧控制LED2 灯的开关。格式为"0xAF 控制字 0xFA"

    0xAF为帧头,0xFA为帧尾
    
    控制字的定义为:
    
    0xA1打开灯LED2 返回消息”XX:XX:XX LED2打开“
    
    0xA2关闭灯LED2 返回消息”XX:XX:XX LED2关闭“
    
    其他:
    
    返回消息”XX:XX:XX 这是个错误指令“
    
    
    
    uint8_t Rx_dat[16];                                                           //用于串口返回的字符串数组
    ​
    ​
    /*HAL_UART_RxCpltCallback*/
     void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)                       //重写读取串口的回调函数
     {
      if (huart->Instance==USART1)
      {
        if (Rx_dat[0]==0xAF&&Rx_dat[2]==0xFA)                                       //判断接收字符串的第一个元素和最后一个元素
        {
          switch (Rx_dat[1])                                                      //判断第二个元素
          {
          case 0xA1:                                                              //如果为0XA1
                      LED1_KAI();                                                 //打开灯
                      sprintf((char*)str_buff,"%d:%d:%d       打开LED1\r\n",hh,mm,ss);//并向串口发送此字符串
            break;
    ​
          case 0xA2:                                                              //如果为0XA2
                      LED1_GUAN();                                                //关闭灯
                      sprintf((char*)str_buff,"%d:%d:%d       关闭LED1\r\n",hh,mm,ss);//并向串口发送此字符串        
            break;
          
          default:sprintf((char*)str_buff,"%d:%d:%d       这是错误指令\r\n",hh,mm,ss);  //否则输出此字符串
            break;
          }
          HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),1000);
          HAL_UART_Receive_IT(&huart1,Rx_dat,3);  
        }
        
      }
      
     }

主函数的调用:

 /*初始化*/
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /*调用*/
  LED_SHANS();                                                        //调用LEDS闪烁函数
  HAL_UART_Transmit(&huart1,str1,sizeof(str1),1000);                  //利用HAL_UART_Transmit函数通过串口发送字符串
  HAL_TIM_Base_Start_IT(&htim2);                                      //打开定时器2
  HAL_UART_Receive_IT(&huart1,Rx_dat,3);                              //利用 HAL_UART_Receive_IT打开串口接收

注:关于sprintf()函数的用法------(常用)

sprintf(),指的是字符串格式化函数,把格式化的数据写入某个字符串中。
    int sprintf(char*string,char*format[zifuchan]);//将第二个字符串格式化后传入第一个字符串中
​
/*想要使用字符串格式化函数:sprintf,需要引用头文件:*/
#include "stdio.h"
​
/*举例子:有一个表示温度的整形变量tmp, 现在要将其格式化为字符串 “温度是:XX摄氏度”,并将其通过串口发送出去。*/
    
    uint8_t str_buff[64]        //定义一个字符串变量,用于储存格式化后的字符串
    sprintf((char*)str_buff,"温度是:%d摄氏度",tmp); //将tmp放入%d占位符
    HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),0xFFFF);//用串口发出字符串
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值