我想从 STM32F103C8T6(Blue Pill) 的内部闪存中读取数据,我正在使用 USB 协议将数据从 Blue Pill 发送到我的 PC,并使用 Pyusb v1.2.1 库。
代码片段-1我是如何从主控(PC)请求时从Blue Pill板(从属)发送数据:
if(Flash_Data_Transmission_Flag == 1){
while(Flash_Address < 0x08010000){
for(uint16_t j=0; j<Read_Size; j++){
Read_Buffer[j] = *(__IO uint8_t *)Flash_Address;
Flash_Address++;
}
CDC_Transmit_FS(Read_Buffer, sizeof(Read_Buffer));
}
if(Flash_Address == 0x08010000){
Flash_Address = 0x0800C000;
}
Flash_Data_Transmission_Flag = 0; //Reset Flag
}
在这里,
Flash_Data_Transmission_Flag
是从 USB 接收的中断服务程序设置的,我正在读取 16KB 的数据。
我如何在 Pyusb 接收方(PC)上进行数据处理的代码片段-2:
DATA_BULK_WRITE_EP = 0x01
DATA_BULK_READ_EP = 0x81
NUMBER_OF_BYTES_TO_READ = 8192
dev = usb.core.find(idVendor=VID, idProduct = PID)
ep = dev[0].interfaces()[0].endpoints()[0]
dev.set_configuration()
Main_List = []
for i in range(0,2):
dev.write(DATA_BULK_WRITE_EP, bytes(0x9), 1000)
Main_List.append(dev.read(DATA_BULK_READ_EP, NUMBER_OF_BYTES_TO_READ, TIMEOUT))
bytes(0x9)
用作设置 Flash_Data_Transmission_Flag
的命令,因此每次 Blue Pill(Slave)收到 9 字节时,应该在 ISR 中设置 Flash_Data_Transmission_Flag
并执行第一个 code snippet-1 中编写的序列上面开始发送从定义的内存地址读取的数据。
在 pyusb 端接收数据时(代码块 2), 如果我发送第一个读取命令,理想情况下我应该接收 8192 字节,并且执行两次应该给我 16384 字节,我附加在 Main_List 中(在 code snippet-2 中实现)
的预期结构
Main_List
:[ [8192] [8192] ]
其中8192
是一维子列表中元素的总数。
当我在 for 循环中运行 code snippet-2 2 次时, 我的
Main_List
收到:[[8192][]]
。 我第二次收到空列表.
如果我循环运行四次,我的
Main_List
收到: [[8192][][8192][]]
然后我得到 16384 个字节和 2 个空列表。
什么可能导致这个问题以及如何解决这个问题?
即使循环运行 4 次也能得到预期的结果,但结果不一致并提供了错误的数据。
例子: 写入内部闪存的 8Kb 图像:
Reading 16KB of Flash Memory 预期结果:
在 20 次运行中收到大约 6-8 次错误输出并且模式不断变化: