本帖最后由 bruellyyang 于 2016-9-16 11:00 编辑
先介绍背景,自己有原子mini板,老师还有战舰版,大概学过一些,了解一些简单的外设,之前没有做过项目,C语言也不过关。中间半年多没有接触这些,工作之后基本上是从零开始。项目使用芯片是f205,这个芯片感觉用的人不是很多,但是工作上的要求,没有办法,硬着头皮上,在自己操作这个片子的时候遇到的问题及注意事项一一奉上,本人材学疏浅,如浪费大家时间还请包涵。
公司开发人员使用的iar,我喜欢keil。自己装了软件,建立工程就遇到问题,第一次到st官网找f2固件库,发现里面没有内核.c文件,但是iar的工程下面有,折腾了些时间还是相信st。
首先实现的是2*2矩阵按键。自己所有的参考都是以mini板为主,后来发现f2的gpio初始化和1系列的片子都不太一样;应该是st从2系列开始就升级了,2和4相似很多,开发2系列的不懂可以多参考参考4系列原子哥的例程。我矩阵按键参考的是
http://www.openedv.com/forum.php ... 8%D5%F3%B0%B4%BC%FC 自己的理解是: IO初始化可以不上下拉,外部拉为高电平,然后挨个管脚设置低,当按键按下的时候检测到低电平的时候,就是哪个按键了,不知道理解的对不对;理解不对的地方还请高手指教。
项目中需要一个编码器,是用手旋转的那种,可以顺时针、逆时针旋转,还可以按下。关于编码器,如果要使用芯片的编码器模式,就需要在硬件上先接好,具有编码器模式的是普通定时器的CH1、CH2和高级定时器,不管哪个定时器推荐使用ch1、ch2,有些硬件看着没问题,但是软件实现一直出问题,而且很难找,我就是被硬件坑了无数次;当然高手可以无视。编码器的资料论坛里有大神写的很详细,可以仔细参考。
串口,应该是很通用的了;项目中串口主要实现与迪文屏的通信问题,相对比较简单,但是对于一个什么都不会的人来说,遇到的任何小问题都不是小问题。还是那句话,确保硬件没问题再做软件,在过程中如果感觉软件没问题,但是结果就是不对,那就仔细检查硬件,我的板子由于虚焊,折腾好几天,最后找别人帮忙找出问题了。串口接收数据都是通过串口接收中断实现,可以将数据直接保存数组中,这样cpu就可以直接处理数据了,之前一直不懂,想的是将串口收到的数据通过dma传输到内核,还在论坛各种求助,也谢谢原子哥和坛友的解答。以后有机会再尝试使用dma。串口中断是一个字节一个字节接收的,每个字节后都以 结束,所以可以根据这个判断你接收完成没有。
spi,也是很常用的。我板子上3个spi都用到了。spi的初始化和4系列的片子差不多,在调试的时候,领导让我将片选设置成spi模式,说我用io口实现的根本不对,为此还跟他扯皮了下。后来在网上查片选设置成spi模式根本就不稳定,会出很多问题。我想这也是原子哥和很多大神都不使用硬件的原因吧。spi3有一些特殊之处,因为spi3和jtag的一些管脚是一起的,所以如果想要在线仿真的话,spi3肯定不行,需要复用到其他引脚。但是如果用的是sw模式,那就正常使用,一样很6666 。我spi1连接的是eeprom,spi2控制另一个板子,spi3实现网口的控制。
前几天刚把网口实现,用的芯片是w5100,不得说这个芯片比原子哥开发板上使用的简单,也不需要移植那么多代码。我也在这个芯片上花费了很多时间,问题解决到最后发现又是硬件的问题,同事做的电路板有问题,还天天说我行不行啊,简直了,在此发个牢骚,不喜勿喷。如果有使用w5100、w5200、w5500啥的,可以跟帖交流。
最后在说下,下面要做的是USB,实现功能是串口,期待顺利,有问题我会随时记录在贴子里的,还希望各路大侠看到能指点一二,在下不尽感激。
基本上写了自己从一个很菜很菜的鸟,变成菜鸟的过程;中间经历的很多细节有些回想不起来了,以后想起慢慢补上。如果有技术类的交流欢迎跟贴,这是一个开源的平台,感谢原子哥,我问了很多白痴的问题,原子哥也亲自解答了;也感谢坛友的分享和解答,正值中秋,草草发这个贴子略表对原子哥和论坛的感谢,俗话说:爱出者爱返,福往者福来;原子哥的这个论坛帮助了很多人,希望论坛越来越好。
IO初始化可以不上下拉,外部拉为高电平,然后挨个管脚设置低,当按键按下的时候检测到低电平的时候,就是哪个按键了
——对的。
SPI的片选,我也很少用到CPU提供的管脚。倒不是CPU有问题,二是自己有需要。看具体情况了。
LZ对硬件有感触了。一个好的硬件,可以做到事半功倍。
我的PCB从来都要反复检查电路图和布线,改了又改,
每次拿到新的实验板,必定自己动手装配。
自己装配,目的有两个:一是发现错误或不妥,就复制老图到新的文件夹,立刻修改作为新版本;
二是比较放心、踏实,这在研发阶段很重要。
曾经有同事总喜欢让装配工去做,结果有次出问题查了十天,后来还是我帮忙,发现1K电阻误用了10K。
0808010102020303
0404050506060707,
8被提前了,而且每个数都重复了两遍,并且数据是分两次得到
/////////////主机程序/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
u16 datatemp=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
SPI2_Init ();
while (1)
{
delay_ms (1000);
for(datatemp =0;datatemp <8;datatemp ++)
SPI2_RECEIVE_Buffer [datatemp ] = SPI2_ReadWriteByte (0xff); //发送8次0xff,得到八次数据
for(datatemp =0;datatemp <8;datatemp ++)
printf ("%c",SPI2_RECEIVE_Buffer [datatemp ]);
printf(" ");
}
/////////////从机程序/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
u8 SPI2_TEXT_Buffer[]={1,2,3,4,5,6,7,8};
u8 SPI2_RESEIVE_Buffer[8]={0};
int main(void)
{
u16 datatemp=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
SPI2_Init ();
while(1)
{
while(SPI_I2S_GetFlagStatus( SPI2 , SPI_I2S_IT_RXNE )== RESET ); //等待接受寄存器非空
SPI2_RESEIVE_Buffer [datatemp]=SPI2->DR ;
while(SPI_I2S_GetFlagStatus (SPI2 ,SPI_I2S_IT_TXE )==RESET );//等待发送寄存器空
SPI2->DR =SPI2_TEXT_Buffer [datatemp ];
datatemp ++;
if(datatemp ==8)
datatemp =0;
}
}
0808010102020303
0404050506060707,你的这些值是怎么得到的,你用仿真看下 SPI2_RECEIVE_Buffer [datatemp ] 这个数组中的值,你的主机和从机分别是什么
那你就从出问题的地方分析
一周热门 更多>