嵌入式系统原理与实践——第一二次作业
This commit is contained in:
parent
320fd20a3c
commit
abdba7cb36
40
嵌入式系统原理与实践/实验报告/mypreamble.tex
Normal file
40
嵌入式系统原理与实践/实验报告/mypreamble.tex
Normal file
@ -0,0 +1,40 @@
|
||||
\usepackage{underscore}
|
||||
\usepackage[outputdir=./latex-output]{minted}
|
||||
\usepackage{multicol}
|
||||
\usepackage{subfiles}
|
||||
|
||||
\setminted{breaklines=true, fontsize=\zihao{-6}, linenos}
|
||||
|
||||
\title{《嵌入式系统原理与实践》作业}
|
||||
\author[岳锦鹏 \quad 朱宇笑]{10213903403 岳锦鹏 \newline 10225001410 朱宇笑
|
||||
}
|
||||
\date{2024年10月26日——}
|
||||
|
||||
|
||||
\usetheme{Malmoe} %主题包之一,直接换名字即可
|
||||
\setbeamertemplate{page number in head/foot}[totalframenumber]
|
||||
|
||||
\usecolortheme{default} %主题色之一,直接换名字即可。
|
||||
\usefonttheme{professionalfonts}
|
||||
|
||||
% 设置用acrobat打开就会全屏显示
|
||||
\hypersetup{pdfpagemode=FullScreen}
|
||||
|
||||
|
||||
%每个章节都有小目录
|
||||
\AtBeginSubsection[]
|
||||
{
|
||||
\begin{frame}<beamer>
|
||||
\tableofcontents[currentsection,currentsubsection]
|
||||
\end{frame}
|
||||
}
|
||||
|
||||
\definecolor{palette1}{RGB}{123,199,233}
|
||||
\definecolor{palette2}{RGB}{58,169,222}
|
||||
\definecolor{palette3}{RGB}{3,35,74}
|
||||
\definecolor{palette4}{RGB}{145,152,158}
|
||||
|
||||
\setbeamercolor{palette primary}{bg=palette1}
|
||||
\setbeamercolor{palette secondary}{bg=palette2}
|
||||
\setbeamercolor{palette tertiary}{bg=palette3}
|
||||
\setbeamercolor{palette quaternary}{bg=palette4}
|
8
嵌入式系统原理与实践/实验报告/全部作业.tex
Normal file
8
嵌入式系统原理与实践/实验报告/全部作业.tex
Normal file
@ -0,0 +1,8 @@
|
||||
\documentclass[aspectratio=169, 10pt, utf8, mathserif]{ctexbeamer}
|
||||
\input{mypreamble}
|
||||
\begin{document}
|
||||
\maketitle
|
||||
\tableofcontents
|
||||
\subfile{第一次作业——时钟滴答}
|
||||
\subfile{第二次作业——流水灯}
|
||||
\end{document}
|
312
嵌入式系统原理与实践/实验报告/第一次作业——时钟滴答.tex
Normal file
312
嵌入式系统原理与实践/实验报告/第一次作业——时钟滴答.tex
Normal file
@ -0,0 +1,312 @@
|
||||
\documentclass[全部作业]{subfiles}
|
||||
|
||||
\begin{document}
|
||||
\date{2024年10月26日}
|
||||
|
||||
\begin{frame}
|
||||
%\maketitle
|
||||
\titlepage
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{目录}
|
||||
\tableofcontents[hideallsubsections]
|
||||
\end{frame}
|
||||
|
||||
\section{第一次作业}
|
||||
|
||||
\subsection{STM32CubeMX}
|
||||
\begin{frame}
|
||||
选择的MCU型号为STM32G473RCT6:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-26-19-29-11.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
先设置时钟为外部:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-26-13-48-03.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
再设置时钟频率:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-26-15-58-41.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
开启debug模式:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-26-16-01-25.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
开始调整端口:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-26-16-03-56.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
选择GPIO_Output:
|
||||
\includegraphics[height=0.9\textheight]{imgs/2024-10-26-16-05-01.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
调整端口配置:
|
||||
\includegraphics[height=0.9\textheight]{imgs/2024-10-26-19-20-26.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
项目设置名称exp1:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-26-19-24-44.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
继续项目设置:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-26-19-25-59.png}
|
||||
生成代码:
|
||||
\includegraphics[width=0.3\linewidth]{imgs/2024-10-28-20-36-25.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
打开项目:
|
||||
\includegraphics[width=0.6\linewidth]{imgs/2024-10-29-15-09-10.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
修改调试器:
|
||||
\includegraphics{imgs/2024-10-29-11-36-58.png}
|
||||
\vspace{1em}
|
||||
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-11-35-44.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
修改调试设置,把reset and run打勾,就不需要手动按重置按钮了。
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-14-54-11.png}
|
||||
\end{frame}
|
||||
|
||||
\subsection{MDK-ARM}
|
||||
\begin{frame}
|
||||
添加项目文件:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-09-21-05.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
选择头文件,文件名为variable.h:
|
||||
\includegraphics[width=0.8\linewidth]{imgs/2024-10-29-09-22-20.png}
|
||||
\end{frame}
|
||||
|
||||
% 加了[fragile]才能用minted不报错
|
||||
\begin{frame}[fragile]
|
||||
variable.h:
|
||||
\begin{minted}{C}
|
||||
#include <stdint.h>
|
||||
#ifndef __VARIABLE_H
|
||||
#define __VARIABLE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
uint8_t mMilSecCount; // 毫秒计数
|
||||
uint8_t bTenMilSecOk; // 10毫秒标志位
|
||||
uint8_t mTimeCount; // 秒计数
|
||||
uint8_t bTimeOk; // 秒标志位
|
||||
} stSysTickTimer;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __VARIABLE_H */
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
stm32g4xx_it.c:
|
||||
|
||||
\begin{multicols}{2}
|
||||
\begin{minted}[firstnumber=24]{C}
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "variable.h"
|
||||
/* USER CODE END Includes */
|
||||
\end{minted}
|
||||
|
||||
\vspace{1em}
|
||||
\begin{minted}[firstnumber=60]{C}
|
||||
/* USER CODE BEGIN EV */
|
||||
extern stSysTickTimer sSysTickTimer;
|
||||
extern uint16_t mSecCount;
|
||||
extern uint16_t bSecondIsOk;
|
||||
/* USER CODE END EV */
|
||||
\end{minted}
|
||||
|
||||
\vspace{1em}
|
||||
\begin{minted}[firstnumber=183]{C}
|
||||
/**
|
||||
* @brief This function handles System tick timer.
|
||||
*/
|
||||
void SysTick_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN SysTick_IRQn 0 */
|
||||
|
||||
/* USER CODE END SysTick_IRQn 0 */
|
||||
HAL_IncTick();
|
||||
/* USER CODE BEGIN SysTick_IRQn 1 */
|
||||
if (++mSecCount >= 100) {
|
||||
mSecCount = 0;
|
||||
bSecondIsOk = 1;
|
||||
}
|
||||
|
||||
if (++sSysTickTimer.mMilSecCount >= 10) {
|
||||
sSysTickTimer.mMilSecCount = 0;
|
||||
sSysTickTimer.bTenMilSecOk = 1;
|
||||
if (++sSysTickTimer.mTimeCount >= 100) {
|
||||
sSysTickTimer.mTimeCount = 0;
|
||||
sSysTickTimer.bTimeOk = 1;
|
||||
}
|
||||
}
|
||||
/* USER CODE END SysTick_IRQn 1 */
|
||||
}
|
||||
\end{minted}
|
||||
\end{multicols}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
main.h:
|
||||
|
||||
\begin{multicols}{2}
|
||||
\begin{minted}[firstnumber=48]{C}
|
||||
/* USER CODE BEGIN EM */
|
||||
#define SYSTICKCLK 170 // Systick Frequency 170MHz
|
||||
/* USER CODE END EM */
|
||||
|
||||
/* Exported functions prototypes ---------------------------------------------*/
|
||||
void Error_Handler(void);
|
||||
|
||||
/* USER CODE BEGIN EFP */
|
||||
void delay_us(uint32_t nus);
|
||||
/* USER CODE END EFP */
|
||||
\end{minted}
|
||||
\end{multicols}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
main.c:
|
||||
|
||||
\begin{multicols}{2}
|
||||
\begin{minted}[firstnumber=24]{C}
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "variable.h"
|
||||
/* USER CODE END Includes */
|
||||
\end{minted}
|
||||
|
||||
\vspace{1em}
|
||||
\begin{minted}[firstnumber=45]{C}
|
||||
/* USER CODE BEGIN PV */
|
||||
stSysTickTimer sSysTickTimer = {
|
||||
0, 0, 0, 0
|
||||
};
|
||||
uint16_t mSecCount = 0;
|
||||
uint16_t bSecondIsOk = 0;
|
||||
/* USER CODE END PV */
|
||||
\end{minted}
|
||||
|
||||
\vspace{1em}
|
||||
\begin{minted}[firstnumber=60]{C}
|
||||
/* USER CODE BEGIN 0 */
|
||||
void delay_us(uint32_t nus) {
|
||||
uint32_t ticks;
|
||||
uint32_t told, tnow, tcnt=0;
|
||||
uint32_t reload = SysTick->LOAD; // LOAD的值
|
||||
ticks = nus * SYSTICKCLK; // 需要的节拍数
|
||||
told = SysTick->VAL; // 刚进入时的计数器值
|
||||
while (1) {
|
||||
tnow = SysTick->VAL;
|
||||
if (tnow != told) {
|
||||
if (tnow < told)
|
||||
tcnt += told - tnow; // SYSTICK是一个递减的计数器就可以了
|
||||
else
|
||||
tcnt += reload - tnow + told;
|
||||
told = tnow;
|
||||
if (tcnt >= ticks) break; // 事件超过/等于要延迟的时间,则退出
|
||||
}
|
||||
}
|
||||
}
|
||||
/* USER CODE END 0 */
|
||||
\end{minted}
|
||||
\end{multicols}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
main.c:
|
||||
|
||||
\begin{multicols}{2}
|
||||
\begin{minted}[firstnumber=81]{C}
|
||||
/**
|
||||
* @brief The application entry point.
|
||||
* @retval int
|
||||
*/
|
||||
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();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
while (1)
|
||||
{
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
if (sSysTickTimer.bTimeOk) {
|
||||
sSysTickTimer.bTimeOk = 0;
|
||||
HAL_GPIO_TogglePin(TickClock_LED_GPIO_Port, TickClock_LED_Pin);
|
||||
}
|
||||
}
|
||||
/* USER CODE END 3 */
|
||||
}
|
||||
\end{minted}
|
||||
\end{multicols}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
编译和运行:
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-11-38-55.png}
|
||||
\vspace{1em}
|
||||
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-11-39-46.png}
|
||||
\end{frame}
|
||||
|
||||
\subsection{实验结果}
|
||||
|
||||
\begin{frame}
|
||||
实验结果:
|
||||
亮一秒,暗一秒。
|
||||
|
||||
\includegraphics[height=0.8\textheight]{imgs/IMG_20241029_115504.jpg}
|
||||
|
||||
完整视频可以查看:\url{https://gitea.librastalker.top/423A35C7/STM32CubeMX-Keil_uVision5}
|
||||
\end{frame}
|
||||
|
||||
\end{document}
|
235
嵌入式系统原理与实践/实验报告/第二次作业——流水灯.tex
Normal file
235
嵌入式系统原理与实践/实验报告/第二次作业——流水灯.tex
Normal file
@ -0,0 +1,235 @@
|
||||
\documentclass[全部作业]{subfiles}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\date{2024年10月29日}
|
||||
\begin{frame}
|
||||
%\maketitle
|
||||
\titlepage
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{目录}
|
||||
\tableofcontents[hideallsubsections]
|
||||
\end{frame}
|
||||
|
||||
\section{第二次作业}
|
||||
|
||||
\subsection{准备}
|
||||
\begin{frame}[fragile]
|
||||
将实验一的代码复制一份,并将exp1改名为exp2:
|
||||
\vspace{1em}
|
||||
|
||||
\begin{minipage}[H]{0.3\linewidth}
|
||||
\begin{minted}[linenos=false]{text}
|
||||
exp1
|
||||
│ .mxproject
|
||||
│ exp1.ioc
|
||||
│
|
||||
├─Core
|
||||
│
|
||||
├─Drivers
|
||||
│
|
||||
└─MDK-ARM
|
||||
exp1.uvprojx
|
||||
startup_stm32g473xx.s
|
||||
\end{minted}
|
||||
\end{minipage}
|
||||
{\Huge$\longrightarrow$}
|
||||
\begin{minipage}[H]{0.3\linewidth}
|
||||
\begin{minted}[linenos=false]{text}
|
||||
exp2
|
||||
│ .mxproject
|
||||
│ exp2.ioc
|
||||
│
|
||||
├─Core
|
||||
│
|
||||
├─Drivers
|
||||
│
|
||||
└─MDK-ARM
|
||||
exp2.uvprojx
|
||||
startup_stm32g473xx.s
|
||||
\end{minted}
|
||||
\end{minipage}
|
||||
\vspace{1em}
|
||||
|
||||
需要改文件夹名、.ioc、.uvprojx这三个地方。
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
打开.uvprojx文件,修改调试器:
|
||||
\includegraphics{imgs/2024-10-29-11-36-58.png}
|
||||
\vspace{1em}
|
||||
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-11-35-44.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
修改调试设置,把reset and run打勾,就不需要手动按重置按钮了。
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-14-54-11.png}
|
||||
\end{frame}
|
||||
|
||||
\subsection{端口修改}
|
||||
\begin{frame}
|
||||
这样设置端口,点击生成代码。
|
||||
\includegraphics[width=1\linewidth]{imgs/2024-10-29-16-44-16.png}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
将STM32核心板JP1的PA0~PA7与系统底板跑马灯控制端JP21相连。
|
||||
|
||||
\includegraphics[width=0.3\linewidth]{imgs/IMG_20241029_204905_1.jpg}
|
||||
\includegraphics[width=0.3\linewidth]{imgs/IMG_20241029_205023.jpg}
|
||||
\end{frame}
|
||||
|
||||
\subsection{代码修改}
|
||||
\begin{frame}[fragile]
|
||||
main.c:
|
||||
\begin{multicols}{2}
|
||||
\begin{minted}[firstnumber=62]{C}
|
||||
/**
|
||||
* @brief The application entry point.
|
||||
* @retval int
|
||||
*/
|
||||
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 */
|
||||
uint8_t FlashFlag = 0;
|
||||
uint16_t nShift = 0x0001;
|
||||
uint8_t i = 0;
|
||||
/* 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();
|
||||
/* USER CODE BEGIN 2 */
|
||||
FlashLeds_GPIO_Port->ODR &= 0xffff;
|
||||
/* USER CODE END 2 */
|
||||
|
||||
\end{minted}
|
||||
\end{multicols}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
main.c:
|
||||
\begin{multicols}{2}
|
||||
\begin{minted}[firstnumber=last]{C}
|
||||
/* Infinite loop */
|
||||
/* USER CODE BEGIN WHILE */
|
||||
while (1)
|
||||
{
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
if (sSysTickTimer.bTimeOk) {
|
||||
sSysTickTimer.bTimeOk = 0;
|
||||
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
|
||||
|
||||
HAL_GPIO_WritePin(FlashLeds_GPIO_Port, nShift, GPIO_PIN_SET);
|
||||
|
||||
|
||||
// FlashLeds_GPIO_Port->ODR &= 0xFF00;
|
||||
// FlashLeds_GPIO_Port->ODR |= (~nShift) & 0x00FF;
|
||||
|
||||
if (i < 7)
|
||||
nShift <<= 1;
|
||||
else
|
||||
nShift >>= 1;
|
||||
|
||||
i++;
|
||||
|
||||
if (i >= 14) {
|
||||
i = 0;
|
||||
nShift = 0x0001;
|
||||
}
|
||||
|
||||
HAL_GPIO_WritePin(FlashLeds_GPIO_Port, nShift, GPIO_PIN_RESET);
|
||||
|
||||
// if (FlashFlag != 0) {
|
||||
|
||||
// }
|
||||
}
|
||||
}
|
||||
/* USER CODE END 3 */
|
||||
}
|
||||
\end{minted}
|
||||
\end{multicols}
|
||||
\end{frame}
|
||||
|
||||
\subsection{改进}
|
||||
\begin{frame}[fragile]
|
||||
目前的闪烁频率较慢,可以修改部分代码使灯闪烁得更快。
|
||||
在variable.h中增加10毫秒计数和100毫秒标志位:
|
||||
\begin{minted}[firstnumber=9]{C}
|
||||
typedef struct {
|
||||
uint8_t mMilSecCount; // 毫秒计数
|
||||
uint8_t bTenMilSecOk; // 10毫秒标志位
|
||||
uint8_t mTenMilSecCount; // 10毫秒计数
|
||||
uint8_t bHundredMilSecOk; // 100毫秒标志位
|
||||
uint8_t mTimeCount; // 秒计数
|
||||
uint8_t bTimeOk; // 秒标志位
|
||||
} stSysTickTimer;
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
相应地,在 \mintinline{C}{SysTick_Handler()} 中也需要在100毫秒标志位时设置相应标志。
|
||||
\begin{minted}[firstnumber=192]{C}
|
||||
if (++sSysTickTimer.mMilSecCount >= 10) {
|
||||
sSysTickTimer.mMilSecCount = 0;
|
||||
sSysTickTimer.bTenMilSecOk = 1;
|
||||
if (++sSysTickTimer.mTenMilSecCount >= 10) {
|
||||
sSysTickTimer.mTenMilSecCount = 0;
|
||||
sSysTickTimer.bHundredMilSecOk = 1;
|
||||
if (++sSysTickTimer.mTimeCount >= 10) {
|
||||
sSysTickTimer.mTimeCount = 0;
|
||||
sSysTickTimer.bTimeOk = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
在 \mintinline{C}{main.c} 中在100毫秒标志为1时进行流水灯的操作(时钟滴答仍然在1秒标志位为1时操作)。
|
||||
\begin{minted}[firstnumber=103]{C}
|
||||
/* USER CODE BEGIN 3 */
|
||||
if (sSysTickTimer.bTimeOk) {
|
||||
sSysTickTimer.bTimeOk = 0;
|
||||
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
|
||||
}
|
||||
if (sSysTickTimer.bHundredMilSecOk) {
|
||||
sSysTickTimer.bHundredMilSecOk = 0;
|
||||
HAL_GPIO_WritePin(FlashLeds_GPIO_Port, nShift, GPIO_PIN_SET);
|
||||
...
|
||||
}
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\subsection{实验结果}
|
||||
|
||||
\begin{frame}
|
||||
每次只有一个灯亮,从最左边的灯亮向右移动,直到最右边的灯亮,再向左移动,直到最左边的灯亮。
|
||||
|
||||
\includegraphics[width=0.5\linewidth]{imgs/IMG_20241029_205440.jpg}
|
||||
|
||||
完整视频可以查看:\url{https://gitea.librastalker.top/423A35C7/STM32CubeMX-Keil_uVision5}
|
||||
\end{frame}
|
||||
|
||||
\end{document}
|
Loading…
Reference in New Issue
Block a user