STM32G431-基于HAL库(第十四届蓝桥杯嵌入式模拟题2)

2023-05-16

文章目录

  • 前言
  • 一、CubeMX配置(第十四届模拟题2完整版)
  • 二、代码相关定义、声明
    • 1.函数声明
    • 2.宏定义
    • 3.变量定义
  • 三、主要函数
    • 1.按键扫描
    • 2.各参数控制
    • 3.LCD显示
    • 4.输出信号改变
    • 5.串口接收
    • 6.Main函数
  • 四、实验结果
    • 1.数据页1
    • 2.数据页2
    • 3.输出频率
    • 4.串口数据
  • 五、查漏补缺!
  • 六、源码(转载请注明出处)
  • 总结


前言

相关说明:

开发板:CT117E-M4(STM32G431RB 蓝桥杯嵌入式比赛板)
开发环境: CubeMX+Keil5
涉及题目:第十四届蓝桥杯嵌入式模拟题2
题目难点:难度相对较低
题目来源:4T


CubeMX配置、主要函数代码及说明:

一、CubeMX配置(第十四届模拟题2完整版)

1.使能外部高速时钟:
在这里插入图片描述
2.配置时钟树:
在这里插入图片描述
3.GPIO:

在这里插入图片描述

4.TIM2(PA1输出):在这里插入图片描述在这里插入图片描述
5.TIM3(同上,PA7输出):在这里插入图片描述
在这里插入图片描述
6.TIM6(控制LED闪烁):
在这里插入图片描述

7.TIM7(判断串口接收,同上,5ms中断):
在这里插入图片描述

8.NVIC(输入捕获中断配置):在这里插入图片描述

二、代码相关定义、声明

1.函数声明

main.c
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);//输入捕获中断函数 计算输入信号频率
void LCD_Init_Show(void);	//LCD初始化显示
void LCD_Refresh(void);		//LCD更新显示 

gpio.h
void KEY_Scan(void);//按键扫描
void LED_AllClose(uint8_t *LED_Close);//LED更新显示
void LED_Change(void);//LED状态改变

adc.h
double ADC_GetValue(void);//获取R37电压值

time.h
void PWM_Out(double R37_V,uint32_t FRQ,uint8_t	R);//PWM输出

2.宏定义

在CubeMX中可以配置User Label选项即可生成对应宏定义
在这里插入图片描述生成宏定义:

main.h
#define LED6_Pin GPIO_PIN_13
#define LED6_GPIO_Port GPIOC
#define LED7_Pin GPIO_PIN_14
#define LED7_GPIO_Port GPIOC
#define LED8_Pin GPIO_PIN_15
#define LED8_GPIO_Port GPIOC
#define KEY4_Pin GPIO_PIN_0
#define KEY4_GPIO_Port GPIOA
#define KEY1_Pin GPIO_PIN_0
#define KEY1_GPIO_Port GPIOB
......此处省略

自定义宏定义(灯的控制,PD2引脚控制):

main.h
#define OFF GPIO_PIN_SET
#define ON  GPIO_PIN_RESET

#define LED1(a) HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,a)
#define LED2(a) HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,a)
#define LED3(a) HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,a)
#define LED4(a) HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,a)
#define LED5(a) HAL_GPIO_WritePin(LED5_GPIO_Port,LED5_Pin,a)
#define LED6(a) HAL_GPIO_WritePin(LED6_GPIO_Port,LED6_Pin,a)
#define LED7(a) HAL_GPIO_WritePin(LED7_GPIO_Port,LED7_Pin,a)
#define LED8(a) HAL_GPIO_WritePin(LED8_GPIO_Port,LED8_Pin,a)

#define LED_All(a) HAL_GPIO_WritePin(LED8_GPIO_Port,GPIO_PIN_All,a) 

#define LOCK_HIGH() HAL_GPIO_WritePin(LOCK_GPIO_Port,LOCK_Pin,GPIO_PIN_SET) 
#define LOCK_LOW()  HAL_GPIO_WritePin(LOCK_GPIO_Port,LOCK_Pin,GPIO_PIN_RESET) 

3.变量定义

char buf[20];				//字符串拼接数组
uint8_t LED[4] = {1,0,1,0}; //LED状态数组

