STM32学习笔记(CubeMX配HAL)(第六天:前面内容的一个综合训练)

现在我们再网上找了一个小小的例子。我们可以综合做一下:

首先:上电后LED1和LED2点亮,然后熄灭,高电平点亮(根据开发板电路来进行设定,比如野火的开发板就是低电平点亮的。)

之后,上电后,开发板向串口发送“hello world”

在然后,LED1进行一个秒闪灯。再字符发送完成后,开始每0.5秒一次的一个循环。并且启动时间的一个记录:“XX : XX : XX”

最后,通过输入0xF1这类似的格式,设定一个命令,使得我输入命令后。LED2可以开关。

比如0XA1开LED2

再比如0XA2关LED24

然后会返回“XX :  XX :XX”的信号。

首先我们需要学习一个新的东西,叫做sprintf();

主要用于字符串的格式化,可以用于把格式化的数据写入某个字符串中。

因为我自己的学习,总是把C++和C有写语法搞混,所以说,需要进行一定的区别。

要用这个函数的话,需要用到#include <stdio.h>

一般来说,使用sprintf();

          Int sprintf(char *string,char*format,[argument……]);

比如说,有一个表示温度的TMP,要将其格式化为字符串“温度是:XX摄氏度”,并且将它输入出去。就需要先进行定义,然后格式化输入

Uint8_t Str_buff[64];

Sprintf((char*)Str_buff,”温度是:%d摄氏度”,TMP);

HAL_UART_Transmit(&huart1,Str_buff,sizeof(Str_buff),0xFF);

那么接下来。我把调整过的回调函数和主函数里的内容给大家展示在下面。

#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"


void SystemClock_Config(void);

#define LED1_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET)
#define LED1_OFF HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET)
#define LED2_ON HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET)
#define LED2_OFF HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET)
#define LED1_TOG HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
#define LED2_TOG HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);

uint8_t str1[]="===================welcome=====================\r\n";
uint8_t hh = 0,mm = 0,ss = 0,ss05 = 0;
uint8_t str_buff[64];//字符串缓冲数组
uint8_t Rx_data[16];

/*一些函数的定义*/
void CheckLED()
{
	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_data[0] == 0xBF && Rx_data[2] == 0xFB)
			{
				switch(Rx_data[1])
				{
					case 0xa1:
						LED2_ON;
						sprintf((char*)str_buff,"%d:%d:%d    LED2   OPEN!!!\r\n",hh,mm,ss);
					break;
					
					case 0xa2:
						LED2_OFF;
						sprintf((char*)str_buff,"%d:%d:%d     LED2  OFF!!!\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_data,3);
			}
		}
}


int main(void)
{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* 开机灯的闪烁 */
	CheckLED();
  /* 阻塞式发送 */
	HAL_UART_Transmit(&huart1,str1,sizeof(str1),10000);//阻塞式串口发送
/*非阻塞式接收*/ 
	HAL_UART_Receive_IT(&huart1,Rx_data,3);
/* 打开定时器2 */
  HAL_TIM_Base_Start_IT(&htim2);
  while (1)
  {
   
  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReedswayYuH.C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值