https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4295635.html

实验现象

开发板实现功能发送

实验过程

1、PL2303 USB转串口电路图
【CC2540】串口通信 - 图1

(一)串口发送

(1)查看用户手册有:

UART0 对应的外部设备 IO 引脚关系为: P0_2 ——— RX
P0_3 ——— TX
UART1 对应的外部设备 IO 引脚关系为: P0_5 ——— RX
P0_4 ——— TX

(2)USART功能特点:

  1. CC2540中, UART0UART1是串行通信接口,它们能够分别运于异步UART模式或者同步SPI模式两个模式。两个UART的功能是一样,可以通过设置在单独的 IO引脚上。<br /> UART 模式的操作具有下列特点:<br /> 8位或者 9位负载数据<br /> ②奇校验、偶校验或者无奇偶校验<br /> ③配置起始位和停止电平<br /> ④配置 LSB 或者 MSB 首先传送<br /> ⑤独立收发中断<br /> ⑥独立收发 DMA 触发

(3)CC2540配置串口的一般步骤

① 配置 IO,使用外部设备功能。 此处配置 P0_2 和 P0_3用作串口 UART0
② 配置相应串口的控制和状态寄存器。 此处配置 UART0 的工作寄存器
③ 配置串口工作的波特率。 此处配置波特率为115200

(4)寄存器的相关内容:

U0CSR
(UART0控制和状态寄存器)
BIT7:MODE 0:SPI模式 1:UART模式
BIT6:RE 0:接收器进制 1:接收器使能
BIT5:SLAVE 0:SPI主模式 1:SPI从模式
BIT4:FE 0:没有检测到出帧错误
1:收到字节停止位电平出错
BIT3:ERR 0:没有检测出奇偶检验出错
1:收到字节奇偶检验出错
BIT2:RX_BYTE 0:没有收到字节
1:收到字节就绪
BIT1:TX_BYTE 0:没有发送字节
1:写到数据缓冲区寄存器的最后字节已发送
BIT0:ACTIVE 0:UART空闲
1:UART忙碌
U0GCR
(UART0通用控制寄存器)
BIT7:CPOL 0:SPI负时钟极性
1:SPI正时钟极性
BIT6:CPHA 0:当来自CPOL的SCK反相之后又返回CPOL时,数据输出到 MOSI;当来自CPOL的SCK返回CPOL反相时,输入数据采样到MISO。
1:当来自CPOL的SCK反相之后又返回CPOL时,输入数据采样MOSI;当来自CPOL的SCK返回CPOL反相时,数据输出到 MOSI。
BIT5:ORDER 0:LSB先传送
1:MSB先传送
BIT[4,0]:BAUD_E 波特率指数值 BAUD_E连同BAUD_M一起决定了UART的波特率
U0BAUD
UART0 波特率控制寄存器
BIT[7,0]:BAUD_M 波特率尾数值 BAUD_E连同BAUD_M一起决定了UART的波特率
U0DBUF 串口发送/接受数据缓冲区
UTX0IF
发送中断标志
中断标志5IRCON2的BIT1 0:中断未挂起
1:中断挂起

(5)串口波特率设置

公式如下:
【CC2540】串口通信 - 图2
常用波特率设置:
【CC2540】串口通信 - 图3
(6)代码实现:

  1. #include<ioCC2540.h>
  2. #include <string.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. //定义LED的端口
  6. #define LED1 P1_0
  7. #define LED2 P1_1
  8. //函数声明
  9. void Delay_ms(uint);
  10. void initUART(void);
  11. void UartSend_String(char *Data,int len);
  12. char Txdata[19]; //存放"Hello BlueTooth4.0\n"共19个字符串
  13. /****************************************************************
  14. 延时函数
  15. ****************************************************************/
  16. void Delay_ms(uint n)
  17. {
  18. uint i,j;
  19. for(i=0;i<n;i++)
  20. for(j=0;j<1774;j++);
  21. }
  22. void IO_Init()
  23. {
  24. P1DIR = 0x01; //P1_0,P1_1 IO方向输出
  25. LED1 = 0;
  26. }
  27. /****************************************************************
  28. 串口初始化函数
  29. ****************************************************************/
  30. void InitUART(void)
  31. {
  32. PERCFG = 0x00; //位置1 P0口
  33. P0SEL = 0x0c; //P0_2,P0_3用作串口(外部设备功能)
  34. P2DIR &= ~0XC0; //P0优先作为UART0
  35. U0CSR |= 0x80; //设置为UART方式
  36. U0GCR |= 11;
  37. U0BAUD |= 216; //波特率设为115200
  38. UTX0IF = 0; //UART0 TX中断标志初始置位0
  39. }
  40. /****************************************************************
  41. 串口发送字符串函数
  42. ****************************************************************/
  43. void UartSend_String(char *Data,int len)
  44. {
  45. int j;
  46. for(j=0;j<len;j++)
  47. {
  48. U0DBUF = *Data++;
  49. while(UTX0IF == 0);
  50. UTX0IF = 0;
  51. }
  52. }
  53. /****************************************************************
  54. 主函数
  55. ****************************************************************/
  56. void main(void)
  57. {
  58. CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
  59. while(CLKCONSTA & 0x40); //等待晶振稳定为32M
  60. CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
  61. IO_Init();
  62. InitUART();
  63. strcpy(Txdata,"Hello BlueTooth4.0\n"); //将发送内容copy到Txdata;
  64. while(1)
  65. {
  66. UartSend_String(Txdata,sizeof("Hello BlueTooth4.0\n")); //串口发送数据
  67. Delay_ms(500); //延时
  68. LED1=!LED1; //标志发送状态
  69. }
  70. }

