小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

【STM32基础教程07】STM32的定时器与串口综合训练

独家干货:本课程对应视频的B站链接:
https://www.bilibili.com/video/av87017878?p=7

关于sprintf()函数的用法

sprintf(),指的是字符串格式化函数,把格式化的数据写入某个字符串中。
int sprintf(char *string, char *format [,argument,…]);

引入头文件 #include “stdio.h

【例】:有一个表示温度的整型变量tmp,现在要将其格式化为字符串“温度是:XX摄氏度”,并将其通过串口1发送出去。

#include "stdio.h"
 
uint8_t Str_buff[64];   
sprintf((char*)Str_buff, "温度是: %d摄氏度", tmp);    
HAL_UART_Transmit(&huart1, Str_buff, sizeof(Str_buff), 0xFFFF);

实训案例:定时器与串口综合训练

XMF07AXMF07C开发板上,利用STM32CubeMXKeil5协同开发,完成以下的功能:
【1】开机后,LED1与LED2依次点亮,然后熄灭,进行灯光检测,高电平点亮LED灯。
【2】系统通过串口1向上位机发送一个字符串“=========XMF07欢迎你!==========”
【3】LED1作为一个秒闪灯,系统向上位机发送完字符串后,开始亮0.5
秒,灭0.5秒….循环闪烁,并启动系统运行时间的记录,其时分秒格式为 “XX:XX:XX”。
【4】上位机通过一个由3个字节组成的命令帧控制LED2灯的开关。
该命令帧的格式为 “0xBF 控制字 0xFB”。
0xBF为帧头,0xFB为帧尾,控制字的定义如下:
0xA1:打开LED2,返回信息 “XX:XX:XX LED2打开。”
0xA2:关闭LED2,返回信息 “XX:XX:XX LED2关闭。”
其他:返回信息 “XX:XX:XX 这个一个错误指令!”。

#define LED1_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET)
#define LED2_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET)
#define LED1_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET)
#define LED2_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET)

#define LED1_TOG() HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9)
#define LED2_TOG() HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8)

uint8_t str1[] = "===============XMF07欢迎你!================\r\n";
uint8_t hh = 0, mm = 0, ss = 0, ss05 = 0;
uint8_t str_buff[64];
uint8_t Rx_dat[16];
void Ckeck_LED()
{
    LED1_ON();
    HAL_Delay(500);
    LED2_ON();
    HAL_Delay(500);
	
    LED1_OFF();
    HAL_Delay(500);
    LED2_OFF();
    HAL_Delay(500);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    LED1_TOG();
    ss05++;
    if(ss05 == 2)
    {
        ss05 = 0;
        ss++;
        if(ss == 60)
        {
            ss = 0;
            mm++;
            if(mm == 60)
            {
                mm = 0;
                hh++;
            }
        }
    }
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        if(Rx_dat[0] == 0xBF && Rx_dat[2] == 0xFB)
        {
            switch(Rx_dat[1])
            {
                case 0xa1:
                    LED2_ON();
                    sprintf((char *)str_buff,"%d:%d:%d    LED2打开!\r\n",hh,mm,ss);
                break;
				
                case 0xa2:
		    LED2_OFF();
		    sprintf((char *)str_buff,"%d:%d:%d    LED2关闭!\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),10000);
	    HAL_UART_Receive_IT(&huart1,Rx_dat,3);
        }
    }
}
//在mian()函数中添加以下代码:
Ckeck_LED();                                               //LED灯流水检测
HAL_UART_Transmit(&huart1,str1,sizeof(str1),0xFFFF);       //向上位机发送欢迎字符
HAL_UART_Receive_IT(&huart1,Rx_dat,3);                     //启动串口1接收上位机3个字节
HAL_TIM_Base_Start_IT(&htim2);                             //启动定时器TIM2
赞(32)
未经允许不得转载:小蜜蜂笔记 » 【STM32基础教程07】STM32的定时器与串口综合训练

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店