问答

汇集网友智慧,解决技术难题

32021724

TA的家园币:228  

  • STM32的网口DMA是否只能从RAM中提取数据

    用stm32cube生成了一个基于stm32f407Vet6和lwip的httpserver的例程,试了试工程的ping通没问题,单纯手动新建tcp和udp通信也没问题,但是httpd部分网页打不开经过一通搜索查找跟踪debug,发现httpd部分80端口tcp连接可正常连接,get请求也能正确进入http_recev,http网页数据一路来到HAL_ETH_Transmit的WRITE_REG(heth->Instance->DMATPDR,(uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));这行就完蛋了网口DMA的SR寄存器报了个ETH_DMASR_FBES错误对比了一个能运行的例程,虽然http网页数据都在flash里,但是人家的网口发送dma描述符的数据地址开头是0x2开头的,也就是数据被拷进了RAM里,然后给到网口dma而stm32cube直接生成的例程,http网页数据在网口发送dma描述符里的地址开头是0x08,也就是说给到dma的数据地址是在flash里而我尝试在lwip的TCP_Write函数中给一个TCP_WRITE_FLAG_COPY参数,让TCP_write写数据的时候把写入的数据拷入新建的pbuf进行发送,网页就能顺利打开了所以目前所有的证据指向了:STM32的网口DMA只能从RAM中提取数据,如果从flash中取数据就会引起dma错误不知上述理解是否正确

    STM32F4 网口 DMA

    2023-02-13 1
  • 请教一下一个三极管推挽输出电路

    最近在给一个可调光的led驱动电源做控制器,挂个图吧LED调光电源输出可调的恒流信号,电源有2根调光信号线,一正一负,可以用0~10V调光,也可以用10V的PWM占空比调光,占空比低于8%电源就把输出断开,这样就能把灯关掉常理说单片机定时器输出3.3V的PWM,然后用三极管配合上拉电阻拉到10V就能输出这个10V的PWM了,类似下面这个实际测试工作良好,除了因为高电平是电阻拉出来的导致上升沿不是那么陡以外,其他功能正常,关灯也正常但是自己手欠了,想吧方波做漂亮点(上升沿下降沿都陡一点),于是想起了单片机IO用的pushpull输出,于是去网上找了找资料,搭了下面这个基于三极管的推挽输出电路然后问题就来了,输出波形到还可以,实际用示波器看了看电路的上升下降都不错。结果接上那个led电源就出事儿了,始终没办法把灯关掉,然后量了一下电路输出,发现单片机控制电路输出0V时,电路输出始终有一个500mV左右的电压在,把led电源去掉就没了。回去看了电源说明书发现电源这个调光信号线为了兼容外置电阻调光,内部好像有个恒流源在往外输出电流信号(越100uA,仿真图里的输出端的10K电阻就是为了模拟这个电流信号),结果这个信号加在我的电路输出端就出现这个500mV的电压了。自己以前没有这么倒着用过三极管,之前都是npn放下面驱动蜂鸣器,pnp放上面驱动数码管啥的,现在这个电路是npn在上pnp在下,通过仿真和定性分析,我大概能猜一下这个电路是怎么工作的,但是这个500mV的电压我搞不明白是怎么来的,三极管才吞进去100uA,饱和压降不应该有500mV这么高,看上去感觉像是下面这个PNP管CE极倒着用产生的。所以想请教一下大佬们,这个500mV的信号是怎么由三极管产生的,另外能减小这个电压不能,先在此谢过各位大佬,望不吝赐教。