SchoolWork-LaTeX/嵌入式系统原理与实践/实验报告/第一次作业——时钟滴答.tex

312 lines
6.9 KiB
TeX
Raw Normal View History

\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}