【Sim2real】03 用opencm3开发 stm32f107c8t6
2024-10-26
基于 opencm3 尝试了开发 stm32f107c8t6最小系统板的嵌入式开发, 搭建了Gcc toolchain, 测试了 UART USB I2C SPI 等通信协议, PWM ADC 等数模转换, CAN 总线等
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
练习:
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. 后续工作
stm32 opencm3 rtos