CubeMX新建项目
cubemx 程序设置
然后进行时钟设置:
先从原理图找到高速晶振时钟,比如说这个为 25M,
这个为 8M:
OSC 接外部高速晶振,用来用来产生的高速外部用户时钟,OSC32 接外部低速晶振。
一般来说路线选择:
直接在 HCLK 里面选择板子最大主频,就会自动选择了,不一定要按上面的路线进行抉择。
选择分类别生成:
搭建程序框架
程序框架的实现
一、新增 MyApplication 文件夹和组
放置 4 个标准 c 文件,分别是公共文件,回调文件,系统文件,用户初始化文件,后续应用代码均放在此文件夹;
二、新增 MyApplication.h 文件
包含所有用户代码的头文件与外设头文件,调整外设或用户文件,只需要调整此文件内的相应头文件即可;
3、main.c 文件标准化。
三、MyApplication.h
1、此文件放置于 main.c 与应用代码文件中,作为头文件的集合;
2、更改处理器外设或应用代码,此文件需要相应的增加或删除相应的头文件。
四、main.c 文件
1、添加头文件集合
2、添加用户初始化函数
3、标准化主循环
MyInit.Peripheral_Set();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
System.Run();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
4、标准化错误处理函数
5、标准化断言失败处理函数
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
System.Error_Handler();
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
System.Assert_Failed();
/* USER CODE END 6 */
}
五、system 文件
1、头文件
主要定义结构体类型 System_t,包含 3 个函数指针,分别为函数运行,系统错误处理,断言失败处理,被 main.c 文件调用。
2、源文件
主要定义结构体 System 以及 3 个函数,并将 3 个函数的名称(首地址)赋值给 System 结构体,完成结构体的初始化。 如此一来,main.c 文件可以通过 System 结构体的函数指针调用 System.c 文件的 3 个函数了。
Run 函数:用户应用代码;
Error_Hander 函数:系统错误处理代码;
Asset_Failed 函数: 断言失败处理代码。
六、Run 函数
作为功能演示,简单的实现了 LED1 间隔 1s 闪烁。
public 下的串口调试
头文件:
#ifndef __PUBLIC_H_
#define __PUBLIC_H_
/* Public define-------------------------------------------------------------*/
#define SoftWare_Version (float)1.0
#define huart_debug huart1
//定义枚举类型 -> TRUE/FALSE位
typedef enum
{
FALSE = 0U,
TRUE = !FALSE
} FlagStatus_t;
typedef enum
{
FAILED = 0U,
PASSED = !FAILED
} TestStatus_t;
//定义结构体类型
/* extern variables-----------------------------------------------------------*/
/*******预编译宏定义*******/
//#define Monitor_Run_Code //代码运行监控器
//#define Hardware_TEST //硬件测试
#endif
/********************************************************
End Of File
********************************************************/
c 文件:
/* Includes ------------------------------------------------------------------*/
#include "MyApplication.h"
/* Private define-------------------------------------------------------------*/
/* Private variables----------------------------------------------------------*/
/* Public variables-----------------------------------------------------------*/
/* Private function prototypes------------------------------------------------*/
/*
* @name fputc
* @brief fputc映射物理串口
* @param ch->待发送字符
* @retval ch->待发送字符
*/
int fputc(int ch,FILE* f){
//通过查询的方式循环发送
HAL_UART_Transmit(&huart_debug,(uint8_t *)&ch,1,0x000A);
return ch;
}
/********************************************************
End Of File
********************************************************/
记得在头文件加上 usart.h。
在 vscode 中要注意
在 vs 已经打开的 mdk 项目中,又重新修改了 cubemx 初始化的,要重新在 Core 里面加核心文件。我这里重新加了一个 dma,所以现在要自己加进去。