文章目录
- 初衷
- 前提准备
- 硬件环境
- 软件环境
- 硬件连接
- 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块钱那个就行了
elink32
:stm32的调试工具有st-link、elink、jlink等多种,我这里使用elink-32,唯一在我的ubuntu机器上不会很快损坏的设备,之前在淘宝的16块钱的st-link被我搞坏了5个,你敢信,购买链接请自行淘宝,elink-32使用cmsis-dap/swd方式进行调试
USB转串口线
:以我目前浅显的知识来说,要这家伙是用来输出log的,刚开始在没有adb的情况下愣是没习惯这种打个log还需要自己动手的情况,而且由于debug对于某些性能敏感的情况会出现调试没bug,运行稀烂一地的情况,虽然串口输出也没见得多高效,汗- -!
软件环境
工欲善其事必先利其器,软件不得到位,下面是我用到的软件(我是在Ubuntu系统下开发的,因此选用了跨平台的开发工具STM32CubeIDE
而不是更强大的IAR之类的):
STM32CubeIDE
:这他喵是个ST官方出的跨平台的stm32开发工具,可以在ST官网下载,基于eclipse开发,有下面的特点:
- 跨平台,windows、mac、linux都可以用
- 包含交叉编译,不用自己纠结咋么编译
- 支持团队管理,各种版本管理软件eclipse上熟悉的工具走起
- 支持stlink、elink等多种调试工具
- 集成了
CubeMx
:这个就是神器了,它是stm32平台使用UI界面配置stm32引脚功能、时钟、中间件等一系列东西的工具,有了它再也不用翻stm32的文档去纠结怎么配置时钟了,一键搞定,美得很。(没有这个工具,我们就需要手动对着ST的操作手册一个一个去配置寄存器来修改引脚和时钟,太灾难了)
硬件连接
请按照下图连接elink32
和stm32
(用于调试和安装ROM,类似于Android上通过usb进行adb调试),只需连接3V3
、GND
、DIO
、SCK
四个引脚即可
Windows中可能需要安装elink32的驱动,请自行解决
stm32支持Serial Wire、JTag、串口等多个方式进行安装rom,其中区别请自行了解,这里只选取了硬件比较便宜,操作方便的方法
Hello world应用
在STM32CubeIDE中创建新工程
- 和Android应用不同的是:stm32不同的板卡有不同的引脚布局、外设引脚配置、软件库等选择,因此首先需要确定是哪个型号的芯片才能创建工程,这里选择
STM32F103C8T6
Target Project Type
选择STM32Cube
,这样就会关联stmCubeMx这个引脚配置工具,而不用自己手写寄存器操作来修改时钟。
配置引脚
- 配置调试引脚:
这一步非常重要! 如果忘记配置会导致板子在一次刷写后不能再访问,需要通过串口或者其他方式刷入支持SWD的固件才能恢复。在helloworld.ioc
打开后的配置页面中,左侧System Core
-SYS
-Debug
中选择Serial Wire
- 配置helloworld的小灯引脚:
使用鼠标左键点击右边引脚图中的PC13
引脚选择GPIO_Output
即可在STM32的helloworld中,第一个应用不是打印或者显示一个helloworld的字符串,而是把板子上的小灯点亮,它里面的log输出需要麻烦点,需要自己配置串口和相关的接口,这个下回再说
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 */// 等待100msHAL_Delay(100);// 开关PC13引脚HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);}/* USER CODE END 3 */
}
运行及调试
由于我这里使用了elink32
作为调试工具,所以不能使用工程中默认的stlink32的调试配置,需要修改下:
- 在项目名称上右键
Run as
-STM32 Cortex-M C/C++ Application
- 在
Debuger
的Debug probe
选项中选择STLINK(Open ocd)
- 在
Configuration Script
中选择User Defined
- 将生成的
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 5000set WORKAREASIZE 0x5000set 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 3333source [find target/stm32f1x.cfg]
- 再次运行即可看到板子上的小灯开始闪烁起来了,helloworld搞定!
- 调试也可以直接使用:
恭喜,至此第一个STM32的单片机应用就跑起来了,开心不
源码
如果在运行过程中出现任何问题,可以尝试下载我这儿的工程源码,用IDE打开测试
百度网盘链接 提取码: s8kn