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

Posted Reedsway在重庆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
  {
   
  }

}

以上是关于STM32学习笔记(CubeMX配HAL)(第六天:前面内容的一个综合训练)的主要内容,如果未能解决你的问题,请参考以下文章

STM32CubeMX-HAL库开发笔记(常用语句)-基于Proteus仿真

STM32CubeMX-HAL库开发笔记(常用语句)-基于Proteus仿真

STM32CubeMx+HAL笔记常用URL

小熊派开发笔记-串口读取RS485输出的土壤七合一传感器数据(基于STM32CubeMX)

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发

STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发