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仿真
小熊派开发笔记-串口读取RS485输出的土壤七合一传感器数据(基于STM32CubeMX)