1赞

13回答

1收藏

[原创] 【PSoC3心得】UART串口通信收发实验

英飞凌 英飞凌 18994 人阅读 | 13 人回复 | 2013-01-01

本帖最后由 ming1006 于 2013-1-1 00:07 编辑

    这应该是2013年PSoC版块的第一帖吧。在新的一年里用串口给大家拜个年吧!
    在PSoC上实现UART是非常容易的,我们需要的只是加入UART模块并进行简单的配置,这里我们使用中断来实现UART的接收,所以要在rx_interrupt引脚处添加一个中断模块,另外reset引脚记得拉低。
            

    下面让我们来配置UART,点击UART模块我们进入配置界面,配置UART的工作方式为全双工,波特率9600b/s,比特位为8位,停止位为1,其他默认。
      

    为了实现交互和观察效果,我们再加入按键和LED模块。按键模块由数字输入引脚和中断模块组成,将按键引脚配置为上升沿触发中断方式即可。

    LED等模块我们采用控制寄存器进行控制,用控制寄存器来统一控制两个4位宽的LEDL和LEDH引脚。为了实现用控制寄存器控制摸个引脚,一定要将LEDL和LEDH的HW Connection勾选来表示与内部其他模块直接相连。

    关于总线的连接有基础注意事项,一是LEDL和LEDH要勾选Display as bus,二是靠近LEDL和LEDH的为四位总线,地址应该为[3:0]和[7:4],设置为[0:3]和[4:7]会得不到预期效果。双击总线即可配置。
   

    接下来是引脚配置,其中RXD和TXD可以根据需要任意配置,其他的是按照PSoC3 First Touch Starter kit的情况配置的。
   

    配置好了之后就可以编译了,编译完会自动生成相应的API函数。我们首先在KeyISR.c中加入头文件包含和声明全局变量
  1. /*******************************************************************************
  2. * Place your includes, defines and code here
  3. ********************************************************************************/
  4. /* `#START KeyISR_intc` */
  5. #include <KEY.h>

  6. extern bit key;
  7. /* `#END` */
复制代码
在KeyISR.c可以找到中断函数,加入以下几句
  1. CY_ISR(KeyISR_Interrupt)
  2. {
  3. /* Place your Interrupt code here. */
  4. /* `#START KeyISR_Interrupt` */
  5. key = 1;                   //按键按下
  6. KEY_INTSTAT;         //清中断标志(在KEY.h中有定义)
  7. /* `#END` */

  8. /* PSoC3 ES1, ES2 RTC ISR PATCH */
  9. #if(CYDEV_CHIP_FAMILY_USED == CYDEV_CHIP_FAMILY_PSOC3)
  10. #if((CYDEV_CHIP_REVISION_USED <= CYDEV_CHIP_REVISION_3A_ES2) && (KeyISR__ES2_PATCH ))
  11. KeyISR_ISR_PATCH();
  12. #endif
  13. #endif
  14. }
复制代码
在UartISR.c中加入头文件包含
  1. /*******************************************************************************
  2. * Place your includes, defines and code here
  3. ********************************************************************************/
  4. /* `#START UartISR_intc` */
  5. #include <UART.h>
  6. #include <LEDCtlReg.h>
  7. /* `#END` */
复制代码
同样在UartISR.c中找到中断函数并加入如下代码
  1. CY_ISR(UartISR_Interrupt)
  2. {
  3. /* Place your Interrupt code here. */
  4. /* `#START UartISR_Interrupt` */
  5. char rx_data;
  6. rx_data = UART_GetChar(); //读uart
  7. switch(rx_data)
  8. {
  9. case '0': LEDCtlReg_Write(1); //熄灭第一个LED灯
  10. break;
  11. case '1': LEDCtlReg_Write(2); //熄灭第二个LED灯
  12. break;
  13. case '2': LEDCtlReg_Write(4);
  14. break;
  15. case '3': LEDCtlReg_Write(8);
  16. break;
  17. case '4': LEDCtlReg_Write(16);
  18. break;
  19. case '5': LEDCtlReg_Write(32);
  20. break;
  21. case '6': LEDCtlReg_Write(64);
  22. break;
  23. case '7': LEDCtlReg_Write(128);
  24. break;
  25. default :
  26. break;
  27. }
  28. /* `#END` */

  29. /* PSoC3 ES1, ES2 RTC ISR PATCH */
  30. #if(CYDEV_CHIP_FAMILY_USED == CYDEV_CHIP_FAMILY_PSOC3)
  31. #if((CYDEV_CHIP_REVISION_USED <= CYDEV_CHIP_REVISION_3A_ES2) && (UartISR__ES2_PATCH ))
  32. UartISR_ISR_PATCH();
  33. #endif
  34. #endif
  35. }
