跳转到内容

嵌入式系统/赛普拉斯PSoC微控制器

来自维基教科书,开放世界中的开放书籍

赛普拉斯PSoC微控制器与所有微处理器一样,也有其自身的怪癖。

如果您无法弄清楚某些内容,并且本常见问题解答无济于事,请访问以下论坛:

是一个良好的起点。

用户文档

[编辑 | 编辑源代码]

赛普拉斯PSoC常见问题解答

[编辑 | 编辑源代码]

(如果我勾勒出的答案不正确,请*更正*它们)。

使用哪个PSoC

[编辑 | 编辑源代码]

有些人建议爱好者使用DIP封装中可用的大型且功能最强大的芯片——截至2008年9月,即CY8C29466 28-DIP。

CY8C29466 28-DIP——与CY8C29466 28-SSOP或28-SOIC相同芯片,类似于CY8C29566 44-TQFP、CY8C29666 48-SSOP或48-QFN,以及CY8C29866 100TQFP。除了封装外,差异在于I/O引脚的数量。这些器件具有比任何其他PSoC(除了27xxx系列具有相同数量的模拟块)更多的Flash(32 KByte Flash)和更多的RAM(2 KByte RAM)以及更多的数字块(16)和更多的模拟块(12)。

CY8C27143 8-DIP:比任何8引脚PSoC具有更多的Flash(16 KByte Flash)和更多的数字块(8)以及更多的模拟块(12),并且具有同样多的RAM(256字节)。

CY8CNP102:尚未上市(截至2008年9月),但预计将拥有256 KByte非易失性存储器和2 KByte RAM。

