侧边栏壁纸
    • 累计撰写 302 篇文章
    • 累计收到 528 条评论
    【6】基于STM32CubeMX-STM32定时器与串口综合训练
    我的学记|刘航宇的博客

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

    刘航宇
    2022-01-23 / 0 评论 / 758 阅读 / 正在检测是否收录...

    目录

    关于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);

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

    配置要点
    时钟


    外设

    在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
    11
    【7】基于STM32CubeMX-STM32ADC模数转化基本原理
    « 上一篇 2022-01-26
    【5】基于STM32CubeMX-STM32串口数据收发
    下一篇 » 2022-01-21

    评论 (0)

    取消