
1 通用描述1.1 STM8MOSTek 6502 - ST7 - STM8STM8型号单片机分为STM8A、STM8L、STM8S三个系列。STM8A汽车级应用STM8L超低功耗MCUSTM8S标准系列1.2 STM32- F1系列用的最多最大工作频率72MHz- STM32固件库函数使用手册STM32F1072010DWC2 FS OTGSTM32MP157C-DK2MPUSTM32U5U means ULP1.3 ST开发板种类ST官方出的有NUCLEO板、Discovery板以及评估板配置从低到高价格也是从低到高。NUCLEO一般只将MCU引脚引出还有一个串口通过STLINK USB虚拟价格也就几十到100RMB左右。Discovery板一般比NUCLEO板多USBMCU带USB音频解码耳机插孔。价格也就100多点。评估板功能是最全的一般外设都有引出功能最全价格最高几百到1000RMB。1.4 STM32 GPIO Alternate function mappingGPIO复用功能要查找的是datasheet。TRM中是详细的寄存器描述但不包括GPIO复用功能的描述。2 开发环境搭建2.1 STM32CubeMX_V4.27.0www.st.com/stm32cubemxSTM32CubeMX可以生成Atollic公司的TrueSTUDIO项目文件。2.2 IAR8.30.1IAR embedded Workbench 8.30https://m.baidu.com/ala/c/m.3322.cc/mip/40168.html3 CAN3.1 CAN分类PT CANPowerTrain CAN动力总成CH CANChassis CAN底盘控制CAN总线Body CAN车身控制总线BMW Body Domain Controller or Basis Central PlatformInfo CAN娱乐系统总线Diag CAN诊断控制总线3.2 CAN速率同时支持速率500 Kbps和2 MbpsBMS充电器CAN默认通信传输速率为250 kbit/s。CANpayload的长度是固定的8个字节CAN FDpayload的长度不是8个字节的都是FDCAN FD包头和payload用不同的速度传输速率切换从BRS位bit rate switching开始一直到CRC包括CRC结束3.3 STM32F0723.3.1 bxCAN pinoutPB8: CAN RxPB9: CAN TxSTM32F072 Discovery board, without CAN Transceiver MCP2551.3.3.2 bxCAN Rx filterbxCAN: Basic Extended CAN3个发送邮箱每个发送邮箱包括4个寄存器CAN_TIxR[31:21]存放11bits IDCAN_TDTxR[3:0]存放数据长度DLCCAN_TDLxR和CAN_TDHxR存放8个字节的payload2个接收邮箱每个接收邮箱包括4个寄存器CAN_RIxR[31:21]存放11bits IDCAN_RDTxR[3:0]存放数据长度DLCCAN_RDLxR和CAN_RDHxR存放8个字节的payloadID寄存器32bit CAN_FxR1Mask寄存器32bit CAN_FxR2。CAN接收过滤类似于Marvell 88Q5050交换机的ACL过滤机制包含数据寄存器和对应的mask寄存器。mask寄存器某位为1表示接收到的CAN ID对应的位必须与数据寄存器对应的位相同mask寄存器某位为0表示不关心接收到的CAN ID对应的位这种内存的类型称为TCAM。Mask Data Meaning0 x Dont care. The data bit can be a one or a zero.1 0 Hit on 0.1 1 Hit on 1.3.4 STM32F072 CANable3.4.1 PCAN USB深圳嘉立创打样STM32F042/072, SRAM 1024 bytes, last 256 bytes are exclusively shared with CAN peripheral.STM32F405/407 for PCAN USB Pro.STM32F072PA8: OTG_FS_SOF, Synopsys DWC OTGPA11: USB FS DMPA12: USB FS DPPA13: SWDIOPA14: SWCLKPB8: CAN0_RxPB9: CAN0_TxPB14: USB HS DM. Waveshare USB3300 PHY Module from TB.PB15: USB HS DP. Waveshare USB3300 PHY Module from TB.BOOT0-PF11一旦开启了USB电源即USB_CNTR.PDWN位清零PA11和PA12将不再作为其它功能使用仅供USB使用自动作为DM和DP不需要手工配置IO MUX。3.4.2 CANableCANable is based on STM32Cube.下载ARM官方的arm-none-eabi-gcc编译器。GNU Arm Embedded Toolchaingcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2github上搜索CANable。https://github.com/moonglow/pcan_cantactmake canablefind -name *.bin3.4.3 Standard PCANThe STM32F072 has up to 16 mono-directional or 8 bidirectional endpoints.USB SRAM0x4000_6000偏移地址0到ENDP0_RXADDR之间的buffer用来存储端点的参数每个端点参数有4个寄存器每个寄存器占用2个字节分别表示双向EP的接收packet和发送packet的位置和大小。Refer to Src/usbd_conf.c USBD_LL_Init().Both USB and bxCAN do not support DMA.Linux: drivers/net/can/usb/peak_usb/pcan_usb.cCANable: Src/pcan_usb.c4 endpoints: two for command IN/OUT, another two for message IN/OUT.CMDOUT / MSGOUT: device_data_out()CMDIN: pcan_usb_send_command_buffer()MSGIN: pcan_flush_data()CMDIN / CMDOUT: 1-byte func 1-byte number (GET or SET) 14-byte paramMSGOUT: 1-byte prefix 1-byte rec_count 1-byte status 4 or 2-byte ID (DLC status 0xf)-byte data extra_byte (if SRR 1)每一个Full-speed USB_EP_MSGIN MPSMax Packet Size可以包含多个PCAN消息Aggregation mode并且第一个PCAN消息的时间戳是2个字节从第二个开始的PCAN消息时间戳都是1个字节。下一个Full-speed MPS报文重复该模式。MSGIN: 1-byte prefix 1-byte rec_count 1-byte status 4 or 2-byte ID 2 or 1-byte timestamp (DLC status 0xf)-byte data extra_byte (if SRR 1)status: bit7 timestamp, bit6 internal, bit5 ext_ID, bit4 RTR (Remote Transmission Request)29-bit ID 4-byte ID 311-bit ID 2-byte ID 5SRR ID.bit0, Substitute Remote Request3.4.4 Debug1) Windows PCAN-ViewWhen PCAN-View starts, it will send the below five commands.05: PCAN_USB_CMD_CFG01: PCAN_USB_CMD_BITRATE03: PCAN_USB_SET_SILENT_MODE0b: PCAN_USB_CMD_LED03: PCAN_USB_CMD_BUS2status packet03 02 01, CAN bus active, then call pcan_timesync_event() sends the timestamp frame 02 02 42 04 01 b1 28 40 01 00 to PC periodically for about 1 second.2-byte header: 02 021-byte status: 421-byte function: 04, PCAN_USB_REC_TS1-byte number: 012-byte timestamp: b1 281-byte status: 401-byte function: 01, PCAN_USB_REC_ERROR1-byte number: 003) CANable patchMSGIN: 14 x Max_Packet_Size 14 x 64-byte, the first PCAN packet in each 64-byte has two bytes timestamp.Add a variable msg_count to pcan_rx_can_frame(), append the 4-byte to status packet.The first 5-byte of status packet: 02 02 42 04 01The third 3-byte of PCAN packet: 02 01 08Change CANable VID from 0x0483 (STMicroelectronics) to 0x0C72, otherwise Windows PCAN_USB.inf cannot recognize CANable because of driver signature issue.Windows PCAN-View sends PCAN_USB_CMD_BITRATE to CANable twice, the second command will cause STM32F072 bxCAN does not work, after apply the below patch, the issue will be gone.case PCAN_USB_CMD_BITRATE:if (pcan_device.bus_active)pcan_can_set_bus_active(0);pcan_device.can.btr0 cmd-param[1];pcan_device.can.btr1 cmd-param[0];pcan_set_bitrate( cmd-param );if (pcan_device.bus_active)pcan_can_set_bus_active(pcan_device.bus_active);4) Bit timingSTM32F072 CANbps APB1_clock / BRP / (tseg1 tseg2 1)PCAN-View发送给CANable下位机的有关时序的4个参数中sjw、tseg1和tseg2是三个数组的索引索引到三个值后分别减去1再写入CAN_BTR寄存器而brp的数值做特殊处理后再减去1写入CAN_BTR寄存器。从函数SystemClock_Config中找出APB1 bxCAN的时钟信息APB1的时钟是48 MHz。500 kBit/sAPB1: 48 MHztseg1 c - CAN_BS1_13TQ - 13tseg2 1 - CAN_BS2_2TQ - 2brp 0 - 1 x 6 - 6sjw 0 - CAN_SJW_1TQ - 14 USB4.1 USB SRAMUSB SRAM base: 0x4000_6000STM32F072/042是2014年发布的产品。STM32F072/042上对STM32F103的USBD做了改进0x400空间里面塞下了1024B的SRAM而且最后面的256B可以分给CAN专用前面768B给USBD完美解决了STM32F103的USBD和CAN不能同时使用的问题。除此之外STM32F072/042还增加了LPM、DP上拉电阻尤其是DP上拉电阻节省一个电阻和一个IO是非常好的改进。4.2 Flash and SRAM Base AddressSTM32F042/072 bootROM supports USB DFU. The built-in USB IP is legacy, not DWC.On-chip Flash base address: 0x0800_0000, 1 Kbyte pageOn-chip RAM base address: 0x2000_0000, SRAM data bus is 36 bits because 4 bits are available for parity check (1 bit per byte) in order to increase memory robustness.4.3 DFU ToolRefer to AN2606 to get what STM32 devices support DFU bootloader.Use Zadig to replace DFU driver with WinUSB.https://zadig.akeo.ie/https://dfu-util.sourceforge.net/dfu-util -d 0483:df11 -a 0 -s 0x08000000 -D xx.binThere is a web to implement USB DFU based on the draft WebUSB specification (based on WinUSB, Javascript API, Chrome 61, in 2018).4.4 VCPSTM32F0x2xx USB FS device library: UM17171添加CDC ACM的3个端点时顺序排在PCAN的4个端点之后中间不能有端点不用否则Windows 10 CDC ACM不工作。2CAN_MSGIN和VCP_DATIN双方会互抢带宽所以VCP发送到PC的日志要尽可能少。3VCP的setup bRequest只要实现0x20SET和0x21GET。typedef struct usb_interface_assoc_descriptor {uint8_t bLength;uint8_t bDescriptorType;uint8_t bFirstInterface;uint8_t bInterfaceCount;uint8_t bFunctionClass;uint8_t bFunctionSubClass;uint8_t bFunctionProtocol;uint8_t iFunction;} USB_INTERFACE_ASSOC_DESCRIPTOR;typedef struct usb_cdc_header_desc {uint8_t bLength;uint8_t bDescriptorType;uint8_t bDescriptorSubType;uint16_t bcdCDC;} USB_CDC_HEADER_DESC;typedef struct usb_cdc_call_mgmt_descriptor {uint8_t bLength;uint8_t bDescriptorType;uint8_t bDescriptorSubType;uint8_t bmCapabilities;uint8_t bDataInterface;} USB_CDC_CALL_MGMT_DESCRIPTOR;typedef struct usb_cdc_acm_descriptor {uint8_t bLength;uint8_t bDescriptorType;uint8_t bDescriptorSubType;uint8_t bmCapabilities;} USB_CDC_ACM_DESCRIPTOR;typedef struct usb_cdc_union_desc {uint8_t bLength;uint8_t bDescriptorType;uint8_t bDescriptorSubType;uint8_t bMasterInterface0;uint8_t bSlaveInterface0;} USB_CDC_UNION_DESC;static struct usb_cdc_line_coding line_code {.dwDTERate 9600,.bCharFormat 0, /* stop bits-1 */.bParityType 0, /* none */.bDataBits 8, /* nb. of bits 8 */};include stdarg.hvoid usb_printf(const char *fmt, ...){USBD_HandleTypeDef *pdev hUsbDeviceFS;va_list args;uint32_t len;char buf[APP_TX_DATA_SIZE];if (pdev-dev_state !USBD_STATE_CONFIGURED)return;va_start(args, fmt);len vsnprintf(buf,(APP_TX_DATA_SIZE - 1),fmt, args);va_end(args);buf[len] \0;if (pdev-ep_in[VCP_USB_EP_DATIN 0xFU].total_length)return;pdev-ep_in[VCP_USB_EP_DATIN 0xFU].total_length (len 1);USBD_LL_Transmit(pdev,VCP_USB_EP_DATIN,(uint8_t *)buf,(len 1));}Download Davidozzoo / STM32-USB-VCP from github.4.5 socketCANsudo ip link set can0 type can bitrate 500000 restart-ms 100sudo ip link set up can0sudo apt install can-utilscandump can0CAN identifier: 456hCAN data: 00h FFh AAh 55h 01h 02h 03h 04h (8 bytes)cansend can0 456#00FFAA55010203045 STM32软件实施USB PD协议USB PD通讯使用的是双相标记码Bi-phase Mark CodeBMC300KHzbit rate 600kbps此码是一种单线通信编码数据1的传输需要有一次高/低电平之间的切换过程数据0的传输则是固定的高电平或低电平。TXSPI1从模式MISO当作TXSPI1 CLK通过配置TIM14产生工作在600KHz对应BMC 600kbpsARR 72Mhz / 600kbpsPSC 072MHz频率输入每计数12个 72MHz / 600kbps触发产生一个SPI1从clk时钟。SPI传输数据过程中总是先发送或接收高字节数据每个时钟周期接收器或发送器左移一位数据。对于小于16位的数据在发送前必须左对齐如果接收的数据小于16位则采用软件将无效的数据位屏蔽。RXTIM1 CH1输入捕获模式并用DMA接收数据。输入捕获模式下当捕获单元捕获到外来有效信号边沿事件通过TIM1 CH1 Capture Compare Enable Register 0xB设置上升沿和下降沿捕获STM32库使用宏TIM_ICPolarity_BothEdge 0x000A配置双边沿触发捕获将此刻计数器的值锁存到CCRCapture Compare Register16bit影子寄存器并自动将CCR影子寄存器的值拷贝进CCR预装寄存器以供用户读取。DMA传输方式就是将CCR预装寄存器中的计数值传输到内存中。CCR寄存器中的计数值与上一次的计数值相减 x 计数频率的倒数 高电平或者低电平信号宽度。输入捕获采样的频率就是定时器经过预分配器PSC之后的频率譬如STM32F1 TIM1 CH1的计数器频率等于2.4MHz 72MHz/(Prescaler 1)那么计数器计数每增加4个就表示BMCbit rate 600kbps的一个bit。解码时如果连续2次计数间隔之差都小于6那么这2次计数间隔对应的4b5b bit是1如果1次计数间隔之差大于6说明这次4b5b bit是0。https://github.com/alterapraxisptyltd/chromium-ec/blob/master/chip/stm32MISO (DAT0): mi s əuMOSI (CMD): m əu si6 General AbbreviationsAIRCApplication Interrupt and Reset RegisterARR: Automatic Reload RegisterBKP: BackUpBSPBoard Support PackageCCER: Capture/Compare Enable Register用来判断当前是下降沿捕获中断还是上升沿捕获中断同时也能随时改变上升沿捕获还是下降沿捕获CCR: Capture/Compare Register表示当前中断发生时的CNT寄存器的值也就是用来判断时间的PWM输出时作为占空比寄存器函数是TIM_SetCompare1(...)CNT: Counter Register用来计数的每个定时器时钟周期自动1在需要的时间将其清零便于计时CmBacktraceCortex Microcontroller Backtrace是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位、错误原因自动分析的开源库CubeMXMicrocontroller GUIeCC-USBeCos Centric USBGHSGreen Hills Software提供GHS hypervisor类似于QNX hypervisor、仪表专用RTOS、MCU开发IDEIAR后两个字母取之于创始人名字Anders Rundgren的首字母瑞典语Ingenjörsfirman Anders Rundgren意为Anders Rundgren工程公司IAR icfILINK Configuration FileMDATAMore DATAUSB ep双缓冲ep_kind配置使能切换机制对应到DATA0和DATA1MSPMCU Specific PackageNVICNested Vectors Interrupts ControllerNVIC IPRInterrupt Priority RegistersOCOutput Compare输出比较用于输出PWM信号寄存器CNT与CCR比较大于输出1小于输出0PMAPacket Buffer Memory AreaPSCPreSCaler register预分频寄存器RCCReset and Clock ControlRCRRepetition Counter Register重复次数寄存器SHPRxSystem Handler Priority RegistersSR: Status Register用来判断是不是输入捕获中断ST AMGAnalog and MEMS Group模拟和MEMS部门现在改成了Analog, MEMS and Sensors GroupSTM32H7High-perf Cortex-M7STM32WBWB表示集成了Wireless Bluetooth模块STM32WLWL表示集成了Wireless LoRa模块PendSVPendable 服务是一个中断请求如果没有其他中断需要响应时系统将强制执行上下文切换SVCallSuperVisor Call由SVC指令触发FreeRTOS用它来启动任务调度USB BH resetBigger Hammer or Brad Hosler表示warm resetyou may be confused why the USB 3.0 spec calls the same type of reset warm reset in some places and BH reset in other places. BH reset is supposed to stand for Big Hammer reset, but it also stands for Brad Hosler. Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.