https://liu-yaohua.github.io

0%

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

关于sprintf()函数的用法

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

引入头文件 #include “stdio.h

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

1
2
3
4
5
#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 这个一个错误指令!”。

1
2
3
4
5
6
7
8
9
10
11
12
#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];
1
2
3
4
5
6
7
8
9
10
11
12
void Ckeck_LED()
{
LED1_ON();
HAL_Delay(500);
LED2_ON();
HAL_Delay(500);

LED1_OFF();
HAL_Delay(500);
LED2_OFF();
HAL_Delay(500);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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++;
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
}
}
}
1
2
3
4
5
//在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