stm32 001 - hello world(附带可运行源码)

文章目录

  • 初衷
  • 前提准备
    • 硬件环境
    • 软件环境
    • 硬件连接
  • Hello world应用
    • 在STM32CubeIDE中创建新工程
    • 配置引脚
    • 修改代码
    • 运行及调试
  • 源码

初衷

我是做Android开发的,因此本文许多地方会比较繁琐,各位做单片机开发的轻喷呀
有幸接触到stm32这个平台,之前都是在学校接触过单片机(年代久远),平常工作中一直是以Android开发为主,对于系统底层的硬件是怎么交互的一点儿也没了解,初次接触stm32以下几个地方引起了我的好奇心,想要一探究竟:

  • 最小系统板stm32F103C8T6相信很多和我类似的朋友都会接触到,1688价格只有8块钱,里面可以运行程序,各种四轴飞行器、充电桩、智能电表等里面都是它,好惊奇
  • 上面包含了大量硬件接口:UART、GPIO、SPI、I2C、USB、CAN等一堆接口,这小东西真是五脏俱全呢
  • 主频72mhz,想起来快接近诺基亚塞班手机当时的频率了哈哈哈,上面可以跑个小型的操作系统,例如rt-thread,人家是国内开源的,不禁想去了解下一个操作系统是怎么搞起来的,怎么应对和解决系统资源的分配利用的,好奇
  • 内存20kb,存储128kb,这个垃圾,我大Android起步都是512mb,想去了解下这能干个啥,好奇
  • Android的HAL层是用户态实现的硬件驱动,想去了解下这些外设硬件都是怎么交互的,刚好有这个stm32,容我去一探究竟

前提准备

硬件环境

巧妇难为无米之炊,硬件首先得有呀,下面是我在调试使用过程中用到的硬件:

  • STM32F103C8T6:在1688上搜索STM32F103C8T6最小系统,找8块钱那个就行了
    stm32 001 - hello world(附带可运行源码)_第1张图片
  • elink32:stm32的调试工具有st-link、elink、jlink等多种,我这里使用elink-32,唯一在我的ubuntu机器上不会很快损坏的设备,之前在淘宝的16块钱的st-link被我搞坏了5个,你敢信,购买链接请自行淘宝,elink-32使用cmsis-dap/swd方式进行调试
    stm32 001 - hello world(附带可运行源码)_第2张图片
  • USB转串口线:以我目前浅显的知识来说,要这家伙是用来输出log的,刚开始在没有adb的情况下愣是没习惯这种打个log还需要自己动手的情况,而且由于debug对于某些性能敏感的情况会出现调试没bug,运行稀烂一地的情况,虽然串口输出也没见得多高效,汗- -!
    stm32 001 - hello world(附带可运行源码)_第3张图片

软件环境

工欲善其事必先利其器,软件不得到位,下面是我用到的软件(我是在Ubuntu系统下开发的,因此选用了跨平台的开发工具STM32CubeIDE而不是更强大的IAR之类的):
STM32CubeIDE:这他喵是个ST官方出的跨平台的stm32开发工具,可以在ST官网下载,基于eclipse开发,有下面的特点:

  • 跨平台,windows、mac、linux都可以用
  • 包含交叉编译,不用自己纠结咋么编译
  • 支持团队管理,各种版本管理软件eclipse上熟悉的工具走起
  • 支持stlink、elink等多种调试工具
  • 集成了CubeMx:这个就是神器了,它是stm32平台使用UI界面配置stm32引脚功能、时钟、中间件等一系列东西的工具,有了它再也不用翻stm32的文档去纠结怎么配置时钟了,一键搞定,美得很。(没有这个工具,我们就需要手动对着ST的操作手册一个一个去配置寄存器来修改引脚和时钟,太灾难了)
    stm32 001 - hello world(附带可运行源码)_第4张图片

硬件连接

请按照下图连接elink32stm32(用于调试和安装ROM,类似于Android上通过usb进行adb调试),只需连接3V3GNDDIOSCK四个引脚即可

Windows中可能需要安装elink32的驱动,请自行解决
stm32支持Serial Wire、JTag、串口等多个方式进行安装rom,其中区别请自行了解,这里只选取了硬件比较便宜,操作方便的方法

stm32 001 - hello world(附带可运行源码)_第5张图片

Hello world应用

在STM32CubeIDE中创建新工程

  1. 和Android应用不同的是:stm32不同的板卡有不同的引脚布局、外设引脚配置、软件库等选择,因此首先需要确定是哪个型号的芯片才能创建工程,这里选择STM32F103C8T6
    stm32 001 - hello world(附带可运行源码)_第6张图片
  2. Target Project Type选择STM32Cube,这样就会关联stmCubeMx这个引脚配置工具,而不用自己手写寄存器操作来修改时钟。
    stm32 001 - hello world(附带可运行源码)_第7张图片

配置引脚

  1. 配置调试引脚:
    这一步非常重要! 如果忘记配置会导致板子在一次刷写后不能再访问,需要通过串口或者其他方式刷入支持SWD的固件才能恢复。在helloworld.ioc打开后的配置页面中,左侧System Core-SYS-Debug中选择Serial Wire
    stm32 001 - hello world(附带可运行源码)_第8张图片
  2. 配置helloworld的小灯引脚:
    使用鼠标左键点击右边引脚图中的PC13引脚选择GPIO_Output即可

    在STM32的helloworld中,第一个应用不是打印或者显示一个helloworld的字符串,而是把板子上的小灯点亮,它里面的log输出需要麻烦点,需要自己配置串口和相关的接口,这个下回再说

stm32 001 - hello world(附带可运行源码)_第9张图片
3. 点击左上角的保存按钮,选择自动生成代码

修改代码

main方法修改成下面的样子,来频繁打开/关闭PC13引脚上的小灯

/**
* @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 */

   	/* USER CODE BEGIN 3 */
    // 等待100ms
   	HAL_Delay(100);
   	// 开关PC13引脚
   	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
   }
   /* USER CODE END 3 */
}

运行及调试

由于我这里使用了elink32作为调试工具,所以不能使用工程中默认的stlink32的调试配置,需要修改下:

  1. 在项目名称上右键Run as - STM32 Cortex-M C/C++ Application
  2. DebugerDebug probe选项中选择STLINK(Open ocd)
  3. Configuration Script中选择User Defined
  4. 将生成的helloworld.cfg文件修改为下面的样子:
# This is an genericBoard board with a single STM32F103C8Tx chip
#
# Generated by STM32CubeIDE
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)
interface cmsis-dap
transport select swd
adapter_khz 5000

set WORKAREASIZE 0x5000

set CHIPNAME STM32F103C8Tx
set BOARDNAME genericBoard

# Enable debug when in low power modes
set ENABLE_LOW_POWER 1

# Stop Watchdog counters when halt
set STOP_WATCHDOG 1

# Reset configuration
# use software system reset if reset done
reset_config none
set CONNECT_UNDER_RESET 0
set CORE_RESET 0

# ACCESS PORT NUMBER
set AP_NUM 0
# GDB PORT
set GDB_PORT 3333

source [find target/stm32f1x.cfg]

  1. 再次运行即可看到板子上的小灯开始闪烁起来了,helloworld搞定!
  2. 调试也可以直接使用:
    stm32 001 - hello world(附带可运行源码)_第10张图片
    恭喜,至此第一个STM32的单片机应用就跑起来了,开心不

源码

如果在运行过程中出现任何问题,可以尝试下载我这儿的工程源码,用IDE打开测试

百度网盘链接 提取码: s8kn

你可能感兴趣的:(STM32)