STM32基础开发知识
环境搭建
- 编译器:Keil5,AC5
- 编辑器:VS Code,Embedded IDE,Cortex-Debug
- 调试器:Openocd,Arm GNU Toolchain
- 烧录器:ST-link V2
必要的配置:
1 |
|
使用STM32CUBEMX生成代码框架,在 VS Code 中进行编辑,编译,烧录,调试。
ST-Link 烧录器管脚定义
使用 printf 进行串口打印
在要使用
printf
的文件包含头文件stdio.h
。在
usart.c
文件中加入重定向,这里以串口 1 为例。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24/*****************************************************************************
* 【功 能】 printf函数重定向支持代码
* 加入以下代码, 使用printf函数时, 不再需要选择use MicroLIB
* 参 数:
* 返回值:
*****************************************************************************/
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
}; // 标准库需要的支持函数
FILE __stdout; // FILE 在stdio.h文件
void _sys_exit(int x) { x = x; } // 定义_sys_exit()以避免使用半主机模式
int fputc(int ch, FILE *f) // 重定向fputc函数,使printf的输出,由fputc输出到UART, 这里使用串口1(USART1)
{
// if(xFlag.PrintfOK == 0) return 0; // 判断USART是否已配置,防止在配置前调用printf被卡死
while ((USART1->SR & 0X40) == 0)
; // 等待上一次串口数据发送完成
USART1->DR = (uint8_t)ch; // 写DR,串口1将发送数据
return ch;
}进一步封装一个日志库,增加时间戳,文件名,行数,打印等级等功能。如果是在
FreeRTOS
下,还要考虑多个任务同时对串口 1 的使用互斥问题,这里有一个我封装好的日志库,sinlatansen/DBG: 一款线程安全的 FreeRTOS(cmsis_os2)的日志调试库,基于 STM32F4_HAL 。
避开 HAL_Delay
HAL 库这个延时函数,有 bug,建议自己实现延时函数,改用软件定时器实现。
这里我使用的 STM32F407VET6 主频 168MHz,其中我使用的 TIM6 所挂载的 AHB1 频率为 84MHz ,因此设置 PSC 为 83。
代码实现:
1 |
|
STM32CUBEMX 沙箱定义
对于 CUBEMX 生成的代码,会有一套规范,通过注释提示了用户代码写在哪里,否则可能在下一次生成代码误删用户代码。
一般我倾向于把用户代码写在自己添加的 .c 文件,在main.c
中进行调用,毕竟那些注释看着还是比较乱。
但是避免不了要在生成的代码中写内容时,还是遵循官方的风格与规范比较好。
1 |
|
CUBEMX 生成的工程在 keil5 中编译报错
【转】Keil ARM 开发 error L6236E 错误解决 - 壹点灵异 - 博客园 (cnblogs.com)
让 CUBEMX 生成 UTF-8 文件,避免中文乱码
添加系统环境变量:
- 变量名:
JAVA_TOOL_OPTIONS
- 值 :
-Dfile.encoding=UTF-8
ASCIi 艺术字体生成
[Text to ASCII Art Generator (TAAG) — 文本到 ASCII 艺术生成器 (TAAG) (patorjk.com)](http://patorjk.com/software/taag/#p=display&f=ANSI Shadow&t=Hello BUAA!)
STM32基础开发知识
http://sinlatansen.github.io/2024/04/15/STM32基础开发知识/