WS2812是个在国外开源网站上很流行的自带控制器的三色灯,在Sparkfun和Adafruit上有很多这个灯做的阵列,可以实现很酷炫的效果。这次准备用12个2812做个灯圈用来作交互,用一种单线通讯协议,用高低电平脉冲宽度来区分0和1,可能我孤陋寡闻,反正是没在别的地方见过,网上找了找STM32上一般有两种实现方式,一种是靠SPI来模拟,一种是DMA。
原理简单来说就是靠1的多少来实现不同的脉冲宽度,用一个byte的数据来实现一个0或者1。因为脉冲宽度有严格的时间限制,所以SPI的频率也得控制在一个区间内。这样用是能用,但是坑也不少。1.得牺牲一部分主频,配了半天的始终prescaler,最后把主频从180降到了144才得到了需要的spi频率2.它依靠一定时间长度的低电平来区分frame,但是spi的idel是高电平,得在frame前后加入0来实现reset。
1、STM32的IO口配置为推挽输出怎么是低电平
推挽输出并不是一种电平,而是一种电压输出方式。你设置完输出方式后要执行一下输出电平才行。比如你初始化完成后,加一句GPIO_ResetBits(GPIOC,GPIO_Pin_6);就把引脚PC6输出低电平了(这里只是举个例子,你需要把端口和引脚改为你自己的)。
2、stm32proteus仿真使pa1口为高电平实际仿真为什么任为低电平
说句老实话,你的项目真的太乱了,GPIO的操作是正确的,问题只有可能是配置问题,一般的话main函数尾部你加一条语句“while(1);”,表示死循环,一般单片机没有操作系统不用返回值,就要加while(1);死循环,还有你的头文件包含错误了,要包含stm32f10x_conf.h,具体你可以看一眼这个文件,你就知道为什么要包含这个文件了,再者就是你的项目创建,我建议你去百度一个标准的创建项目的模板,项目要有条理,这是必须的,至少要和我的项目结构差不多。
3、stm32读取gpio高低电平速度
STM32读取GPIO高低电平的速度受到许多因素的影响,包括GPIO口的数目、开启的时钟频率、中断设置和外设的负载等。一些实用的技巧可以用来提高GPIO读取速度:1.确保GPIO口的外设时钟已经开启并且合适速度的外设时钟被选择。2.最好使用IVC方式设置GPIO口。使用IVC可以加快GPIO端口的读取速度。芯片的文档,ClocksourcesforSTM32devices也可以解释这个问题。
中断方式和DMA方式都比轮询方式更快。其中,DMA方式的速度更快,因为它利用DMA通道转移数据,芯片的中断服务程序不需要频繁地去读取GPIO口,4.将GPIO口的中断优先级设置较低。因为如果中断优先级过高,当有多个GPIO口发生中断时,系统的优先级切换会变得非常频繁,会降低整体读取速度,5.待检查的GPIO口的数量尽可能少。