Starofus

你好呀,我是Sans

【Sim2real】03 用opencm3开发 stm32f107c8t6

2024-10-26

基于 opencm3 尝试了开发 stm32f107c8t6最小系统板的嵌入式开发, 搭建了Gcc toolchain, 测试了 UART USB I2C SPI 等通信协议, PWM ADC 等数模转换, CAN 总线等

代码:https://github.com/mrzhuzhe/peasant/tree/main/stm32

1. 概述

目标:开发自定义硬件

阅读《Linux Device Drivers, Third Edition》这本书有了一个初步的概念

操作系统包含

  • 区分内核态和用户态
  • 内核态支持系统调用
  • 内核负责:内存管理,文件系统,中断处理,任务schedule,网络协议等
  • 内核和硬件EPROM固件通信,通过固件来操作寄存器和内存来命令硬件
  • 硬件电路由VHDL定义,ALU risc-spm, uart transmitter等IP模块来支持固件, 参考《advanced digital design with the verilog hdl》By Michael D. Ciletti


    上图:传奇的16位新芯片 6502

练习:

  • 之前参考osdev.org做了一些 x86 系统boot / 驱动 的练习
  • 希望有个平台可以尝试固件的开发,因此搜索到了STM32平台

    本次使用 stm32f107c8t6 最小系统板


2. 相关工作

3. 演示

  • 演示1: PWM 控制电机

    Todo 此处添加b站演示

  • 演示2: A2D 读取传感器

    Todo 此处添加b站演示

  • 演示3: UART tty通信

    # 注意这里要设置波特率
    # baud rate to 38400, 8 bits, 1 stop bit, no parity:
    $chmod 666 /dev/ttyUSB0
    $stty -F /dev/ttyUSB0 38400 cs8 -cstopb -parenb -echo -icanon -onlcr

4. 实验设计和结果

  • GPIO

    arm-none-eabi 交叉编译环境如何设置看这里

    下载 opencm3 stlink-v2 freertos 的代码并编译

    得到一个这样的目录结构,对应makefile中寻找freertos和opencm3依赖库的路径

    工程模板

    // GPIO 测试, 仅使用opencm3
    /stm32/led_test/

    // rtos gpio 测试
    /stm32/rtos-template

    注意其中 stm32f103c8t6.ld 指定了代码段的内存分布

  • I2C

    用来和OLED, tb6612cnf电机控制器,MPU6050陀螺仪等外设通信

    // 用软件i2c连接oled和mpu6050陀螺仪
    /stm32/rtos-mpu

    // 用软件i2c连接oled
    /stm32/rtos-oled

  • SPI

    用来和winbond w25q64外部flash芯片通信,速度更快

    Todo 目前芯片烧了 待验证

  • UART

    用来和电脑 ttyUSB 通信

    // uart 通信
    /stm32/uart_test/

  • USB

    USB cdc 串口通信

    // usb 连接 , 【注意】用这个连接时一定要拔掉电源,因为usb本身就是电源
    /stm32/rtos-usbcdc

  • A2D

    用来接各种外部传感器

    // 模拟信号转换为数字信号
    /stm32/rtos-adc

  • PWM

    用来把数字信号转为模拟信号,驱动外部电机,舵机等,需要用到TIM

    // pwn 驱动舵机和电机 用的电机控制芯片是 tb6612fng
    /stm32/pwm

  • DMA

    代替cpu来访问内存,节约CPU io开销,可以用来篡改内存

    // 用dma搬运adc数据
    /stm32/rtos-dma

  • CAN 总线

    用来在多个设备之间通过统一的通信协议通信,距离远抗干扰

    这里因为我只有一个芯片,所以开启了回环模式,在一个芯片里也可以xmit 和 receive

    // can 总线
    /stm32/rtos-can

5. 遇到的问题

  • 1. STlink 有debug的功能,在接通的情况下可以直接debug stm32单片机中的代码

    #启动远程调试server
    $st-util -p 4500
    #启动arm gdb
    $arm-none-eabi-gdb
    (arm-none-eabi-gdb) target extended-remote localhost:4500
    (arm-none-eabi-gdb) file your_path/your app.elf

  • 2. 有时如果有代码禁用了stm32 开发板上对应 stlink的IO 引脚 pin

    会导致无法flash烧录代码,这个时候需要按住reset模式,再用stlink erase删除flash中的代码才能继续烧录


6. 后续工作

  • 1. 后续会结合 https://docs.kernel.org/ROCm 和 龙芯 等开源硬件平台 练习开发操作系统内核和驱动
  • 2. wifi 模块 / I2C 拓展板等 继续熟悉stm32的各种细节
  • 3. PCIE总线
  • 4. UEFI tianoCore 固件平台
  • 5. 通过Fpga开发板尝试常见IP模块的实现
stm32 opencm3 rtos