三、实验成果:

【CC2540】串口通信 - 图4

PS:串口驱动,不行去百度下一个,然后更新驱动程序,在列表中选择,直到选到一个能用的。。真是无底坑。

(二)串口接受和发送

一、实验现象:

  1. 开发板实现收发

二、实验过程

  1. 原理部分同上,直接上源码
  1. #include<ioCC2540.h>
  2. #include<string.h>
  3. //宏定义
  4. #define LED1 P1_0
  5. #define LED2 P1_1
  6. //函数声明
  7. void Delay_ms(unsigned int delay); //延时函数
  8. void IO_init(); //IO配置
  9. void UART_init(); //初始化UART
  10. void Send_String(char *Data,int len); //发送字符串函数
  11. //变量声明
  12. char temp=0; //接收到的字符
  13. char Strdata[60]; //存放字符串
  14. //延时函数
  15. void Delay_ms(unsigned int delay)
  16. {
  17. unsigned int i,j;
  18. for(i=delay;i>0;i--)
  19. {
  20. for(j=0;j<1774;j++);
  21. }
  22. }
  23. //IO配置
  24. void IO_init()
  25. {
  26. P1SEL=0x00;
  27. P1DIR=0X03;
  28. P1INP=0X00;
  29. LED1=0;
  30. LED2=0;
  31. }
  32. //初始化UART
  33. void UART_init()
  34. {
  35. PERCFG=0X00; //位置一:P0口
  36. P0SEL=0X3c; //P0_2,P0_3,P0_4,P0_5用作第三用途
  37. P2DIR &= ~0XC0; //方向为输入
  38. U0CSR|=0X80; //设置UART方式
  39. U0GCR|=11;
  40. U0BAUD|=216; //设置波特率
  41. UTX0IF=0; //清除中断标志位
  42. //用来接收字符
  43. U0CSR |= 0x40; //允许接收
  44. IEN0 |= 0x84; //开总中断,接收中断
  45. }
  46. //发送字符串函数
  47. void Send_String(char *Data,int len)
  48. {
  49. unsigned int i;
  50. for(i=0;i<len;i++)
  51. {
  52. //U0DBUF = *Data++; //两种方法都可以
  53. U0DBUF = Data[i];
  54. while(UTX0IF==0); //发送完一个字符后,会产生一个中断。我们通过等待中断产生,来控制传输时间间隔。
  55. UTX0IF = 0;
  56. }
  57. }
  58. void main()
  59. {
  60. int datanumber = 0; //统计字符长度
  61. int RXTXflag = 1; //接收状态标志变量
  62. CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
  63. while(CLKCONSTA & 0x40); //等待晶振稳定
  64. CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ。
  65. IO_init(); //初始化
  66. UART_init();
  67. strcpy(Strdata,"Hello World~\n");
  68. while(1)
  69. {
  70. if(RXTXflag == 1) //接收状态
  71. {
  72. LED1 = 1; //接收状态表示
  73. if(temp!=0)
  74. {
  75. if((temp!='#')&&(datanumber<50)) //最多接收50个字符,和以#号结束
  76. {
  77. Strdata[datanumber++] = temp;
  78. }
  79. else
  80. {
  81. RXTXflag=3; //进入发送状态
  82. LED1=0; //关指示灯
  83. }
  84. temp=0;
  85. }
  86. }
  87. if(RXTXflag == 3)
  88. {
  89. LED2=1; //发送状态表示
  90. U0CSR &= ~0X40; //禁止接收
  91. Send_String(Strdata,datanumber);
  92. U0CSR |= 0x40; //允许接受
  93. RXTXflag = 1; //恢复到接收状态
  94. datanumber = 0; //指针归0
  95. LED2 = 0; //关发送提示
  96. }
  97. }
  98. }
  99. //一个个拿出发送的字符,使用中断的手段
  100. #pragma vector = URX0_VECTOR
  101. __interrupt void fu(void)
  102. {
  103. URX0IF=0; //清除中断标志
  104. temp=U0DBUF;
  105. }

