P7 STM32的定时器与串口综合训练

2024-03-19 21:30

本文主要是介绍P7 STM32的定时器与串口综合训练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,实训:定时器与串口综合训练

【1】开机后,LED1 LED2依次点亮,然后熄灭,进行灯光检测。
LED1 接到STM32的PB3,LED2接到STM32的PB4,低电平点亮。
【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 这个一个错误指令!”。

二,STM32CubeMX中的配置

1.新建工程,根据自己的开发板选择芯片

在这里插入图片描述在这里插入图片描述

2.配置参数

①配置RCC和SYS

在这里插入图片描述
在这里插入图片描述

②配置定时器

 i)将时钟频率设置为32MHZ
在这里插入图片描述

 ii)根据题目,需要实现亮0.5秒,然后灭0.5秒…。在时钟频率为32MHz的前题下,可以设Prescaler为32000-1,Counter Period为500-1
在这里插入图片描述

 使用定时器中断
在这里插入图片描述

③根据题目需求,配置串口

在这里插入图片描述

 打开串口中断
在这里插入图片描述

④配置LED

 将PB3和PB4设置为GPIO_Output
在这里插入图片描述

3.配置工程,并创建工程

在这里插入图片描述
在这里插入图片描述
 生成代码
在这里插入图片描述

三,在MDK上编写代码,实现需求

1.需求一:开机后,LED1 与LED2依次点亮,然后熄灭,进行灯光检测。

  在main.c的CODE BEGIN 2 处写如下代码可实现

 /* USER CODE BEGIN 2 */HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);/* USER CODE END 2 */

2.需求二:系统通过串口1向上位机发送一个字符串"XMFO7欢迎你!”。

  接在需求一的代码最后处可以实现该任务

HAL_UART_Transmit(&huart1,"XMF07欢迎你!",sizeof("XMF07欢迎你!"),10000);

在这里插入图片描述

3.需求三:LED1作为一个秒闪灯,系统向上位机发送完字符串后,开始亮0.5秒,灭0.5秒…循环闪烁,并开始启动系统运行时间的记录,其时分秒格式为“XX:XX:XX”。

①重写定时器相关的虚函数

在这里插入图片描述

②在需求二的最末尾处接上定时器的启动代码
HAL_TIM_Base_Start_IT(&htim2);
③在CODE BEGIN 0处写需求三的相关代码
/* USER CODE BEGIN 0 */
unsigned char hour = 0;
unsigned char minute = 0;
unsigned char second = 0;
unsigned char halfSecond = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
halfSecond++;
}
if(halfSecond == 2)
{
halfSecond = 0;
second++;
}
if(second == 60)
{
second = 0;
minute++;
}
if(minute == 60)
{
minute = 0;
hour++;
}
}/* USER CODE END 0 */

4.需求四:上位机通过一个由3个字节组成的命令帧控制LED2灯的开关。该命令帧的格式为“0xBF 控制字 0xFB”。

  0xBF为帧头,0xFB为帧尾,控制字的定义如下:
  0xA1:打开LED2,返回信息“XX:XX:XX LED2打开。”
  0xA2:关闭LED2,返回信息“XX:XX:XX LED2关闭。”
  其他:返回信息“XX:XX:XX 这个一个错误指令!”。

①在HAL_TIM_Base_Start_IT(&htim2);代码后接上串口接收的相关代码
HAL_UART_Receive_IT(&huart1,&Rxd_Date,3);

在这里插入图片描述

②在CODE BEGIN 0需求三的相关代码后面写如下代码
unsigned char Rxd_Date[3];
unsigned char Txd_Data1[]="00: 00: 00 LED2打开";
unsigned char Txd_Data2[]="00: 00: 00 LED2关闭";
unsigned char Txd_Data3[]="00: 00: 00 这是一个错误指令!";
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
Txd_Data1[0] = Txd_Data2[0] = Txd_Data3[0] = hour / 10 +0x30;
Txd_Data1[1] = Txd_Data2[1] = Txd_Data3[1] = hour % 10 +0x30;
Txd_Data1[4] = Txd_Data2[4] = Txd_Data3[4] = minute / 10 +0x30;
Txd_Data1[5] = Txd_Data2[5] = Txd_Data3[5] = minute % 10 +0x30;
Txd_Data1[8] = Txd_Data2[8] = Txd_Data3[8] = second / 10 +0x30;
Txd_Data1[9] = Txd_Data2[9] = Txd_Data3[9] = second % 10 +0x30;
if(huart->Instance == USART1)
{
if(Rxd_Date[0] == 0xBF && Rxd_Date[2] == 0xFB)
{
if(Rxd_Date[1] == 0xA1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_UART_Transmit(&huart1,Txd_Data1,sizeof(Txd_Data1),10000);
}
else if(Rxd_Date[1] == 0xA2)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
HAL_UART_Transmit(&huart1,Txd_Data2,sizeof(Txd_Data2),10000);
}
else
{
HAL_UART_Transmit(&huart1,Txd_Data3,sizeof(Txd_Data3),10000);
}
}else{HAL_UART_Transmit(&huart1,Txd_Data3,sizeof(Txd_Data3),10000);}
}
HAL_UART_Receive_IT(&huart1,Rxd_Date,3);
}

在这里插入图片描述

四,使用sprintf()函数

1.指的是字符串格式化函数,把格式化的数据写入某个字符串中。
int sprintf(char *string,char *format [,argument,.]);
  引入头文件 #include “stdio.h”
  例:有一个表示温度的整型变量tmp,现在要将其格式化为字符串“温度是:XX摄氏度”,并将其通过串口1发送出去。

uint8_t Str_buff[64];
sprintf((char*)Str_buff,"温度是:%d摄氏度",tmp);

2.使用sprintf()函数更改训练代码
  1)在main.c文件中加上头文件"stdio.h"
在这里插入图片描述
  2)更改main.c文件中USER CODE BEGIN 0处的代码

/* USER CODE BEGIN 0 */
unsigned char hour = 0;
unsigned char minute = 0;
unsigned char second = 0;
unsigned char halfSecond = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
halfSecond++;
}
if(halfSecond == 2)
{
halfSecond = 0;
second++;
}
if(second == 60)
{
second = 0;
minute++;
}
if(minute == 60)
{
minute = 0;
hour++;
}
}unsigned char Rxd_Date[3];
unsigned char Str_buff[64];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
if(Rxd_Date[0] == 0xBF && Rxd_Date[2] == 0xFB)
{
if(Rxd_Date[1] == 0xA1)
{
sprintf((char*)Str_buff,"%d: %d: %d LED2打开", hour, minute, second);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_UART_Transmit(&huart1,Str_buff,sizeof(Str_buff),10000);
}
else if(Rxd_Date[1] == 0xA2)
{
sprintf((char*)Str_buff,"%d: %d: %d LED关闭", hour, minute, second);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
HAL_UART_Transmit(&huart1,Str_buff,sizeof(Str_buff),10000);
}
else
{
sprintf((char*)Str_buff,"%d: %d: %d 这是一个错误指令", hour, minute, second);
HAL_UART_Transmit(&huart1,Str_buff,sizeof(Str_buff),10000);
}
}
else
{
sprintf((char*)Str_buff,"%d: %d: %d 这是一个错误指令", hour, minute, second);
HAL_UART_Transmit(&huart1,Str_buff,sizeof(Str_buff),10000);
}}
HAL_UART_Receive_IT(&huart1,Rxd_Date,3);
}/* USER CODE END 0 */

这篇关于P7 STM32的定时器与串口综合训练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827294

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注