6回答

0收藏

[原创] 【PSoC3心得】新手起步之软硬件

英飞凌 英飞凌 4684 人阅读 | 6 人回复 | 2012-10-30

本帖最后由 ming1006 于 2012-10-31 00:14 编辑

  收到PSoC3 FirstTouch STARTER KIT已经一个多礼拜了,因为上礼拜一直挺忙的,所以没怎么学习,这几天把学习的一些心得分享下。感觉接触这个板子遇到的最大问题是来自于对整个开发环境和开发流程的不熟悉。一开始就因为安装问题,版本问题浪费了好多时间。关于软件安装和版本问题我会等以后对于这些问题有进一步理解和解决办法后再发帖分享自己的心得,这里我主要简单地介绍一下PSoC的开发环境,并通过新建一个简单的跑马灯程序从硬件和软件两个方面介绍PSoC的开发流程。
硬件篇
  首先打开PSoC Creator 2.0, 在主界面菜单下,选择File->New->Project,弹出如下对话框,选择Empty PSoC3 Design,输入名字和工程保存路径(PSoC Creator 2.0会自动创建一个和工程名一样的文件夹来存放所有工程文件)后,点击advanced前的展开图标可以看到一些更为高级的设置,如每次创建一个新工程时是创建一个新的工作空间还是用之前的工作空间,以及器件型号的选择等。这里大家要看下自己开发板上芯片的型号,并进行相应的选择,我选的是CY8C3866AXI-040ES2(如果用的是爱板网送的PSoC3 FirstTouch STARTER KIT,那应该芯片型号都是这个)。
                              

  点OK后,界面变成了下面的样子。
                       

  可以看到左边工作空间生成了几个文件,其中LED_RUN.cysch是原理图文件,是用来进行硬件的电路设计;LED_RUN.cydwr是资源文件,可以查看和配置系统的硬件资源,如进行系统时钟的配置,逻辑引脚到硬件引脚的映射等;再往下的头文件和源文件了。右边是器件库列表,可以用来添加各种注解符号annotation(电阻,二极管,开关,电机等,这些器件不是真实的,只是注解,你要自己在外部硬件上连接)和cypress芯片内部资源的IP核(IO口,DMA,LCD控制模块等,这些器件可以和芯片上的真实器件一一映射。拖动相应器件到中间的原理图中即可进行电路的设计,对原理图中的器件双击可以对其进行配置。在注解符号库Annotation的Passive分类下找到电阻Resister,Diode分类下找到LED,Power分类下找到地Ground。在CepressIP器件库的Ports and Pins分类下找到数字输出IO口Digital Output Pin。按照下面图片连接好电路(之所以用了两个IO口是因为开发板上的LED实际上是连接到了两个不同的端口P2和P4),并双击器件和导线进行配置和注释。
                  

  LED_L和LED_H的配置如下:                                                                          

  引脚数都设置为4,勾选Show Annotation Terminal表示后面将要连接虚拟器件,勾选Display as Bus,这样四个引脚将在原理图上以总线方式出现。
  电阻的配置主要是将value及阻值改为100.
  对于8个电阻上面的一小段连线要给它们添加索引,配置如下:
                             

  记住,因为两组IO口都分别作为总线,所以两组导线的索引都要从0开始。
  连接好后,双击工作空间的LED_RUN.cydwr。在打开的资源界面右边将相应的逻辑IO口映射到真实的IO口(LED_H对应P2[3:0],LED_L对应P4[3:0]),点击菜单栏的Build->Build LED_RUN,没有出现错误即完成了硬件的设计。
                       

软件篇
  点击Build LED_RUN之后,我们可以看到左边工作空间又生成了一个新文件夹Generated_Source。
                           

  Generated_Source的子文件夹PSoC下又分成了三个文件夹,分别是包含和PSoC启动相关文件的cy_boot,以及和该工程添加的两组IO口相关的文件夹LED_H和LED_L。我们在该工程中添加了两个IP核,当编译工程后PSoC Creator 2.0就自动帮我们生成了有关于这连个IP核的API函数。打开LED_L.h,我们可以看到头文件中提供了众多关于IP核读写等操作的函数以及相应寄存器的宏定义。
   

  LED_L_Write(uint8 value)和LED_L_Read(void)函数分别提供对引脚的写和读;LED_L_PS是引脚状态寄存器,LED_L_DR是引脚的数据寄存器。也就是说我们只要调用相应的函数或对相应的寄存器进行操作就可以实现相应的功能。
  下面我们再打开源文件LED_L.c,看看LED_L_Write函数是如何实现的。
                              

  找到LED_L_Write函数,可以看到系统已经帮我们进行了详细的注释。函数中用到的宏定义LED_L_DR,LED_L_MASK和LED_L_SHIFT在LED_L.h文件中都有宏定义,分别对应到了LED_L__DR,LED_L__MASK和LED_L__SHIFT.他们的具体值又是什么呢?我们可以用快捷键CTL+F来进行查找或直接打开cyfiltter.h文件,这个文件有关于IP核API函数的具体宏定义。
                              

  我们可以看到LED_L__MASK为0x0F,即LED_L为P口的低四位,LED_L__SHIFT为0,是引脚相对P口的偏移量。LED_L__DR对应的是CYREG_PRT2_DR,我们可以再次使用查找功能或打开cydevice_trm.h可以看到CYREG_PRT2_DR的宏定义0x00005120.查阅芯片的datasheet我们可以发现这个地址正是CY8C3866AXI-040ES2特殊功能寄存器SFR中P2口的数据寄存器的地址。
                           

  我们可以再回到LED_L_Write函数中,可以看出第一句 staticBits = LED_L_DR & ~LED_L_MASK;将要写的四个引脚先清零了,其他引脚状态保留到staticBits的高四位上,第二句LED_L_DR = staticBits | ((value << LED_L_SHIFT) & LED_L_MASK);将待写数据移到数据对应位后与staticBits相或之后再写到P2的数据寄存器中,这样就实现了P2口低四位LED_L的写操作。
  在主函数中加入下面代码
  1. void main()
  2. {
  3. /* Place your initialization/startup code here (e.g. MyInst_Start()) */

  4. uint8 i = 1;

  5. /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
  6. for(;;)
  7. {
  8. /* Place your application code here. */

  9. //LED_H_Write(~(0x08 >> i));
  10. LED_L_DR = (~(0x08 >> i));
  11. //LED_L_Write(~(0x01 << i));
  12. LED_H_DR = (~(0x01 << i));
  13. i++;
  14. if(i > 3)
  15. i = 0;

  16. CyDelay(200);
  17. }
  18. }
复制代码
上面的函数实现了直接操作寄存器和使用系统自动生成的API函数(被注释掉的两句)两种方法的简单跑马灯程序。
  以上心得主要是帮助新手从硬件和软件两方面来快速入门。因为自己也是第一次接触PSoC,很多地方都不熟悉,碰到了好多问题,希望自己的经验能让后学者少走弯路。下面是完整的工程文件
LED_RUN.zip (1.73 MB, 下载次数: 30)

未命名7.jpg (41.68 KB, 下载次数: 32)

未命名7.jpg

未命名11.jpg (64.12 KB, 下载次数: 33)

未命名11.jpg
分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

ming1006

发表于 2012-10-31 22:15:42 | 只看该作者

写得蛮辛苦的,自己顶下
板凳

jlj8315292

发表于 2012-11-1 01:43:46 | 只看该作者

不错哦,顶一个,期待后续!
地板

w932443004

发表于 2012-11-1 08:18:37 | 只看该作者

不错不错 顶下!
5#

ming1006

发表于 2012-11-1 11:22:38 | 只看该作者

jlj8315292 发表于 2012-11-1 01:43
不错哦,顶一个,期待后续!

谢谢,最近会加紧学习,多写点心得的
6#

ming1006

发表于 2012-11-1 11:23:24 | 只看该作者

wangku001wei 发表于 2012-11-1 08:18
不错不错 顶下!

谢了
7#

ming1006

发表于 2012-11-16 11:48:16 | 只看该作者

ht868788 发表于 2012-11-16 11:38
寻根溯源能力很强啊,这种思维方式很好,要追究到底层代码,难怪我总是一知半解,学习了!期待LZ再发一些类 ...

其实只要用搜索功能,慢慢一级一级往下找就可以知道API函数的实现了
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条