三、实验结果

【CC2540】串口通信 - 图5

(三)UART0控制LED

一、实验现象:

  1. 开发板实现UARTO控制LED

二、实验过程

  1. 原理部分同上,直接上源码
  1. #include<ioCC2540.h>
  2. #include<string.h>
  3. //宏定义
  4. #define LED1 P1_0
  5. #define LED2 P1_1
  6. //函数声明
  7. void Delay_ms(unsigned int delay); //延时函数
  8. void IO_init(); //IO配置
  9. void UART_init(); //初始化UART
  10. void Send_String(char *Data,int len); //发送字符串函数
  11. //变量声明
  12. char temp=0; //接收到的字符
  13. char Strdata[60]; //存放字符串
  14. //延时函数
  15. void Delay_ms(unsigned int delay)
  16. {
  17. unsigned int i,j;
  18. for(i=delay;i>0;i--)
  19. {
  20. for(j=0;j<1774;j++);
  21. }
  22. }
  23. //IO配置
  24. void IO_init()
  25. {
  26. P1SEL=0x00;
  27. P1DIR=0X03;
  28. P1INP=0X00;
  29. LED1=0;
  30. LED2=0;
  31. }
  32. //初始化UART
  33. void UART_init()
  34. {
  35. PERCFG=0X00; //位置一:P0口
  36. P0SEL=0X3c; //P0_2,P0_3,P0_4,P0_5用作第三用途
  37. P2DIR &= ~0XC0; //方向为输入
  38. U0CSR|=0X80; //设置UART方式
  39. U0GCR|=11;
  40. U0BAUD|=216; //设置波特率
  41. UTX0IF=0; //清除中断标志位
  42. //用来接收字符
  43. U0CSR |= 0x40; //允许接收
  44. IEN0 |= 0x84; //开总中断,接收中断
  45. }
  46. //发送字符串函数
  47. void Send_String(char *Data,int len)
  48. {
  49. unsigned int i;
  50. for(i=0;i<len;i++)
  51. {
  52. //U0DBUF = *Data++; //两种方法都可以
  53. U0DBUF = Data[i];
  54. while(UTX0IF==0); //发送完一个字符后,会产生一个中断。我们通过等待中断产生,来控制传输时间间隔。
  55. UTX0IF = 0;
  56. }
  57. }
  58. void main()
  59. {
  60. int datanumber = 0; //统计字符长度
  61. int RXTXflag = 1; //接收状态标志变量
  62. CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
  63. while(CLKCONSTA & 0x40); //等待晶振稳定
  64. CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ。
  65. IO_init(); //初始化
  66. UART_init();
  67. while(1)
  68. {
  69. if(RXTXflag == 1) //接收状态
  70. {
  71. if(temp!=0)
  72. {
  73. if((temp!='#')&&(datanumber<50)) //最多接收50个字符,和以#号结束
  74. {
  75. Strdata[datanumber++] = temp;
  76. }
  77. else
  78. {
  79. RXTXflag=3; //进入发送状态
  80. }
  81. temp=0;
  82. }
  83. }
  84. if(RXTXflag == 3)
  85. {
  86. if( Strdata[0]=='L')
  87. {
  88. switch( Strdata[1]-'0')
  89. {
  90. case 1: LED1=~LED1;break; //低电平点亮
  91. case 2: LED2=~LED2;break;
  92. }
  93. }
  94. RXTXflag = 1; //恢复到接收状态
  95. datanumber = 0; //指针归0
  96. }
  97. }
  98. }
  99. #pragma vector = URX0_VECTOR
  100. __interrupt void fu(void)
  101. {
  102. URX0IF=0; //清除中断标志
  103. temp=U0DBUF;
  104. }

三、实验结果

【CC2540】串口通信 - 图6