donatello
获得 765 次赞
帮助过2489人
这几天开始研究f429探索者开发板自带的外设,初步调通了板载tft彩屏和sdram,tft彩屏花了我两天时间进行官方例程拆解,而sdram则用了半天就搞定了。对于这几天的研究,我发现了个有趣的规律,tft彩屏和sdram都是板载外设,两者相比sdram更实用,用途更广泛,对板子接口要求更多,因为高级的开发板才有sdram,而tft彩屏的上述特点都与sdram相反,而研究耗费的时间却更多。
之前做的adc1_dma实验出现数据跳动的严重错误,经过询问群里的大神后得出原因,原来是跟dma的外设数据流格式和内存数据流格式有关,之前的实验中外设和内存的数据流格式均为一个字节,即8位(半字),而实际上adc的值应为int型(16位,两个字节,全字),若用一字节格式存储adc的值,当值大于255时是会溢出的,溢出则数据重新归零,所以之前的实验,我在调节电位器旋钮的时候,数据会出现归零跳动,原因就是数据溢出,现在把外设和内存的数据流格式都调整为完整的全字(16位)之后,没有再出现数据归零跳动的现象。至于只改外设的数据格式或是只改内存数据格式还是两个都改,我都试过,结果是一样的,不过为了程序规范,还是统一都改最好。除此以外,adc使用dma通道时必须开启连续模式,不然得出结果仍与实际不符。
之前在nucleof412开发板上面完成了adc+pwmdac的实验,现在将这个实验移植到f429探索者板子上并进行进阶,跟上次的串口dma实验一样给adc1开启dma通道,使cpu不再全权负责adc采集工作,节省cpu的占用,这点在以后使用实时操作系统时非常重要,因为cpu在处理操作系统内核和调度多道程序的繁重工作中已经被占用掉一部分资源,如果还要在外设上花费资源,那么cpu就可能要罢工了。不过由于本人知识水平有限,运用了dma的adc存在bug,原因未知,因此无法修复,该bug的现象为adc通过dma通道采集时数据会发生跳动。希望论坛里调试过dma_adc的大神一起交流。
stm32f429disco,下文简称f429探索者,是stm32官方推出的三大开发板(nucleo,disco,eval,外设从少到多)之中较为面向个人用户实际程序开发的开发板(个人认为nucleo偏向于个人用户产品原型开发,eval偏向于企业用户专业评估开发,其中最贵的是eval评估板)。这块f429探索者的特点是带了一个接在fsmc总线的lcd彩屏以及同样挂在fsmc总线上的sram(静态内存) is42s16400,这些都是高端的外设啊!
这次我们来试试每个单片机都有的adc和dac,stm32的adc的功能是非常强大的,首先通道数多达十几条,可以同时进行十几个设备的adc工作;其次精度达到12位(听说f3系列的位数更高,有十六位,具体多少位我也没仔细查过)。由于hal库的硬件adc十分完善,对stm32家族各个型号的支持也非常到位,因此在书写adc程序时并没有遇到阻碍。这里我选择的adc通道为pa0,使用杜邦线与电位器连接。
at24cxx系列是atmel公司研发的iic总线通信的eeprom(电子可擦除存储器),xx的数字代表单元格数量,以今天用到的at24c512为例子,at24c512有512kb个单元格,即64kb个,即可以存储65535个字节的数据,因此地址空间是0x0000到0xffff。at24cxx每个单元都可以存储一个字节的数据,可以擦除十万次,默认数据是0xff,可以编程为0x00~0xff中的任意一个数据。eeprom的优点是擦除寿命长,写入读出快,缺点是容量小,因此适用于少量频繁更新的数据(如传感器检测数据,临时变量)等的存储。
上次用彩屏显示rtc时钟及实时温度,这次试试做点同样具有实用性的气压和电子罗盘方向显示,这个做起来比显示rtc时钟及实时温度更要难一点,因为这些传感器都要考虑到检测时间及转换精度的问题。今天所用的气压传感器为村田zpa2326传感器,所用的电子罗盘为hmc5883l传感器,这两个传感器的共同特点1.都是iic总线通信 2.都需要发送检测命令才会开始进行检测工作。 录入字模及调用函数都与之前的帖子不变,不同的地方在于程序给这两个iic器件都新建了独立的头文件,这两个头文件对于管脚的设置是不同的,也就是说这两个iic器件并不共用时钟线和数据线,这样做虽然没有充分利用iic通信特点共用总线的优势,但是好处是减少了干扰,减少了上拉压力,在stm32这种管脚多的单片机上面用这种方法并无不妥。
上次用彩屏刷了静态的bmp位图和汉字,这次试试做点实用性更高的实时时钟和实时温度显示。其实这个做起来比刷bmp位图更简单,只需要几个步骤: 1.使用取模软件录入阿拉伯数字和部分符号如/和:的字模码; 2.将字模码排好序放到const数组中,编写调用函数(可以先尝试在屏幕中间显示一行0123456789) 3.在主循环或者定时器中断中检测温度和日历数据,存入变量中 4.以变量为实参传入字模调用函数中,达到显示变量的目的