Skip to content

STM32单片机

一.参考资料

二.示例讲解

三.外设的使用方法

四.USB功能

五.STM32单片机简介

STM32单片机是STMicroelectronics公司推出的一款高性能、低功耗的32位微控制器,具有丰富的外设功能和灵活的扩展接口,广泛应用于工业控制、消费电子、通信等领域。

STM32单片机采用ARM Cortex-M3 处理器,具有高性能、低功耗、可扩展性等优点。其内置多种外设,如GPIO、ADC、DAC、UART、SPI、I2C、CAN、USB等,可以满足各种应用需求。

六.常见STM32单片机开发环境

  1. STM32CubeIDE
  2. Keil uVision
  3. VSCode + STM32CubeIDE for Visual Studio Code 插件

七.STM32单片机开发环境搭建(VSCode + STM32CubeIDE for Visual Studio Code 插件)

  1. 安装VSCode (https://code.visualstudio.com/Download)
  2. 在VSCODE中安装STM32Cube插件 (https://marketplace.visualstudio.com/items?itemName=stmicroelectronics.stm32-vscode-extension)
  3. 安装: STM32CubeMX
  4. 安装: STMMCUFinder
  5. 参考视频教程: https://space.bilibili.com/2100019006/lists/6707537?type=season

八.创建一个串口项目

  1. 打开 STM32插件 -> Launch STM32CubeMX

  2. 选择MCU型号: STM32C031CBT6

  3. 配置:

    • SYS -> Debug 选择 Serial Wire ,Timebase Source 设置为 TIM4. (这里不能使用 SysTick ,因为SysTick是会被 FreeRTOS 占用的)
  4. 配置串口参数

    • USART1 -> Mode -> Asynchronous -> Baudrate -> 115200 -> Word Length -> 8 bits -> Stop bits -> 1 -> Parity -> None -> Hardware Flow Control -> None
  5. 配置时钟,为 72MHZ

  6. 配置 FreeRTOS,

    • 选择 Interface: CMSIS_V1,
    • 选择 Advanced setting: 中的 USE_NEWLIB_PEENTRANTS 设置为 enable,
  7. 配置工程 Project Manager:

    • Project Name: 写一个工程名称
    • 保存位置设置: 设置一个工程保存位置
    • Toolchain / IDE: Cmake + GCC
  8. 生成代码

    • 点击 Generate Code
  9. 打开工程

    • 在VSCode中打开生成的工程文件夹
  10. 配置工程设备名称: 非常重要

    stm32_1
    stm32_2
    • 点击 STM32 插件中的 "Setup STM32Cube projects" 按钮.
    • 输入:STM32Cube.SetDeviceName 并选择.
    • 输入设备名称: STM32C031CBT6
    • 保存.
  11. 点击左侧栏中的 "调试并运行" 按钮. stm32_3

    • 点击 "创建一个launch.json文件" 按钮.
    • 选择 "STM32Cube: STLink GDB Server" 配置.自动生成launch.json文件
    • 点击上面的调试配置,即可运行调试了.

九.再次运行 MX

- 如果需要修改工程,添加一些基础代码,可以再次运行 STM32CubeMX 来生成代码.
- 点击 "STEM32 插件" 中的 "STM32CubeMX" 按钮."
- 打开后选择本工程中的 "***.ioc" 文件".
- 修改代码.
- 点击 "Generate Code" 按钮.

十. 工程编译分析

  1. 本工程是使用Cmake进行构建的.

在工程的目录下有一个CMakeLists.txt文件.这个文件是Cmake的构建脚本. 如果需要添加新的代码,很多时候需要修改这个文件的内容.如下: 添加新的源文件:

cmake
# Add sources to executable
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user sources here
    Core/Src/w25qxx.c
)

# Add include paths
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
    # Add user defined include paths
 )
  1. 在工程的目录下还有一个文件 "CMakePresets.json" ,这个文件是Cmake的预设文件. 这个文件中定义了Cmake的构建配置. 一般不需要修改这个文件.

  2. 注意项目中的 CMake插件,也是很重要的. 这个插件可以读取 CMakePresets.json 文件中的配置,并生成对应的构建配置. 如果需要修改编译配置,比如将 "Debug" 修改为 "Release", 可以在CMake插件中进行修改.

十一. 工程结构分析

  1. 工程的源代码放置在 Core/Src 目录下.这个目录下存放了所有的源代码文件.
  2. Core/Inc 目录下存放了所有的头文件.
  3. Drivers/STM32F1xx_HAL_Driver/Src 目录下存放了所有的HAL驱动代码.
  4. Middlewares/Third_Party/FreeRTOS/Source 目录下存放了FreeRTOS的源代码.
  5. main.c 是项目的入口文件.
  6. main() 函数中应该 调用 MX_GPIO_Init();MX_USART1_UART_Init(); 来初始化GPIO和串口,还有一些其它的初始化函数.
  7. 生成一个默认任务
c
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
  1. StartDefaultTask() 函数中编写任务代码.

十二. 如何使用printf来输出数据到串口?

  1. Core/Src/syscalls.c 文件中定义了一个弱函数 :
c
extern int __io_getchar(void) __attribute__((weak));

我们只需要实现这个弱函数就可以了.

  1. Core/Src/Main.c 文件中添加以下代码:
c
int __io_putchar(int ch) {
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  return ch;
}

并且添加 #include <stdio.h> 头文件.否则 printf() 函数会找不到. 3. 在程序的其它的地方只需要调用 printf() 函数即可. 注意
printf() 函数在调用时,文本最后一定要加上换行符 \n,否则输出可能不会立即显示.