【6】基于STM32CubeMX-STM32定时器与串口综合训练
我的学记|刘航宇的博客

【6】基于STM32CubeMX-STM32定时器与串口综合训练

刘航宇
3年前发布 /正在检测是否收录...
温馨提示:
本文最后更新于2022年11月29日,已超过853天没有更新,若内容或图片失效,请留言反馈。

目录

关于sprintf()函数的用法

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

引入头文件 #include “stdio.h“

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

#include "stdio.h"
 
uint8_t Str_buff[64];   
sprintf((char*)Str_buff, "温度是: %d摄氏度", tmp);    
HAL_UART_Transmit(&huart1, Str_buff, sizeof(Str_buff), 0xFFFF);

实训案例:定时器与串口综合训练

配置要点
时钟
图片[1] - 【6】基于STM32CubeMX-STM32定时器与串口综合训练 - 我的学记|刘航宇的博客
图片[2] - 【6】基于STM32CubeMX-STM32定时器与串口综合训练 - 我的学记|刘航宇的博客
外设
图片[3] - 【6】基于STM32CubeMX-STM32定时器与串口综合训练 - 我的学记|刘航宇的博客
图片[4] - 【6】基于STM32CubeMX-STM32定时器与串口综合训练 - 我的学记|刘航宇的博客

在XMF07A或XMF07C开发板上,利用STM32CubeMX和Keil5协同开发,完成以下的功能:
【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 这个一个错误指令!”。

#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];
void Ckeck_LED()
{
    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_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);
        }
    }
}
//在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
© 版权声明
THE END
喜欢就支持一下吧
点赞 11 分享 赞赏
评论 抢沙发
取消