复制代码
最后在main.c文件里声明全局变量和编写主函数
  1. #include <device.h>

  2. bit key = 0;

  3. void main()
  4. {
  5. /* Place your initialization/startup code here (e.g. MyInst_Start()) */
  6. UART_Start(); //开启UART
  7. UartISR_Start(); //开启UART中断
  8. KeyISR_Start(); //开启按键中断

  9. CyGlobalIntEnable; /* Uncomment this line to enable global interrupts. */
  10. for(;;)
  11. {
  12. /* Place your application code here. */
  13. if(key)
  14. {
  15. UART_PutString("Happy new year!");
  16. key = 0;
  17. }
  18. }
  19. }
复制代码
至此我们的UART串口收发工程就完成了,编译并下载后,每按一下按键电脑串口就会收到一串"Happy new year!",而用电脑向PSoC发送‘0’——'7'可以熄灭对应的LED灯。
   


完整工程,欢迎下载
Uart.zip (1.84 MB, 下载次数: 291)





   

未命名5.jpg (2.82 KB, 下载次数: 170)

未命名5.jpg

未命名9.jpg (66.01 KB, 下载次数: 166)

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

使用道具 举报

回答|共 13 个

倒序浏览

沙发

QQ哥

发表于 2013-1-1 00:07:11 | 只看该作者

沙发~good job~
我就是QQ哥,QQ哥就是我!
https://www.cirmall.com/bbs/?fromuser=QQ%E5%93%A5
板凳

ming1006

发表于 2013-1-1 00:09:59 | 只看该作者

QQ哥 发表于 2013-1-1 00:07
沙发~good job~

你这是新年第一沙发!
地板

QQ哥

发表于 2013-1-1 00:11:11 | 只看该作者

ming1006 发表于 2013-1-1 00:09
你这是新年第一沙发!

对~我的首发~~~~~~~
我就是QQ哥,QQ哥就是我!
https://www.cirmall.com/bbs/?fromuser=QQ%E5%93%A5
5#

ming1006

发表于 2013-1-1 00:13:39 | 只看该作者

QQ哥 发表于 2013-1-1 00:11
对~我的首发~~~~~~~

呵呵,我来抢个新年第一个5#吧
6#

ming1006

发表于 2013-1-1 10:43:51 | 只看该作者

ht868788 发表于 2013-1-1 00:24
明哥现在对psoc3内部资源调用了如指掌啊,有空在想点例程

哪里,只是因为PSoC是图形配置界面,比较容易上手,例程的话是必学写的,不过快期末了可能会忙点,
7#

kk5290122

发表于 2013-1-1 17:15:33 | 只看该作者

支持支持……
8#

ming1006

发表于 2013-1-1 18:01:50 | 只看该作者

RE: 【PSoC3心得】UART串口通信收发实验

kk5290122 发表于 2013-1-1 17:15
支持支持……

呵呵,谢谢
9#

tao475824827

发表于 2013-3-10 22:29:36 | 只看该作者

good 很多教程贴都是楼主发的啊
10#

ming1006

发表于 2013-3-10 22:32:03 | 只看该作者

tao475824827 发表于 2013-3-10 22:29
good 很多教程贴都是楼主发的啊

作为版主,是应该的,最近好久没写了
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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