-
开机后,依次点亮 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);//用串口发出字符串