(类似于嵌入式系统/PIC微控制器#使用哪个PIC

许多PSoC开发板的价格都低于100美元。其中包括

其他常见问题解答

[编辑 | 编辑源代码]

问:它不工作!
答:您是否查看了"软件清单:使用PSoC的技巧",作者Zlatko Saravanja,2004年?使用PSoC的技巧PSoC(R)技术参考手册(TRM)"PSoC入门(首先阅读本指南) - AN2010"

问:我在尝试使用PSoC MiniProg编程CY8C26443时遇到问题。
答:MiniProgrammer不支持25/26系列。您必须使用ICE-4000或ICE-cube。或者切换到MiniProg支持的芯片,例如27/29系列。[待办事项:列出芯片,并用“Y -- 已知可与MiniProg一起使用”,“N -- 不支持MiniProg”或“? -- 未知”标记每个芯片]。 http://www.psocdeveloper.com/forums/viewtopic.php?t=2057 http://www.psocdeveloper.com/forums/viewtopic.php?t=2022(我们应该将此改为表格,包含各种编程器——m8cprogs开源硬件、MiniProg、ICE-cube等与各种芯片的对比)。

中断处理程序

[编辑 | 编辑源代码]

问:如何在C语言中编写中断处理程序?
答:请参阅[1] "软件清单:使用PSoC的技巧"。此外,在PSoC IDE中,选择“帮助”>“文档”,然后选择"C语言编译器用户指南"。更多讨论:http://www.psocdeveloper.com/forums/viewtopic.php?t=2089 和“使用PSoC的技巧”http://www.psocdeveloper.com/old/index.php?page=8&mode=article&k=11 http://www.psocdeveloper.com/forums/viewtopic.php?t=1902 http://www.psocdeveloper.com/forums/viewtopic.php?t=2102 http://www.psocdeveloper.com/forums/viewtopic.php?t=2099 http://www.psocdeveloper.com/forums/viewtopic.php?t=2089

警告:区域“myproject_RAM”未定义

[编辑 | 编辑源代码]

问:我收到以下消息:

警告:区域“myproject_RAM”在启动文件“./obj/boot.o”中未定义,并且
没有链接时地址。

如何消除该警告?
答:(来自http://www.psocdeveloper.com/forums/viewtopic.php?t=1761)打开boot.tpl。最后,您将看到在RAM中定义的许多区域。在现有的RAM区域声明下方、AREA bss声明上方添加以下行:AREA myproject_RAM (RAM, REL, CON) 然后保存boot.tpl文件并选择“配置”>“生成应用程序”。

查找表

[编辑 | 编辑源代码]

问:如何在汇编语言中创建查找表?
答:请参阅http://www.psocdeveloper.com/old/index.php?page=8&mode=article&k=10(嗯……您是否还需要在该表期间禁用“代码压缩”?)

注意事项

[编辑 | 编辑源代码]

问:我需要注意哪些注意事项?
答:“使用PSoC的技巧”http://www.psocdeveloper.com/old/index.php?page=8&mode=article&k=11

模拟器和其他编程语言

[编辑 | 编辑源代码]

问:除了(免费的)PSoC Designer 和 ImageCraft PSoC C 编译器,还有哪些其他选择? (因为它们还没有移植到 Linux)
A1: m8cutils: http://m8cutils.sourceforge.net/ Werner 正在为 Linux 开发一个汇编器、一个模拟器和一个编程器 [2] [3] http://www.psocdeveloper.com/forums/viewtopic.php?t=1616
A2: Forth/PSoC Forth: Christopher Burns 写了一个 PSoC Forth。源代码可在 http://www.psocdeveloper.com/tools/misc_dev_tools/ 获取。截至 2007 年,David Cary 正在 Forth/PSoC Forth 上维护它(之前是:http://forthfreak.net/index.cgi?M8cForth)。这个 Forth 编译器可以在 Linux、Mac、Windows、Solaris、Palm 甚至 VT-100 哑终端上运行。

I/O 引脚

[edit | edit source]

问:如何将输出引脚设置为高电平和低电平?
A:通常将输出引脚连接到某些数字“模块”(例如 PWM 模块)。如果没有任何“模块”可以实现你想要的功能,可以在软件中设置它们 - 请参阅 GPIO 参考 http://www.psocdeveloper.com/articles/fundamentals_of_psoc_gpio/、GPIO 读写示例项目 http://www.psocdeveloper.com/docs/example-project.html、GPIO 帮助 http://www.psocdeveloper.com/forums/viewtopic.php?t=83 http://www.psocdeveloper.com/forums/viewtopic.php?t=1950(警告:请注意,PRTxDR 寄存器是只写寄存器 - 你无法从该寄存器读取数据。如果你从 PRTxDR 地址读取数据,你是在直接读取引脚上的值,这通常*不*是你刚刚写入的值。如果你错误地认为它们是一样的,你迟早会遇到读-改-写问题)。(警告:“你无法从主代码中读取配置为“从上次读取更改时中断”的端口,并且使 ISR 功能可靠地工作。” 请参阅 http://www.psocdeveloper.com/forums/viewtopic.php?t=2094)。“如何设置单个端口引脚?” http://www.cypress.com/portal/server.pt/gateway/PTARGS_0_652034_739_205_211_43/http%3B/sjapp20/cf_apps/design_supports/forums/messageview.cfm?catid=3&threadid=18055 PSoC I/O 引脚-端口配置 - AN2094 http://www.cypress.com/portal/server.pt?space=CommunityPage&control=SetCommunity&CommunityID=285&PageID=552&shortlink=DA_240474 “Zee 先生的 GPIO 简介”,“GPIO 的基本原理” by mrzee http://www.psocdeveloper.com/forums/viewtopic.php?t=2058 http://www.psocdeveloper.com/forums/viewtopic.php?t=1667

问:对于不使用的引脚,应该怎么办? A:不用管它们。Designer 默认会将它们置于高阻抗模式。即使悬空,它们也能正常工作。如果真的让你困扰,可以将它们设置为上拉或下拉。

问:XRES 应该连接到... 什么?
A:虽然它有一个内部下拉电阻,但最好通过一个 470,1K,... 欧姆电阻将它连接到地。

I/O 引脚

[edit | edit source]

问:如何读取单个数字输入引脚的状态?
A:通常将输入引脚连接到某些数字“模块”(例如计时器模块)。如果没有任何“模块”可以实现你想要的功能,可以在软件中设置它们 - 请参阅上一个问题中的 GPIO 参考。

中断

[edit | edit source]

问:如何设置一个数字输入引脚以触发中断? 在哪里放置处理该中断的代码?
A:??? http://www.psocdeveloper.com/forums/viewtopic.php?t=1586 “如何确定 GPIO 中断的来源” http://www.psocdeveloper.com/forums/viewtopic.php?t=1524

我到底需要多少字节的堆栈?

[edit | edit source]

问:我快用完 RAM 了 - 我到底*需要*多少字节的堆栈?
A:“stalkwalk” 实用程序执行静态堆栈分析 http://www.psocdeveloper.com/forums/viewtopic.php?t=9,提供一个保守的估计,说明需要多少字节。 (它还需要一些改进...)。

RS485

[edit | edit source]

问:如何将我的 PSoC 连接到 RS485 总线?
A1: http://www.psocdeveloper.com/forums/viewtopic.php?t=1640 提到了“第 9 位中断... 应用笔记 AN2269 “在 PSoC™ UART 上实现 9 位协议””。
A2: 半双工问题在 http://www.psocdeveloper.com/forums/viewtopic.php?t=1731 http://www.psocdeveloper.com/forums/viewtopic.php?t=2397 中讨论。

问:UART 不工作!我快要抓狂了!
A:请以问题的形式重新说明。

混合 C 和汇编语言

[edit | edit source]

问:如何从汇编中调用 C 函数?
A:在汇编中调用 C 函数时,可以在函数名前添加下划线。例如,如果你想从汇编中调用名为 foo() 的 C 函数,则可以使用

 call _foo

. 这适用于不带任何参数的 C 函数。如果你想调用带参数的函数,则需要在调用它之前将这些参数传递到堆栈中。参数从右到左、从 MSB 到 LSB 推入堆栈。例如:要调用的 C 函数

 void foo(WORD Arg1, WORD Arg2)

汇编代码

 mov A,[Arg2 MSB]
 push A
 mov A,[Arg2 LSB]
 push A
 mov A,[Arg1 MSB]
 push A
 mov A,[Arg1 LSB]
 push A
 xcall _foo
 add SP,-4

中断

[edit | edit source]

问:如何从汇编 ISR 中调用 C 函数?
A1:简单方法:使用 "#pragma interrupt_handler" 来标记 C 函数。在 ISR 端,LJUMP 到 C 函数(不用费心将任何内容推入堆栈)。请参考“如何用 C 编写中断处理程序?”问题的答案。使用 "#pragma interrupt_handler" 标记的 C 函数可以调用普通的 C 函数(以及普通的汇编函数) - 但普通的 C 函数*不能*调用任何使用 "#pragma interrupt_handler" 标记的 C 函数。

A2:如果你坚持你的汇编 ISR *必须*“调用”一个普通的 C 函数,那就比较棘手。

你需要注意保存和恢复 C 函数使用的虚拟寄存器。打开 .lst 文件并检查 C 函数使用的虚拟寄存器。例如,如果 C 函数 foo() 使用虚拟寄存器 __r0 和 __r1: (假设 void foo(void)。如果 foo 有参数,请参阅“如何从汇编中调用 C 函数?”)

 mov A,[__r0]
 push A
 mov A,[__r1]
 push A
 xcall _foo
 pop A
 mov [__r1],A
 pop A
 mov [__r0],A

除了保存和恢复虚拟寄存器外,还需要保存和恢复 A 和 X。如果你正在使用启用了 LMM 的程序,那么在调用 C 函数之前必须将分页模式恢复为本机分页,并且还必须保存和恢复分页寄存器。

如果使用 "#pragma interrupt_handler" 标记了该 C 函数,并且你的汇编语言 LJUMP 到该 C 函数,那么编译器会自动为你处理所有这些事情。

目标代码大小

[edit | edit source]

问:如何优化 PSoC C 编译器生成的目標代码大小?

A1:在 SRAM 大于 256 字节的 MCU 上,如果可能,请尽量不要使用 LMM。分页管理带来的开销非常大。

A2: 除非绝对必要,请勿使用 32 位变量。

A3: 如果可能,请坚持使用 8 位 BYTE 类型的变量,仅在必要时使用 16 位 WORD。

A4: 如果可读性没有过度降低,请尝试仅使用全局变量。

A5: 避免使用指向结构体的指针和结构体数组。 这尤其意味着避免将结构体指针传递给函数。

A6: 考虑限制函数参数的数量,并将所有函数可以直接访问的通用数据设为全局变量。

问:PSoC 支持 JTAG 吗?
答:不支持。 但是,JTAG 的许多功能可以通过其他方式实现。 使用“m8cbscan”进行 PSoC 边界扫描

问:PSoC 中运行的程序能否修改同一个 PSoC 中的闪存?(而不是正常情况下将程序烧录到 PSoC 中,然后不再修改程序)
A1:... 使用 EEPROM 模块 ...
A2:... "Flash Write Routine" 线程中有一些提示 ...
A3:... Forth/PSoC Forth 给出了一个在 PSoC 中运行并修改同一个 PSoC 中闪存的程序示例。

进一步阅读

[编辑 | 编辑源代码]
  • Forth/PSoC Forth 给出了 PSoC 汇编语言的示例。
  • "自制 MIDI 转盘" 由 casainho 编写,非常简要地展示了 PCB 的原理图和照片,该 PCB 上有一个 CY7C63723 微控制器(在光学鼠标内部)... 尽管最终项目最终使用了 Atmel AVR 而不是 PSoC。
华夏公益教科书