cruelfox

  • 2020-08-05
  • 回复了主题帖: 【STM32F769Discovery开发板试用】USB-HS HID收发简单测评

    donatello1996 发表于 2020-8-5 09:58 数据有没有成功发送出去,需要电脑上位机那边接收并做计数,不是STM32这边需要关心的问题,先不说polling ...
    是的,你认为的“发送成功”跟这没关系,USB模块存在不存在都没有关系。只要函数没有卡在那里就是成功。

  • 2020-08-04
  • 回复了主题帖: 【STM32F769Discovery开发板试用】USB-HS HID收发简单测评

    donatello1996 发表于 2020-8-4 18:13 时钟60MHz跟可以发送的数据量速率128MB/s有什么关系呢?60MHz只不过是USB时钟电平的频率,一秒钟内时钟可 ...
    你那只是函数返回而已,数据并没有发送出去。 HID报文是Interrupt Transfer类型的,只有主机polling的时候才可以把数据发出去。 这不是SPI... 就算是480Mbps的SPI,也最大才60MB/s的传输量。

  • 回复了主题帖: 【STM32F769Discovery开发板试用】USB-HS HID收发简单测评

    扯了,你这么用示波器抓只是判断 USBD_CUSTOM_HID_SendReport(&hUsbDeviceHS,buf,sizeof(buf)); 这个调用的间隔时间。 USB HS的接口 ULPI 的时钟才60MHz, 不可能有超过60MB/s的收发速度。

  • 2020-07-08
  • 回复了主题帖: (以STM8/STM32为例)硬件i2c spi有什么意义?

    辛昕 发表于 2020-7-8 13:33 CPU可以暂时不管去做别的事情。 要么你不理解i2c clk的意义,要么你不知道自己在说什么。
    看来你真的是不理解硬件接口的意义。 要么你的理解力不够,要么你的表达能力有问题。

  • 回复了主题帖: 开总中断前已经清除了标志位但还是进中断怎么决解呢

    NVIC 中对应的 IRQ pending 标志也要清。 EXTI 向 NVIC 的中断请求撤消之后,IRQ handler 没有执行之前,pending状态还依然存在。

  • 2020-07-06
  • 回复了主题帖: (以STM8/STM32为例)硬件i2c spi有什么意义?

    硬件IIC比软件模拟的优势,首先是写寄存器(设频率,设地址、写数据)之后等结果(标志位)就可以了,CPU可以暂时不管,去干别的事情,或者休眠模式省电。其次是软件模拟要把所有异常状态考虑到,代价(效率)就低了。 既然有硬件IIC,为何不用? 要认为软件GPIO模拟比写操作硬件容易的——模拟个 IIC slave再来说。

  • 2020-07-03
  • 回复了主题帖: 0805的贴片LED,1.25mA的电流可以点亮吗 ?

    作为PCB指示灯用的话,1mA已经算大电流了。要是翠绿色的,1.25mA, 盯着它看都刺眼。

  • 回复了主题帖: 开关电源中的“零线”和“火线”问题

    发光是有微弱的电流流过的。并不是要连了导线才能走电流,导体与周围导体(比如墙壁里的金属管道)构成的电容器也可以通过交流电流。

  • 回复了主题帖: 最近在用STM32F103RCT6,用软件模拟挂了10个IIC 24C02 时钟线和数据线有必要等长吗...

    若没有需要等长的依据,就不用考虑弄成等长的。除非你为了好看,或者强迫症。

  • 2020-07-01
  • 回复了主题帖: kicad, Esschema里放置元件符号出现不一致

    你把软件名字叫错了,是 eeschema,  不是 esschema  

  • 回复了主题帖: kicad, Esschema里放置元件符号出现不一致

    eeschema会自动调整这个文字的摆放。有选项,默认开启的,可以关这个功能。

  • 2020-06-29
  • 回复了主题帖: 恒流源+NMOS与PMOS(单片机控制通断)+LED方案咨询

    为啥在这里企图用PMOS做功率开关?按你的图,要PMOS管 Q1 导通,栅极电压要是负的,怎可能实现? LED点亮时,电流是经过 D5及R1, Q2 的,不会经过Q1. 

  • 2020-06-23
  • 回复了主题帖: 单片机寄存器地址,为什么有些是00H,有些是0000H?有区别吗?80H到FFH有多少个地...

    QWE4562009 发表于 2020-6-23 14:27 恩恩。讲得挺好的。还有, 00H, 0000H这个能看出是多少位的寄存器不 00H为什么一眼就能看出是8位 &n ...
    确切说是不能。 你想我们日常写数字若非要用0开头是什么场合?比如快递三轮车编号 00245,就暗示了这个编号系统的范围是 5 位数能表示的范围,暗示这个地区可能有超过一万辆这类三轮车——但不一定有这么多。 一个十六进制的符号(0,1,...到 F)能表示16个数值。用2个这样符号书写的数字表示整数范围是0~255,  用4个可表示的范围是0~65535.  但是寄存器是多少位(能存的整数范围有多大)是需要单独说明的。 比如说某个“寄存器 A 当前值是 0000H”, 给了一个暗示—— 寄存器A的值的范围需要用4个十六进制数来书写表示。但它可以是16位, 还可以是15位,14位,13位。

  • 回复了主题帖: 单片机寄存器地址,为什么有些是00H,有些是0000H?有区别吗?80H到FFH有多少个地...

    80H 到 FFH,  就是 FFH-80H+1 = 80H (十进制128)个地址。两个地址数值相减再加1就得到答案了。

  • 回复了主题帖: 单片机寄存器地址,为什么有些是00H,有些是0000H?有区别吗?80H到FFH有多少个地...

    单纯就数值来讲,00H 和 0000H 都是0.  在汇编里面写 0, 0H, 00H, 0000H ,或者C语言里面写 0, 0x0,  0x00,  0x0000 是没有区别的。 又比如 6月5日,可能会在电子设备上显示成 06月05日,那表示的意义是一样的。 你引用的这里写成 00H, 0000H 这样子,是为了暗示这个值用于8位或者16位的寄存器、地址之类的表示。

  • 2020-05-15
  • 回复了主题帖: DAC调节DCDC芯片输出电压问题

    FB脚电压是多少?

  • 2020-05-12
  • 回复了主题帖: 固态器件与真空管的比较,两者会长期共存吗?

    真空管在音响上面还用得不少。 有的曾经停产的型号,竟然这些年又复产了。

  • 2020-05-11
  • 回复了主题帖: ESP32-S2开发之坑(1)--开填

    "看起来LX7核心能够在每个周期进行更多浮点运算:LX6显然有2个FLOPS /周期,但LX7有64个FLOPS /周期" 但楼主仍然说"esp32系列的浮点运算实在太差",为何?

  • 回复了主题帖: STM32F407简单视觉小板(识别二维码,数据矩阵码,apriltags,圆方形状检测)

    这个看起来好玩

  • 2020-04-29
  • 发表了主题帖: STM32MP157A-DK1测评 (7) M4核程序小试

    本帖最后由 cruelfox 于 2020-4-30 00:46 编辑   前面玩的都是 STM32MP157A 的 Cortex-A7 核,因为这对我而言是新东西。除了两个A7核,此芯片还配备了一个 Cortex-m4 核。不过 M4 核的地位要“矮”一些,在对片上设备的访问权限上是 A7 核当领导的。STM32MP157A 内部没有 Flash, Boot ROM 仅是给 A7 核运行的,因此 M4 核运行的程序需要由 A7 核提供给它。这样也有更大的灵活性,可以在 Linux 运行时候动态地为 M4 核加载软件。   STM32MP157 有一个 "Engineering Mode",留给调试使用。在 DK1 开发板上,可以将底下的BOOT开关设成 BOOT0=0, BOOT2=1状态,就进入"Engineering Mode" (wiki上介绍了,但数据表中没有说,只描述为 ”Reserved(Noboot)“)。在这个模式下,ROM Bootloader 会将 M4 核启动,可以用 OpenOCD 调试 M4 核程序。我以前调试时,OpenOCD列出来的 cpu2 (对应M4核)状态总是 "examine deferred" 所以无法访问它。   但是我更改 BOOT 状态重开机后,发现 cpu2 仍然是 "examine deferred".  似乎是调试器本身的问题。后来从网络上找到答案——还需要在 OpenOCD 中使用 set ENG_MODE 1 命令。这样就能切换到调试 M4 核了。   这样就有点像以前STM32那样调试的感觉了,除了没有Flash, 不能 reset init 停在第一条指令之外。两个A7核是保持运行状态的,切换后halt命令只对cpu2有效。(切换前是对cpu0, cpu1一起有效,还不能单独停止cpu0或cpu1, 这个问题我不明白)     为了测试 M4 核,我拿个以前的程序改一下: int main(void) { gpio_config(); xTaskCreate( blink1, "Blink One", STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL ); xTaskCreate( blink2, "Blink Two", STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL ); xTaskCreate( blink3, "Blink Three", STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL ); xTaskCreate( blink4, "Blink Four", STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL ); vTaskStartScheduler(); } 就是搭了个FreeRTOS的框架,用4个任务分别以不同的时间间隔操作GPIO翻转,使不同的LED亮灭变化。GPIO的寄存器操作和 STM32F4 一样,RCC中使能GPIO的操作与 STM32F4 有所不同,我在A7程序编写时已发现。因为现在不涉及和 A7 核争用资源,所以不考虑其它的。   除了必须的寄存器定义头文件 stm32mp157axx_cm4.h , 从开发软件包中还可以找到 startup_stm32mp15xx.s 启动文件(包含中断向量表,ResetHandler代码),和 stm32mp15x_m4.ld 链接脚本。这样用 GCC 编译程序需要的文件就够了。注意提供的 LD 脚本中对内存分配的描述: MEMORY { m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000298 m_text (RX) : ORIGIN = 0x10000000, LENGTH = 0x00020000 m_data (RW) : ORIGIN = 0x10020000, LENGTH = 0x00020000 m_ipc_shm (RW) : ORIGIN = 0x10040000, LENGTH = 0x00008000 }   M4核执行的程序是放在几块 SRAM 中的,和 A7 核的 SYSRAM 彼此不干扰。编译得到 HEX 文件,可以用 OpenOCD 载入运行。操作命令如下: > load_image f:/test.hex 664 bytes written at address 0x00000000 3076 bytes written at address 0x10000000 downloaded 3740 bytes in 0.031250s (116.875 KiB/s) > mdw 0 2 0x00000000: 10040000 10000b71 > reg sp 0x10040000 sp (/32): 0x10040000 > reg pc 0x10000b71 pc (/32): 0x10000B71 > resume   虽然中断向量表写在 0x0 处,但只有 reset 时才能加载,现在只能改 SP 和 PC 寄存器手动初始化。最后用 resume 命令让 M4 核跑起来。   那么只有 Engineer mode 才能调试 M4 核?当然不是这样,只是这个模式下 ROM bootloader 让这个核启动了而已。默认,M4核是被停住的,需要软件让它起来:   手册中说,BOOT_MCU 位(RCC的MP_GCR寄存器里面)写成1,当MCU复位时,才脱离Stop状态。那么我就来测试一下:将板子调到正常启动模式,通电,启动到 U-Boot 提示时在终端里按个键让 u-boot 等待。然后启动 OpenOCD,并使用 set ENG_MODE 1 连接板子。此时,查看 M4 核状态有所不同: > targets     TargetName         Type       Endian TapName            State --  ------------------ ---------- ------ ------------------ ------------  0* stm32mp15x.cpu0    cortex_a   little stm32mp15x.tap     running  1  stm32mp15x.cpu1    cortex_a   little stm32mp15x.tap     running  2  stm32mp15x.axi     mem_ap     little stm32mp15x.tap     running  3  stm32mp15x.ap1     mem_ap     little stm32mp15x.tap     running  4  stm32mp15x.cpu2    cortex_m   little stm32mp15x.tap     unknown  5  stm32mp15x.ap2     mem_ap     little stm32mp15x.tap     unknown 因为它还处于 CStop 状态。我就将 BOOT_MCU 置1试试(寄存器地址 0x5000010C): > mdw 0x5000010c 0x5000010c: 00000000 > mww 0x5000010c 1 > mdw 0x5000010c 0x5000010c: 00000001 再让 MCU 复位。按 reset 开关当然不行,不能复位其它部分。从手册中我找到这个寄存器: 其中 bit2 是 MCURST, 写1就可以复位 MCU 了。于是执行: > mww 0x50000404 2 > targets     TargetName         Type       Endian TapName            State --  ------------------ ---------- ------ ------------------ ------------  0* stm32mp15x.cpu0    cortex_a   little stm32mp15x.tap     halted  1  stm32mp15x.cpu1    cortex_a   little stm32mp15x.tap     halted  2  stm32mp15x.axi     mem_ap     little stm32mp15x.tap     running  3  stm32mp15x.ap1     mem_ap     little stm32mp15x.tap     running  4  stm32mp15x.cpu2    cortex_m   little stm32mp15x.tap     unknown  5  stm32mp15x.ap2     mem_ap     little stm32mp15x.tap     unknown 但 OpenOCD 还没有识别这个核的状态?可能是 OpenOCD 的问题,于是我将 OpenOCD 退出,重新连接,查看状态——好了,cpu2 处于 halted.     那么我就能将程序装到 SRAM 了,采用同样的 load_image 命令。然后,我将 MCU 复位让它从中断向量表获取入口地址。 > targets stm32mp15x.cpu2 > load_image f:/test.hex 664 bytes written at address 0x00000000 3076 bytes written at address 0x10000000 downloaded 3740 bytes in 0.031250s (116.875 KiB/s) > targets stm32mp15x.cpu0 > mww 0x50000404 2   复位MCU的操作必须由MCU来进行,所以在 OpenOCD 中需要切换 targets.    从 LED 闪烁状态我可以判定 M4 核程序已经正常运行了。   这会 A7 核仍然在 halted 状态,那我就恢复它,然后让 U-Boot 接着完成后面的工作:启动 Linux. LED继续闪烁着,然后在 Linux 系统启动过程中,闪烁状态消失了——我想该是 Linux 接管了 GPIO,于是 M4 程序无法操作它们。在 OpenOCD 中却已无法调试 M4 核了,看来 Linux 对 M4 的运行已有干预了,这只有深入下去才知道……   让 A7 核和 M4 核协同工作是更高级的话题。STM32MP157 硬件上有一些设计用来让MPU和MCU子系统之间通信,软件上也有相应支持的框架。若让 Linux 进入 Suspend to RAM 模式,保留 M4 核在低功耗运行处理简单任务,只在需要的时候才唤醒 A7 核恢复 Linux 执行,将比单纯的 Linux 系统更节省功耗。 此内容由EEWORLD论坛网友cruelfox原创,如需转载或用于商业用途需征得作者同意并注明出处

统计信息

已有700人来访过

  • 芯币:6416
  • 好友:11
  • 主题:135
  • 回复:1032
  • 课时:1
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言