uint16_t PA7_HZ = 1000;		//PA7输出信号频率
uint8_t PA7_D = 10;			//PA7输出信号占空比
uint16_t PA1_HZ = 1000;		//PA1输出信号频率
uint8_t PA1_D = 10;			//PA1输出信号占空比
uint8_t page = 1;			//page1:PA1数据页 page2:PA7数据页
uint8_t rec_byte;			//串口数据存储
uint8_t mode = 1;			//当前模式 1:按键控制 0:串口控制
uint8_t rec_flag = 0;		//串口接收标志位
uint16_t rec_num = 0;		//串口一次接收字节数

三、主要函数

1.按键扫描

此处将按键按下后的操作都封装成独立的函数调用:
KEY1 – 改变频率
KEY2 – 改变占空比
KEY3 – 数据页改变
KEY4 – 操作模式改变

void KEY_Process()
{
	if((HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET))
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
		{
			HZ_Change();//频率改变
			while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET);
		}
	}
	
	else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
		{
			D_Change();//占空比改变
			while(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET);
		}
	}
	
	else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_RESET && (mode == 1))
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_RESET)
		{
			Page_Change();//数据页改变
			while(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_RESET);
		}
	}
	
	else if(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_RESET)
	{
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_RESET)
		{
			Mode_Change();//模式改变
			while(HAL_GPIO_ReadPin(KEY4_GPIO_Port,KEY4_Pin) == GPIO_PIN_RESET);
		}
	}
}

2.各参数控制

输出信号频率、占空比、数据页以及操作模式改变

/*相关变量*/
uint16_t PA7_HZ = 1000;			//PA7输出信号频率
uint8_t PA7_D = 10;				//PA7输出信号占空比
uint16_t PA1_HZ = 1000;			//PA1输出信号频率
uint8_t PA1_D = 10;				//PA1输出信号占空比
uint8_t page = 1;				//page1:PA1数据页 page2:PA7数据页
uint8_t mode = 1;				//当前模式 1:按键控制 0:串口控制

const uint16_t HZ_pace = 1000;
const uint16_t HZ_max = 10000;
const uint16_t HZ_min = 1000;
const uint8_t D_pace = 10;
const uint8_t D_max = 90;
const uint8_t D_min = 10;

/*频率改变*/
void HZ_Change()
{
	if(page == 1)//PA1
	{
		PA1_HZ+=HZ_pace;
		if(PA1_HZ > HZ_max)
		{
			PA1_HZ = HZ_min;
		}
	}
	else if(page == 2)//PA7
	{
		PA7_HZ+=HZ_pace;
		if(PA7_HZ > HZ_max)
		{
			PA7_HZ = HZ_min;
		}
	}
	
	PWM_change();//频率、占空比改变
	HAL_TIM_Base_Start(&htim6);//开启定时器
}

/*占空比改变*/
void D_Change()
{
	if(page == 1)//PA1
	{
		PA1_D+=D_pace;
		if(PA1_D > D_max)
		{
			PA1_D = D_min;
		}
	}
	else if(page == 2)//PA7
	{
		PA7_D+=D_pace;
		if(PA7_D > D_max)
		{
			PA7_D = D_min;
		}
	}
	
	PWM_change();
}

/*模式改变*/
void Mode_Change()
{
	mode = !mode;//模式改变
	
	if(mode == 1)//按键模式
	{
		LED[3] = 0;
	}
	else//串口模式
	{
		LED[3] = 1;
	}
	
	LED_Control(LED);//LED更新
}

/*数据页改变*/
void Page_Change()
{
	if(page == 1)//PA1数据页->PA7数据页
	{
		page = 2;
		sprintf(buf,"    PA7    "); 
		LED[1] = 1;
		LED[2] = 0;
	}
	else if(page == 2)//PA7数据页->PA1数据页
	{
		page = 1;
		sprintf(buf,"    PA1    "); 
		LED[1] = 0;
		LED[2] = 1;
	}
	
	LED_Control(LED);//LED更新
	LCD_DisplayStringLine(Line2,(u8*)buf);//JLCD更新
}

3.LCD显示

共有两个函数:
1.LCD_InitShow(),在上电启动后对LCD进行初始化显示操作。
2.LCD_Refresh(),LCD更新显示,数据更新后需要实时进行更新显示。

