STM32F407乘,除,开方时间实验、 2013 06 01 fluke示波器 主时钟120M,每周期8.3ns @@@@实验程序如下:@@@@@@ float ta=3.14f; float te; while(1) { OSTimeDlyHMSM(0,0,0,300);//300ms 延时 ta*=PI; CPU_IntDis();//禁止中断 GPIO_SetBits(GPIOD,GPIO_Pin_11);//io置1 ta=ta*ta;//乘法 ta=ta*ta; ta=ta*ta; ta=ta*ta;//共100个 。 。 。 GPIO_ResetBits(GPIOD,GPIO_Pin_11);//io置0 ta=ta/PI;//除法 ta=ta/PI; ta=ta/PI; 。 。 。//100个 GPIO_SetBits(GPIOD,GPIO_Pin_11);//io置1 ta=SQRT(ta);//开方 ta=SQRT(ta); ta=SQRT(ta); ta=SQRT(ta); 。 。 。//100个 GPIO_ResetBits(GPIOD,GPIO_Pin_11);//io置0 CPU_IntEn();//开中断 @@@@@实验结果@@@@@@@@ ★★ 100个乘 6.4us,每个64ns。 一个乘法汇编如下: 共5个周期,理论上时间是(120m主频):41ns/每个 每个与实际差23ns 0x08006B8E ED9D0A01 VLDR s0,[sp,#0x04]------------2个周期 0x08006B92 EE200A00 VMUL.F32 s0,s0,s0-----------------1个 0x08006B96 ED8D0A01 VSTR s0,[sp,#0x04]------------2个 ★★ 100个除 18.4us 每个184ns。 共20个周期,理论上时间是:166ns, 与乘法相比,每个差22ns 0x08007066 ED9D0A01 VLDR s0,[sp,#0x04]--------2个周期 0x0800706A ED5F0A50 VLDR s1,[pc,#-0x140]------2 0x0800706E EE801A20 VDIV.F32 s2,s0,s1-------------14 0x08007072 ED8D1A01 VSTR s2,[sp,#0x04]--------2 ★★ 100个开方,16us,每个160ns。 共18个周期,理论上150ns,差10ns 与除相比差16ns,正好符合2个周期时间。 0x0800772A EDDD0A01 VLDR s1,[sp,#0x04]-------2 0x0800772E EEB10AE0 VSQRT.F32 s0,s1---------------14 0x08007732 ED8D0A01 VSTR s0,[sp,#0x04]-------2 100个sin库函数,79.2us,每个792ns,0.792us。可以。 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 忘了是4系列还是1系列的了。 ADC上电延迟一段时间后(tSTAB ),再次设置ADON位时开始进行转换 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生 成组转换:在任意多个通道上以任意顺序进行的一系列转换. 有16个多路通道。可以把转换组织成两组:规则组和注入组 规则通道:选择的,可以选择所有的16个通道都为规则通道,然后进行规则转换。 注入通道:选择的,可以选择4个通道为注入组。 单次转换 模式下,ADC只执行一次转换。可以软件触发也可以事件触发。转换完adc停止。该中断中断。注入通道只能被事件触发。规则通道既可以事件触发也可以软件触发。 连续转换模式 我理解为连续的对单一选定通道进行转换。即单次转换+不停止adc。 这还不是扫描模式。 扫描模式:用来扫描一组模拟通道 扫描模式 扫描所有被ADC_SQRX寄存器(对规则通道) 或 ADC_JSQR(对注入通道)选中的所有通道。 或 也就是说二选一。在每个组的每个通道上执行单次转换。在每个转换结束时,同一组的下一个通道被自动转换。如果设置了CONT位,转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。 即 如果继续位(CONT)被选中,那么整个组是连续转换模式。 但组内还是扫描模式。 如果设置了DMA位,在每次EOC后,DMA控制器把规则组通道的转换数据传输到SRAM中。 而注入通道转换的数据总是存储在ADC_JDRx寄存器中。 每次EOC是指单次转换,也就是组内的单个通道转换完成后。 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 CAN接口心得 1,线上有问题,又开启了自动重发,当发送计数器达到128时,发送计数器就不加了,发送错误标志被置位。但当总线恢复的时候,can口就 死了--即发布出去也不能接收。不开启自动重发的话,总线恢复之后,收发是正常的 2,接上所述,当正常的时候,只发送还是不会使can口脱离被动错误状态,因为此时接收错误计数器被莫名其妙的被服了一个249。此时如果 再接收一个can帧的话,接收计数器马上变为小于127的数,此时can口脱离的被动错误状态 3,大容量的stm32的can接收和发送用的是和usb参合在一起的那两个函数,而错误故障等的中断在cos什么的中断函数里。 4,滤波器,不使能一个滤波值为0的滤波器的话,接收还真不能用! 5,心得:被动报错节点是 以为以前出的错都是自己引起的,所以再发现错误的时候,就不主动报错,如果别人证实了错误(别人的主动错误)那么自己会发一个被动错误标志,否则他会认为总线没有错。等到自己的错误累加到一定程度的时候,自己就掉线了。主动错误是发现错误后主动的告诉别人有错误了。该重发的重发,dnet的规定就dnet的规定。当处于离线的节点在一定的条件下会自动上线。当然这是can总线里定义的,器协议芯片可能不按照此作。 |
STM32F407 定时器触发DMA 求助大神
【MCU实战经验】基于STM32F407的音频播放器设计
盘古UE-STM32F407工控板原理图
【STM32F429心得\疑问】+STM32F4之FSMC和FMC
STM32F429读取IO口传输的数据速率
STM32F407ZGT6 手摸芯片背部重启
STM32F4 SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控
STM32F401RE NUCLEO求助,串口一直不能进中断
读取STM32F407内部温度传感器值错误
STM32F429多路内部ADC独立采集的办法
RE:【MCU实战经验】+STM32F407乘,除,开方时间实验
感谢楼主分享。请教一个问题,cmsis里有q15格式的加法减法乘法,没有除法。如何进行除法?我打算用stm32f103进行q15格式数据计算。是直接用 “/” 进行除法,让编译器自己处理?