Tri 2021/8/27 组会报告

最近工作

  1. 接上周,进行STM32 FreeRTOS程序的开发准备工作。

  2. 将之前在5月份写的移植了FreeRTOS的PP控制程序拿过来进行使用,硬件采用新买的STM32F103RCT6核心板,但是出现了几个问题,如下:


  1. 上位机与核心板无法通信。

  • 原程序在核心板上运行后无法进行UART通信。采用示波器抓PA9-PA10(目前主要使用这两个GPIO)波形,发现PA10可以收到USB-TTL模块发送的信号,但是PA9并未发送对应波形。

  • 检查核心板发现上面有手焊的痕迹,两个GPIO引脚连在一起(PA10和PA11),遂怀疑是板子有问题,于是更换了一块核心板。

  • 将原程序加载到新核心板上运行,但是仍旧不能通信,采用示波器抓波形仍是一样的效果。采用ST-LINK的Debug功能看Peripherals中UART寄存器配置,发现UART1寄存器全部为0,而UART2寄存器正常配置,说明问题出在程序上,程序没有指定具体使用哪个串口,导致串口随机分配。

  • 在阅读了UART部分的Arduino代码后,采用以下代码:
    Serial.setTx(PA9);
    Serial.setRx(PA10);
    通过直接指定Tx-Rx引脚,结合STM32的Pinmap使程序直接对UART1进行初始化。NeoPLC Board上采用了多个不同的串口,可以采用该方式对串口进行区分和定向初始化,避免造成串口冲突。

  1. FreeRTOS返回消息不正确。

  • 在发送GET所有通道消息后程序不返回JSON字符串,直接返回JsonError,具体状况见5月份组会报告 Tri 2021/5/21组会报告

  • JsonError的类型为NoMemory,目前猜测是和任务分配的堆栈空间不足导致,但是任务堆栈不能无限大。出现该问题的原因还在进一步寻找,需要进一步实验证实。

  • 该问题只在消息长度超过一定值后出现。经过反复测试,当下程序能够支持的、无错误运行的最大通道数为20个(0-19),超过20个后就会出现消息间歇无返回、JsonError等问题。


  1. 阅读了之前给的ADC-DMA例子,发现现有的例子只是在固件库上进行进一步封装,都是调用固件库进行操作。好处是之前曾经编写过DMA初始化的代码,稍加修改就可以直接整合到现有工程中。

  2. 阅读了ai-stream-cdp-s-payload-designcfet-device-protocol-streaming的说明文件。目前采用CDP进行数据传输的话确实存在处理时间长(约百μs到ms级)的问题,采用CDP-S的话不存在Json消息解析,可以大大提高任务处理速度。

  • 关于AI Stream采样的问题,由于涉及到采样率的设定问题,将会采用Timer Interrupt 或者 Exit Interrupt触发ADC采样,ADC配置为单次采样。这样每触发一次,ADC对各个通道转换一次,数据通过DMA传输到缓冲区,通过SPI发送出去。

  • 除了可以用中断调用软件触发ADC采样,还可以采用Timer CH通道或者EXIT通道进行外部触发,避免软件开销。

  1. 简单看了原有的NeoPLC Board,目前除了DAC部分没有加滤波电路外暂无需要修改的地方。

下周工作

  1. 继续对问题2进行实验,找出背后的原因。

  2. 尝试编写ADC外部触发程序,弄清楚如何使用。

  3. 准备开学相关事宜,下周五、周六报道,九月份后就住校内,需要搬一些东西。


本文章使用limfx的vscode插件快速发布