/*LCD初始化显示函数*/
void LCD_InitShow()
{
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	
	LCD_DisplayStringLine(Line0,(u8*)"                    ");
	LCD_DisplayStringLine(Line1,(u8*)"                    ");
	LCD_DisplayStringLine(Line2,(u8*)"    PA1             ");
	LCD_DisplayStringLine(Line3,(u8*)"                    ");
	
	sprintf(buf,"    F:%d    ",PA1_HZ);
	LCD_DisplayStringLine(Line4,(u8*)buf);
	
	LCD_DisplayStringLine(Line5,(u8*)"                    ");
	
	sprintf(buf,"    D:%d    ",PA1_D);
	LCD_DisplayStringLine(Line6,(u8*)buf);
	LCD_DisplayStringLine(Line7,(u8*)"                    ");
	LCD_DisplayStringLine(Line8,(u8*)"                    ");
	LCD_DisplayStringLine(Line9,(u8*)"                    ");
}

/*LCD更新函数 page1:PA1 page2:PA7*/
void LCD_Refresh()
{
	if(page == 1)
	{
		sprintf(buf,"    F:%d    ",PA1_HZ);
		LCD_DisplayStringLine(Line4,(u8*)buf);
		sprintf(buf,"    D:%d    ",PA1_D);
		LCD_DisplayStringLine(Line6,(u8*)buf);
	}
	else if(page == 2)
	{
		sprintf(buf,"    F:%d    ",PA7_HZ);
		LCD_DisplayStringLine(Line4,(u8*)buf);
		sprintf(buf,"    D:%d    ",PA7_D);
		LCD_DisplayStringLine(Line6,(u8*)buf);
	}
}

4.输出信号改变

直接对TIM2和TIM3的寄存器操作即可
ARR – 寄存器存储的是重装载值
CCRx – 定时器x通道的比较值
要使定时器输出对应频率的信号,重装载值=定时器工作频率/目标频率
控制该信号的占空比,比较值=重装载值*占空比

void PWM_change()
{
	if(page == 1)//PA1
	{
		TIM2->ARR = 1000000/PA1_HZ;//改变频率
		TIM2->CCR2 = TIM2->ARR*PA1_D/100;//改变占空比
		TIM2->CNT = 0;//清空计数值
	}
	else if(page == 2)
	{
		TIM3->ARR = 1000000/PA7_HZ;//改变频率
		TIM3->CCR2 = TIM3->ARR*PA7_D/100;//改变占空比
		TIM3->CNT = 0;//清空计数值
	}
}

5.串口接收

每次串口接收到数据都重新开启定时器,这样能使最后一字节数据接收完5ms后才开始对接收数据进行处理,而不是每接收一个字节数据都去处理一次

/*相关变量*/
uint8_t rec_flag = 0;				//串口接收标志位
uint16_t rec_num = 0;				//串口一次接收字节数

