OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3438|回复: 11

自己项目F2芯片,特来回馈原子哥和论坛

[复制链接]

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
发表于 2016-9-16 10:56:32 | 显示全部楼层 |阅读模式
本帖最后由 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。串口中断是一个字节一个字节接收的,每个字节后都以\0结束,所以可以根据这个判断你接收完成没有。

spi,也是很常用的。我板子上3个spi都用到了。spi的初始化和4系列的片子差不多,在调试的时候,领导让我将片选设置成spi模式,说我用io口实现的根本不对,为此还跟他扯皮了下。后来在网上查片选设置成spi模式根本就不稳定,会出很多问题。我想这也是原子哥和很多大神都不使用硬件的原因吧。spi3有一些特殊之处,因为spi3和jtag的一些管脚是一起的,所以如果想要在线仿真的话,spi3肯定不行,需要复用到其他引脚。但是如果用的是sw模式,那就正常使用,一样很6666 。我spi1连接的是eeprom,spi2控制另一个板子,spi3实现网口的控制。

前几天刚把网口实现,用的芯片是w5100,不得说这个芯片比原子哥开发板上使用的简单,也不需要移植那么多代码。我也在这个芯片上花费了很多时间,问题解决到最后发现又是硬件的问题,同事做的电路板有问题,还天天说我行不行啊,简直了,在此发个牢骚,不喜勿喷。如果有使用w5100、w5200、w5500啥的,可以跟帖交流。

最后在说下,下面要做的是USB,实现功能是串口,期待顺利,有问题我会随时记录在贴子里的,还希望各路大侠看到能指点一二,在下不尽感激。

基本上写了自己从一个很菜很菜的鸟,变成菜鸟的过程;中间经历的很多细节有些回想不起来了,以后想起慢慢补上。如果有技术类的交流欢迎跟贴,这是一个开源的平台,感谢原子哥,我问了很多白痴的问题,原子哥也亲自解答了;也感谢坛友的分享和解答,正值中秋,草草发这个贴子略表对原子哥和论坛的感谢,俗话说:爱出者爱返,福往者福来;原子哥的这个论坛帮助了很多人,希望论坛越来越好。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-9-16 11:24:59 | 显示全部楼层
本帖最后由 xuande 于 2016-9-16 11:31 编辑

IO初始化可以不上下拉,外部拉为高电平,然后挨个管脚设置低,当按键按下的时候检测到低电平的时候,就是哪个按键了
——对的。

SPI的片选,我也很少用到CPU提供的管脚。倒不是CPU有问题,二是自己有需要。看具体情况了。

LZ对硬件有感触了。一个好的硬件,可以做到事半功倍。
我的PCB从来都要反复检查电路图和布线,改了又改,
每次拿到新的实验板,必定自己动手装配。

自己装配,目的有两个:一是发现错误或不妥,就复制老图到新的文件夹,立刻修改作为新版本;
二是比较放心、踏实,这在研发阶段很重要。
   曾经有同事总喜欢让装配工去做,结果有次出问题查了十天,后来还是我帮忙,发现1K电阻误用了10K。



回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2016-8-2
在线时间
12 小时
发表于 2016-9-16 11:26:14 | 显示全部楼层
沙发
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2016-9-8
在线时间
4 小时
发表于 2016-9-16 21:34:20 | 显示全部楼层
哥,我用spi进行双机通信,可以返回数据不对,我用主机发0xff,激发从机回信,从机从数组【1,2,3,4,5,6,7,8】中,但接收到的信息为  
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("\r\n\r\n");
                  
        }
/////////////从机程序/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  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;
                }
}
       
回复 支持 反对

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
 楼主| 发表于 2016-9-17 10:33:10 | 显示全部楼层
本帖最后由 bruellyyang 于 2016-9-17 10:35 编辑
cuidashen 发表于 2016-9-16 21:34
哥,我用spi进行双机通信,可以返回数据不对,我用主机发0xff,激发从机回信,从机从数组【1,2,3,4,5, ...

0808010102020303

0404050506060707,你的这些值是怎么得到的,你用仿真看下 SPI2_RECEIVE_Buffer [datatemp ] 这个数组中的值,你的主机和从机分别是什么
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2016-9-8
在线时间
4 小时
发表于 2016-9-17 14:24:23 | 显示全部楼层
两个单片机通信,我每次单步都出毛病,
回复 支持 反对

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
 楼主| 发表于 2016-9-17 18:20:03 | 显示全部楼层
cuidashen 发表于 2016-9-17 14:24
两个单片机通信,我每次单步都出毛病,

那你就从出问题的地方分析
回复 支持 反对

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
 楼主| 发表于 2016-12-12 13:48:50 | 显示全部楼层
现在项目做完了,特来回最后一贴。用到的资源上面都提了,当时调试usb的时候是可以用的,但是在后来整机联调的时候发现usart1的tx上一直有东西,用示波器抓出来是一堆乱码,因为根本不是我发送的数据,也一直没搞清楚怎么回事,后来发帖求助原子哥,他说usart1和usb完全不相干。那为什么会出现这个情况,最后在网上找资料,发现usb的Vbus管脚即便设置成输入还是会影响到usart1的tx。这个不是配置的问题,是st的问题,不知道大家有没有遇到这个问题,如果不用USB电平检测的话,不会出现这个问题。

自己的第一个项目,做的磕磕绊绊,但是得益于论坛,最后特把代码奉上,写的不好,请见谅,有问题可以交流啊。
回复 支持 反对

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
 楼主| 发表于 2016-12-12 13:52:55 | 显示全部楼层
w5100部分代码,我用的是client tcp模式
[mw_shl_code=c,true]void W5100_Socket_Set(void)
{
  if(S0_State==0)//&#182;&#203;&#191;ú03&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;
  {
    if(S0_Mode==TCP_SERVER)//TCP·t&#206;&#241;&#198;÷&#196;£ê&#189;
    {
                        if(Socket_Listen(0)==TRUE)
                                S0_State=S_INIT;      //3&#245;ê&#188;&#187;ˉíê3é
                        else
                                S0_State=0;
    }
    else if(S0_Mode==TCP_CLIENT)//TCP&#191;í&#187;§&#182;&#203;&#196;£ê&#189;
    {
                        if(Socket_Connect(0)==TRUE)
                                S0_State=S_INIT;
                        else
                                S0_State=0;
    }
    else//UDP&#196;£ê&#189;
    {
        //if(Socket_UDP(0)==TRUE)
                //S0_State=S_INIT|S_CONN;
        //else
                //S0_State=0;
    }
  }
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
 楼主| 发表于 2016-12-12 13:55:59 | 显示全部楼层
代码有点乱,传上来更乱。我做的是程控电流分析仪的控制板部分,有需要的可以回帖,需要哪部分我贴代码上来
回复 支持 反对

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
 楼主| 发表于 2016-12-12 14:36:29 | 显示全部楼层
本帖最后由 bruellyyang 于 2016-12-23 15:04 编辑

现在想尝试用spi的dma传输,如果我要接收miso上的数据,而stm32的spi设置成主。

回复 支持 反对

使用道具 举报

8

主题

136

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
85 小时
 楼主| 发表于 2017-1-9 14:53:31 | 显示全部楼层
代码写的不好,精简了下穿上来,有需要的可以看下互相交流

Control.rar

704.81 KB, 下载次数: 112

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 06:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表