/*定时器回调函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
{
	...
	if(htim == &htim7)
	{
		HAL_TIM_Base_Stop_IT(&htim7);//关闭定时器7
		rec_flag = 1;//接收检测标志位置1
	}
	...
}

/*串口接收回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
{
	rec_num++;//接收字节数增加
	HAL_UART_Receive_IT(&huart1,&rec_byte,1);//再次打开串口接收中断
	TIM7->CNT = 0;//定时器7计数值清零 重新计时
	HAL_TIM_Base_Start_IT(&htim7);//开始计时
}

6.Main函数

注意调用PWM的start函数打开PWM、以中断方式打开定时器以及打开串口接收中断等

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_TIM7_Init();
  /* USER CODE BEGIN 2 */
	LCD_Init();//LCD初始化
	LCD_InitShow();//LCD初始化显示
	LED_Control(LED);//LED初始化
	
	HAL_UART_Receive_IT(&huart1,&rec_byte,1);//打开串口接收中断
	
	HAL_TIM_Base_Start_IT(&htim6);//开启定时器6
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//PWM启动
	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//PWM启动
	
	printf("uart test...\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		KEY_Process();//按键处理
		LCD_Refresh();//LCD更新
		
		if(rec_flag == 1)//串口数据接收标志位
		{
			rec_flag = 0;//标志位清零
			Check_UartRec();//串口数据处理
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

四、实验结果

1.数据页1

上电默认值F为1000 D为10
请添加图片描述

2.数据页2

上电默认值F为1000 D为10
请添加图片描述

3.输出频率

默认D值为10,占空比为10%,F为1000,输出频率为1KHz
请添加图片描述

4.串口数据

1.按键控制模式:
在这里插入图片描述2.串口控制模式,数据长度不符:
在这里插入图片描述3.切换到PA7数据页,操作成功:
在这里插入图片描述

五、查漏补缺!

1.蓝桥杯嵌入式赛前梳理
2.一文看懂如何使用RTC秒中断
3.一文看懂如何解决LED与LCD冲突
4.一文看懂如何玩转显示高亮

六、源码(转载请注明出处)

在这里插入图片描述


总结

以上就是全部内容,如有错误请批评指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32G431-基于HAL库(第十四届蓝桥杯嵌入式模拟题2) 的相关文章

  • 树莓派4 运行 Tensorflow Lite

    树莓派4 运行 Tensorflow Lite 1 更新树莓派 span class token function sudo span apt update 2 下载安装脚本 span class token function git sp
  • 操作系统进程进行系统调用详细过程

    翻阅很多资料 xff0c 综合了各处所述进程在进行系统调用之后的状态会如何的解答 xff0c 以下是我个人理解 xff0c 欢迎各位读者纠错 PS 特别感谢以下这个帖子 xff0c 看完他们的讨论我才茅塞顿开 xff0c 非常感谢 xff0
  • 解决Ubuntu 找不到ARM64 的源的问题(转)

    Ubuntu 安装了NVIDIA的驱动还有DriveWokrs之后 xff0c 好像把系统添加了arm64的架构 xff0c 因此 xff0c 在源更新的时候 xff0c 也会更新arm64相关的源 xff0c 但是问题在于 xff0c 用
  • asp.net 实现打开文件所在的文件夹, 本地可以打开,发布后点击按钮没有反应的解决办法

    此类情况大概是安全范畴的问题 确定上传文件夹的共享 xff0c iis 以及电脑帐户 xff0c 以及aspnet 等是否有对应的相关权限 1 确认ASPNET 账户属于管理员级别 2 在 服务 里面找到 IIS Admin xff0c 双
  • numpy 和 tensor 的区别

    关系 xff1a 两者共享内存 xff0c 转换方便 xff0c 没有额外的开销 区别 xff1a 1 数据类型上面的区别 xff1a numpy 默认类型是 float64 int32 tensor 默认类型是float32 int64
  • 关于docker无法apt-get update的问题

    在看这篇文章https www jianshu com p 21d66ca6115e 有一个部分是 但是发现自己的 Node 没有ping命令 想着去apt get update 但是出现如下错误 只要在命令签名加上 sudo 就行
  • ubuntu下安装zip unzip

    安装命令 apt get install zip unzip 执行命令常见错误 xff1a 1 unable to locate package 解决办法 xff1a 执行sudo apt get update命令后再执行安装命令就可以了
  • 平衡小车卡尔曼滤波算法

    最近研究STM32的自平衡小车 xff0c 发现有两座必过的大山 xff0c 一为卡尔曼滤波 xff0c 二为PID算法 网上看了很多关于卡尔曼滤波的代码 xff0c 感觉写得真不咋地 一怒之下 xff0c 自己重写 xff0c 不废话 x
  • FreeRTOS学习-前言与FreeRTOS发行版

    1 前言 因为工作的需要 xff0c 学习FreeRTOS已经有一段时间了 接下来一段时间会定期更新本人学习FreeRTOS的系列笔记 系列笔记主要参考了官方的说明手册和FreeRTOS的源代码 其主要思想是先了解FreeRTOS的对外接口
  • FreeRTOS学习-内存管理

    1 动态内存分配与FreeRTOS 从v9 0 0后 xff0c FreeRTOS开始支持内核对象的静态分配方式 xff0c 因此 xff0c 内存管理库可以被裁剪 但在大多数嵌入式应用中 xff0c 堆的使用还是非常常见的 因此 xff0
  • FreeRTOS学习-任务管理(Task管理)(1)

    1 简介 任务管理 xff08 或称进程管理 xff09 是所有操作系统内核的最基本组成模块之一 xff0c FreeRTOS也不例外 想要了解一个操作系统 xff0c 不得不理解其任务管理的设计和实现 任务管理的介绍由两篇文章组成 xff
  • Java基础之Java枚举

    絮叨 昨天刚好有遇到一个枚举的小问题 xff0c 然后发现自己并不是那么熟悉它 xff0c 然后在开发中 xff0c 枚举用的特别多 xff0c 所以有了今天的文章 什么是枚举 Java中的枚举是一种类型 xff0c 顾名思义 xff1a
  • C++ STL 移动一个vector的元素到另一个vector

    1 背景 有的时候 xff0c 我们需要提取某个现有的vector中的元素到另一个vector中 xff0c 或者对多维的vector进行纬度的转换 在这种场景下 xff0c 往往原始的vector中的数据可能并不需要了 xff0c 为了节
  • Qt/C++ 临时屏蔽控件信号(signal)的实用方法

    1 背景 在使用Qt的控件时 xff0c 我们大概率会使用Qt的信号与槽 xff08 signal slot xff09 的机制来实现自己的UI交互逻辑 由于Qt内置控件的信号种类是有限的 xff0c 我们常常会遇到如下窘境 xff1a 以
  • FreeRTOS学习-队列管理

    1 简介 在FreeRTOS中 xff0c 提供了多种任务间通讯的机制 xff0c 包括消息队列 信号量和互斥锁 事件组 任务通知 xff0c 他们的总体特征如下图所示 xff1a 从图中可以看出 xff0c 消息队列 信号量和互斥锁 事件
  • Qt/C++ 如何删除QListWidget的指定项

    1 简介 QListWidget是Qt中 xff0c 用于展示列表类型数据的常用控件 它提供了一个类似于QListView的列表视图 xff0c 但是具有用于添加和删除项的接口 QListWidget使用一个内部模型来管理列表中的每个QLi
  • C++ std::result_of/std::invoke_result的简明指南

    1 简介 在C 43 43 中 xff0c 有时我们需要获取函数或可调用对象的返回值类型 xff0c 以便进行后续的操作 xff0c 在泛型编程中很常用 xff0c 特别是当不同的参数集的结果类型不同时 在早期的C 43 43 版本中 xf
  • FreeRTOS学习-任务通知(Task Notification)

    1 简介 任务通知本质上就是一种进程间通信机制 之前的文章介绍的消息队列 事件组 信号量等都是一种间接的通信方式 xff0c 而任务通知则是更加直接的方式 xff0c 允许两个任务 xff08 或中断和任务 xff09 之间直接通信 2 任
  • 异常行为分析模型设计

    本文针对异常访问现状及问题进行简要描述 xff0c 在此基础上提出基于一元线性回归的最小二乘法异常访问分析模型 xff0c 通过该模型解决了异常访问中时间与访问间相关性问题 异常访问是指网络行为偏离正常范围的访问情况 异常访问包含多种场景
  • 无人机PX4学习(1)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a https docs px4 io master en Basic concepts Drone an unmanned 34 robotic 34 vehicle that ca

随机推荐

  • 无人机PX4学习(2)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a https docs px4 io master en getting started flight controller selection html Flight Contro
  • 无人机PX4学习(3)

    内容源自 xff1a PX4飞控用户手册 链接 xff1a PX4 Flight Modes Overview PX4 User Guide Flight Mode Section RC或GCS上可以切换飞行模式 xff0c 但有些模式有限
  • 两篇论文入坑AIOps异常检测

    AIOps简介 以下部分内容来源于清华大学裴丹教授发表在 中国计算机学会通讯 第13卷第12期的专栏 基于机器学习的智能运维 我们都知道 xff0c 当代社会生活中的大型软硬件系统为了确保能够安全 可靠地运行 xff0c 需要有专业的运维人
  • python代码,两个4*4旋转矩阵之间的位姿变化,相对旋转矩阵

    python代码 xff0c 两个4 4旋转矩阵之间的位姿变化 xff0c 也就是求两个旋转矩阵之间的相对旋转矩阵 import numpy as np def get transform matrix rot mat1 rot mat2
  • crazyS中给firefly飞机添加两个相机

    firefly飞机中原本只有一个相机 xff0c 由于项目需要一个飞机去识别前方两架飞机 xff0c 因此需要增加一个相机 在rotors descriptioin gt urdf gt mav with vi sensor中可以看到此处
  • gitee(码云)和gitHub的区别

    1 gitee与gitHub概念 xff1f Gitee xff08 码云 xff09 是开源中国社区推出的代码托管协作开发平台 xff0c 支持Git和SVN xff0c 提供免费的私有仓库托管 Gitee专为开发者提供稳定 高效 安全的
  • 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    郭孟琦 43 原创作品转载请注明出处 43 Linux内核分析 MOOC课程http mooc study 163 com course USTC 1000029000 首先我选择的系统调用是122号系统调用 uname 简单的介绍一下un
  • 局域网共享文件夹加密(100%成功版本)

    文章目录 一 创建新用户1 右键此电脑选择管理2 点击本地用户和组3 点击用户A 右键空白区域选择创建新用户B 设置用户名和密码C 取消勾选用户下次登录时须更改密码D 勾选用户不能更改密码和密码永不过期 二 创建共享文件夹1 创建一个新文件
  • STM32PWM--基于HAL库(第十三届蓝桥杯嵌入式模拟题)

    文章目录 前言一 CubeMX配置 第十三届模拟题完整版 二 代码相关定义 声明1 函数声明2 宏定义3 变量定义 三 主要函数1 按键扫描2 配置模式3 LCD显示4 频率检测 TIM2输入捕获中断函数 5 PWM输出 TIM3 6 Ma
  • STM32综合-基于HAL库(第十二届蓝桥杯嵌入式省赛)

    文章目录 前言一 CubeMX配置 第十二届省赛完整版 二 代码相关定义 声明1 函数声明2 宏定义3 变量定义 三 主要函数1 按键扫描2 串口接收中断 定时器中断 接收 3 数据解析4 判定数据正误5 数据更新6 结算7 Main函数
  • STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)

    文章目录 前言一 CubeMX配置 RTC相关 1 使能RTC xff1a 2 进制配置 xff1a 3 初始时间配置 xff1a 4 日期配置 5 闹钟配置 二 代码1 获取时间2 设置闹钟3 闹钟中断函数 三 实验结果总结 前言 相关说
  • STM32LCD--基于HAL库(选中高亮?一文看懂如何玩转高亮显示)

    文章目录 前言一 LCD上的坐标这个坐标是怎么确定的 xff1f X轴Y轴 二 高亮显示类型三 部分真题要求解析四 如何高亮显示选中数据五 代码分析总结 前言 相关说明 xff1a 开发板 xff1a CT117E M4 STM32G431
  • STM32MP157实现串口接收数据上云-MP157串口测试

    文章目录 前言一 需要软件二 minicom配置三 功能选择四 发送数据结语 前言 本篇分享 xff1a 这次将会用几篇博客分享STM32MP157实现串口接收数据上云的一个基础功能 xff0c 实现STM32MP157的串口在接收到数据时
  • STM32MP157实现串口接收数据上云-云数据库存储多设备数据&界面显示实现

    文章目录 前言一 软件安装二 代码改进1 串口接收2 JSON数据解析 三 云产品流转1 作用2 自定义产品功能 amp 添加设备3 创建数据传输规则 四 MYSQL操作五 NODE RED操作1 总体思路2 安装节点3 节点配置4 页面布
  • TX2

    目录 1 Jetson TX2简介2 使用前准备2 1显示2 2控制2 3电源2 4开机2 5系统2 6使用图形界面2 7系统更新 xff0c 安装模块3 对外接口 xff1a 4 软件包配置JetPack4 1使用JetPack 5 TX
  • Linux应用编程-音频应用编程-语音转文字项目

    文章目录 前言Linux语音识别alsa lib简介 xff1a 安装alsa lib库 xff1a libcurl库简介 xff1a 安装libcurl库 xff1a API调用录音相关概念样本长度 xff08 Sample xff09
  • STM32MP157-QT-串口调试助手设计

    文章目录 前言STM32MP157串口调试助手widget uipro文件widget h头文件槽函数成员声明 widget cpp头文件扫描串口并添加到下拉列表串口配置参数获取配置参数 打开 关闭串口读取数据信号读数据函数代码 发送数据清
  • Linux-VIM使用

    文章目录 前言VIM使用1 切换模式2 跳转 1 跳转到指定行 2 跳转到首行 3 跳转到末行 3 自动格式化程序4 大括号对应5 删除 xff08 1 xff09 删除一个单词 xff08 2 xff09 删除光标位置至行尾 xff08
  • JAVA学习记录

    文章目录 前言Pta做题样例做题样例 命名规范 amp 代码风格基本数据类型基本语法类变量类函数关系运算 浮点数 xff08 实型 xff09 数组Java定义数组Java程序遍历整个数组使用FOR EACH循环输出整个数组 循环使用对象字
  • STM32G431-基于HAL库(第十四届蓝桥杯嵌入式模拟题2)

    文章目录 前言一 CubeMX配置 第十四届模拟题2完整版 二 代码相关定义 声明1 函数声明2 宏定义3 变量定义 三 主要函数1 按键扫描2 各参数控制3 LCD显示4 输出信号改变5 串口接收6 Main函数 四 实验结果1 数据页1