<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CC2530 串口配置步驟

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-07-06 14:42 ? 次閱讀

一、并行通信與串行通信

微控制器與外設之間的數據通信,根據連線結構和傳送方式的不同,可以分為兩種:并行通信和串行通信。

并行通信:指數據的各位同時發送或接收,每個數據位使用單獨的一條導線。傳輸速度快、效率高,但需要的數據線較多,成本高。

串行通信:指數據一位接一位地順 序發送或接收。需要的數據線少,成本低,但傳輸速度慢,效率低。

二、CC2530的串口通信模塊

CC2530有兩個串行通信接口USART0和USART1,它們能夠分別運行于異步UART模式或者同步SPI模式。

兩個USART接口具有相同的功能,通過PERCFG寄存器可以設置兩個USART接口對應外部I/O引腳的映射關系:

位置1:RX0 --- P0_2 TX0 --- P0_3 RX1 --- P0_5 TX1 --- P0_4

位置2:RX0 --- P1_4 TX0 --- P1_5 RX1 --- P1_7 TX1 --- P1_6

對每個USART串口通信編程,本質是設置相關的5個寄存器:

<1> UxCSR: USARTx的控制和狀態寄存器。

<2> UxUCR: USARTx的UART控制寄存器。

<3> UxGCR: USARTx的通用控制寄存器。

<4> UxDBUF:USARTx的接收/發送數據緩沖寄存器。

<4> UxBAUD:USARTx的波特率控制寄存器。

三、UART口與計算機的COM口連接

先認識兩種電平:TTL電平和RS232電平。

TTL電平: 邏輯0----小于0.8V 邏輯1----大于2.4V。

RS232電平: 邏輯0----5 15V 邏輯1---- -5 -15V。

計算機的串行通信接口是RS-232的標準接口,而CC2530單片機的UART接口則是TTL電平,兩者的電氣規范不一致,所以要完成兩者之間的數據通信,就需要借助接口芯片在兩者之間進行電平轉換,常用的有MAX232芯片。

img

注意:DB9接口中,公頭和母頭的排列順序是不同的。

四、原理圖數據手冊分析

img

img

img

img

配置串口的步驟

img

img

img

img

五、代碼示例

(1) 示例1: 編寫串口初始化函數,實現串口字符串發送 (CPU頻率在32MHZ下,波特率的為115200)

#include < ioCC2530.h >
 #include < string.h >
 ?
 //定義LED燈的端口
 #define LED1 P1_2
 #define LED2 P1_3
 ?
 //定義KEY按鍵的端口
 #define KEY1 P1_0       //定義按鍵為P1_0口控制
 #define KEY2 P1_1       //定義按鍵為P1_1口控制
 ?
 /*
 函數功能:LED燈IO口初始化
 硬件連接:LED1-- >P1_2 , LED2-- >P1_3
 */
 void LED_Init(void)
 {
     P1DIR |=0x3< 2;  //配置P1_2、P1_3為輸出模式
     LED1 = 1;
     LED2 = 1;
 }
 ?
 /*
 函數功能:按鍵IO口初始化
 硬件連接:KEY1-- >P1_0  KEY2-- >P1_1  
 */
 void KEY_Init(void)
 {
     P1SEL&=~(0x3< 0); //配置P1_0,P1_1處于通用GPIO口模式
     P1DIR&=~(0x3< 0); //配置P1_0,P1_1為輸入模式
     P1INP|= 0x3< 0;   //上拉   
 }
 ?
 ?
 void delay10ms(void)   //誤差 0us
 {
     unsigned char a,b,c;
     for(c=193;c >0;c--)
         for(b=118;b >0;b--)
             for(a=2;a >0;a--);
 }
 ?
 ?
 /*
 函數功能:按鍵掃描
 返 回 值:按下的按鍵值
 */
 unsigned char Key_Scan(void)
 {
     static unsigned char stat=1;
     if((KEY1==0||KEY2==0)&&stat)
     {
        stat=0;
        delay10ms();
        if(KEY1==0)return 1;
        if(KEY2==0)return 2;
     }
     else
     {
         if(KEY1&&KEY2)stat=1;
     }
     return 0;
 }
 ?
 /*
 函數功能:串口0初始化
 */
 void Init_Uart0(void)
 {
   PERCFG&=~(1< 0);  //串口0的引腳映射到位置1,即P0_2和P0_3
   P0SEL|=0x3< 2;   //將P0_2和P0_3端口設置成外設功能
   U0BAUD = 216;     //32MHz的系統時鐘產生115200BPS的波特率
   U0GCR&=~(0x1F< 0);//清空波特率指數
   U0GCR|=11< 0;      //32MHz的系統時鐘產生115200BPS的波特率
   U0UCR |= 0x80;    //禁止流控,8位數據,清除緩沖器
   U0CSR |= 0x3< 6;  //選擇UART模式,使能接收器
 }
 ?
 ?
 /*
 函數功能:UART0發送字符串函數
 */
 void UR0SendString(char *str,unsigned int len)
 {
   int j;
   for(j=0;j< len;j++)
   {
     U0DBUF = *str++;    //將要發送的1字節數據寫入U0DBUF
     while(UTX0IF == 0);//等待數據發送完成
     UTX0IF = 0;       //清除發送完成標志,準備下一次發送
   }
 }
 ?
 /****************************************** 
  * 函數描述:32M系統時鐘下的毫秒延時函數 
  ******************************************/  
 void Delay_ms(unsigned int ms)  
 {  
   unsigned int i,j;  
   for(i = 0; i < ms; i++)  
   {  
     for(j = 0;j < 1774; j++);  
   }  
 }  
 ?
 ?
 /*主函數*/
 void main(void)
 {
     char buff[]="-----萬邦易嵌嵌入式開發-----\\r\\n";
     unsigned char key;
     CLKCONCMD &= ~0x40;            //設置系統時鐘源為32MHz晶振  
     for(; CLKCONSTA & 0x40;);      //等待晶振穩定  
     CLKCONCMD &= ~0X47;            //設置系統主時鐘頻率為32MHz  
   
     LED_Init();//初始化LED燈控制IO口
     KEY_Init();//按鍵初始化
     Init_Uart0();        //初始化串口0
     while(1)          
     {  
        key=Key_Scan();
        if(key)
        {
           //先發送一個字符串,測試串口0數據傳輸是否正確
           UR0SendString(buff,strlen(buff));     
           LED2 = !LED2;
        }       
     }
 }
 ?
 ?

(2)示例2: 編寫串口初始化函數,實現串口字符串發送 (CPU頻率在16MHZ下,波特率為115200)

#include < ioCC2530.h >
 #include < string.h >
 ?
 //定義LED燈的端口
 #define LED1 P1_2
 #define LED2 P1_3
 ?
 //定義KEY按鍵的端口
 #define KEY1 P1_0       //定義按鍵為P1_0口控制
 #define KEY2 P1_1       //定義按鍵為P1_1口控制
 ?
 /*
 函數功能:LED燈IO口初始化
 硬件連接:LED1-- >P1_2 , LED2-- >P1_3
 */
 void LED_Init(void)
 {
     P1DIR |=0x3< 2;  //配置P1_2、P1_3為輸出模式
     LED1 = 1;
     LED2 = 1;
 }
 ?
 /*
 函數功能:按鍵IO口初始化
 硬件連接:KEY1-- >P1_0  KEY2-- >P1_1  
 */
 void KEY_Init(void)
 {
     P1SEL&=~(0x3< 0); //配置P1_0,P1_1處于通用GPIO口模式
     P1DIR&=~(0x3< 0); //配置P1_0,P1_1為輸入模式
     P1INP|= 0x3< 0;   //上拉   
 }
 ?
 ?
 void delay10ms(void)   //誤差 0us
 {
     unsigned char a,b,c;
     for(c=193;c >0;c--)
         for(b=118;b >0;b--)
             for(a=2;a >0;a--);
 }
 ?
 ?
 /*
 函數功能:按鍵掃描
 返 回 值:按下的按鍵值
 */
 unsigned char Key_Scan(void)
 {
     static unsigned char stat=1;
     if((KEY1==0||KEY2==0)&&stat)
     {
        stat=0;
        delay10ms();
        if(KEY1==0)return 1;
        if(KEY2==0)return 2;
     }
     else
     {
         if(KEY1&&KEY2)stat=1;
     }
     return 0;
 }
 ?
 /*
 函數功能:串口0初始化
 */
 void Init_Uart0(void)
 {
   PERCFG&=~(1< 0);  //串口0的引腳映射到位置1,即P0_2和P0_3
   P0SEL|=0x3< 2;   //將P0_2和P0_3端口設置成外設功能
   U0BAUD = 216;     //16MHz的系統時鐘產生115200BPS的波特率
   U0GCR&=~(0x1F< 0);//清空波特率指數
   U0GCR|=12< 0;      //16MHz的系統時鐘產生115200BPS的波特率
   U0UCR |= 0x80;    //禁止流控,8位數據,清除緩沖器
   U0CSR |= 0x3< 6;  //選擇UART模式,使能接收器
 }
 ?
 ?
 /*
 函數功能:UART0發送字符串函數
 */
 void UR0SendString(char *str,unsigned int len)
 {
   int j;
   for(j=0;j< len;j++)
   {
     U0DBUF = *str++;    //將要發送的1字節數據寫入U0DBUF
     while(UTX0IF == 0);//等待數據發送完成
     UTX0IF = 0;       //清除發送完成標志,準備下一次發送
   }
 }
 ?
 /****************************************** 
  * 函數描述:32M系統時鐘下的毫秒延時函數 
  ******************************************/  
 void Delay_ms(unsigned int ms)  
 {  
   unsigned int i,j;  
   for(i = 0; i < ms; i++)  
   {  
     for(j = 0;j < 1774; j++);  
   }  
 }  
 ?
 ?
 /*主函數*/
 void main(void)
 {
     char buff[]="-----萬邦易嵌嵌入式開發-----\\r\\n";
     unsigned char key;
     LED_Init();//初始化LED燈控制IO口
     KEY_Init();//按鍵初始化
     Init_Uart0();        //初始化串口0
     while(1)          
     {  
        key=Key_Scan();
        if(key)
        {
           //先發送一個字符串,測試串口0數據傳輸是否正確
           UR0SendString(buff,strlen(buff));     
           LED2 = !LED2;
        }       
     }
 }
 ?
 ?

(3)示例3:中斷接收

#include < ioCC2530.h >
 #include < string.h >
 ?
 //定義LED燈的端口
 #define LED1 P1_2
 #define LED2 P1_3
 ?
 //定義KEY按鍵的端口
 #define KEY1 P1_0       //定義按鍵為P1_0口控制
 #define KEY2 P1_1       //定義按鍵為P1_1口控制
 ?
 unsigned char dataRecv;
 unsigned char Flag = 0;
 ?
 /*
 函數功能:LED燈IO口初始化
 硬件連接:LED1-- >P1_2 , LED2-- >P1_3
 */
 void LED_Init(void)
 {
     P1DIR |=0x3< 2;  //配置P1_2、P1_3為輸出模式
     LED1 = 1;
     LED2 = 1;
 }
 ?
 /*
 函數功能:按鍵IO口初始化
 硬件連接:KEY1-- >P1_0  KEY2-- >P1_1  
 */
 void KEY_Init(void)
 {
     P1SEL&=~(0x3< 0); //配置P1_0,P1_1處于通用GPIO口模式
     P1DIR&=~(0x3< 0); //配置P1_0,P1_1為輸入模式
     P1INP|= 0x3< 0;   //上拉   
 }
 ?
 ?
 void delay10ms(void)   //誤差 0us
 {
     unsigned char a,b,c;
     for(c=193;c >0;c--)
         for(b=118;b >0;b--)
             for(a=2;a >0;a--);
 }
 ?
 ?
 /*
 函數功能:按鍵掃描
 返 回 值:按下的按鍵值
 */
 unsigned char Key_Scan(void)
 {
     static unsigned char stat=1;
     if((KEY1==0||KEY2==0)&&stat)
     {
        stat=0;
        delay10ms();
        if(KEY1==0)return 1;
        if(KEY2==0)return 2;
     }
     else
     {
         if(KEY1&&KEY2)stat=1;
     }
     return 0;
 }
 ?
 /*
 函數功能:串口0初始化
 */
 void Init_Uart0(void)
 {
   PERCFG&=~(1< 0);  //串口0的引腳映射到位置1,即P0_2和P0_3
   P0SEL|=0x3< 2;   //將P0_2和P0_3端口設置成外設功能
   U0BAUD = 216;     //16MHz的系統時鐘產生115200BPS的波特率
   U0GCR&=~(0x1F< 0);//清空波特率指數
   U0GCR|=12< 0;      //16MHz的系統時鐘產生115200BPS的波特率
   U0UCR |= 0x80;    //禁止流控,8位數據,清除緩沖器
   U0CSR |= 0x3< 6;  //選擇UART模式,使能接收器
   UTX0IF = 0;       //清除TX發送中斷標志
   URX0IF = 0;       //清除RX接收中斷標志
   URX0IE = 1;       //使能URAT0的接收中斷
   EA = 1;           //使能總中斷
 }
 ?
 ?
 ?
 /*
 函數功能:UART0發送字符串函數
 */
 void UR0SendString(char *str,unsigned int len)
 {
   int j;
   for(j=0;j< len;j++)
   {
     U0DBUF = *str++;    //將要發送的1字節數據寫入U0DBUF
     while(UTX0IF == 0);//等待數據發送完成
     UTX0IF = 0;       //清除發送完成標志,準備下一次發送
   }
 }
 ?
 /*================UR0接收中斷服務函數================*/
 #pragma vector = URX0_VECTOR
 __interrupt void UART0_RecvInterrupt()
 {
   URX0IF = 0;           //清除RX接收中斷標志
   dataRecv =  U0DBUF;   //將數據從接收緩沖區讀出
   Flag = 1;             //設置接收指令標志
 }
 ?
 ?
 /*================執行上位機的指令=================*/
 void ExecuteTheOrder()
 {
   Flag = 0 ;            //清除接收指令標志
   switch(dataRecv)
   {
     case 'A':
       UR0SendString("選擇1!\\r\\n",9);
       break;
     case 'B':
       UR0SendString("選擇2!\\r\\n",9);
       break;
     case 'C':
       UR0SendString("選擇3!\\r\\n",9);
       break;
     case 'D':
       UR0SendString("選擇4!\\r\\n",9);
       break;
   }
 }
 ?
 ?
 /*主函數*/
 void main(void)
 {
     char buff[]="-----嵌入式開發-----\\r\\n";
     unsigned char key;
     LED_Init();//初始化LED燈控制IO口
     KEY_Init();//按鍵初始化
     Init_Uart0();        //初始化串口0
     while(1)          
     {
        key=Key_Scan();
        if(key)
        {
           //先發送一個字符串,測試串口0數據傳輸是否正確
           UR0SendString(buff,strlen(buff));     
           LED2 = !LED2;
        }
       
       if(Flag == 1)      //查詢是否收到上位機指令
       {
         ExecuteTheOrder();
       }
     }
 }
 ?
 ?
 ?

六、波特率計算

計算波特率

CC2530的波特率由BAUD_E和BAUD_M共同決定:

img

F為微控制器的系統時鐘頻率:16MHz或32MHz。

TI公司提供的數據手冊中,給出了32MHz系統時鐘下各常用波特率的參數值,由計算公式亦不難得出16MHz系統時鐘下對應的參數值。

img

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 微控制器
    +關注

    關注

    48

    文章

    6838

    瀏覽量

    147939
  • 串口通信
    +關注

    關注

    32

    文章

    1579

    瀏覽量

    54908
  • CC2530
    +關注

    關注

    19

    文章

    220

    瀏覽量

    57269
  • 串口配置
    +關注

    關注

    0

    文章

    5

    瀏覽量

    1551
收藏 人收藏

    評論

    相關推薦

    CC2530 GPIO口輸入配置配置步驟

    介紹CC2530 GPIO口輸入配置配置。
    的頭像 發表于 07-06 14:40 ?1567次閱讀
    <b class='flag-5'>CC2530</b> GPIO口輸入<b class='flag-5'>配置</b><b class='flag-5'>配置</b><b class='flag-5'>步驟</b>

    CC2530 外部中斷配置步驟

    介紹CC2530 外部中斷配置步驟。
    的頭像 發表于 07-06 14:41 ?1831次閱讀
    <b class='flag-5'>CC2530</b> 外部中斷<b class='flag-5'>配置</b><b class='flag-5'>步驟</b>

    Cc2530

    CC2530
    三分溫柔
    發布于 :2022年05月31日 21:12:52

    CC2530的時鐘配置概述

    二、CC2530的時鐘配置概述CC2530同樣也有兩個時鐘,一個是高頻時鐘信號給CPU使用,另一個低頻時鐘信號給看門狗,睡眠定時器等使用;相對應的高速時鐘CC2530片內有一個16MH
    發表于 01-19 07:01

    基于CC2530的SDHC卡讀寫設計

    提出了將SDHC卡作為CC2530的外部存儲設備實現數據存儲的方法。SDHC卡具有體積小、存儲容量大的特點,通過CC2530組建的無線傳感網絡適用于工業監測,而將SDHC卡與CC2530相結合
    發表于 05-02 14:28 ?3447次閱讀
    基于<b class='flag-5'>CC2530</b>的SDHC卡讀寫設計

    cc2530底板

    CC2530的核心板原理圖和詳細底板的PCB,包括重要外設的PCB
    發表于 06-20 17:48 ?0次下載

    cc2530的PWM實現

    CC2530 結合了領先的RF 收發器的優良性能,業界標準的增強型8051 CPU,系統內可編程閃存,8-KB RAM 和許多其它強大的功能。CC2530 有四種不同的閃存版本:CC2530F32/64/128/256,分別具有
    發表于 11-07 18:43 ?3859次閱讀
    <b class='flag-5'>cc2530</b>的PWM實現

    cc2530程序設計實例之CC2530 RF部分使用—實現點對點收發

    本文主要介紹了cc2530程序設計實例之CC2530 RF部分使用—實現點對點收發,通過串口調試助手發送字節數據。例如通過串口向設備A發送HelloCC
    發表于 12-09 12:22 ?2.1w次閱讀
    <b class='flag-5'>cc2530</b>程序設計實例之<b class='flag-5'>CC2530</b> RF部分使用—實現點對點收發

    關于12.AD采集cc2530溫度串口顯示

    通過實驗掌握CC2530芯片串口配置與使用;采集內部溫度傳感器信息通過串口發送到上位機;觀察TX指示燈。
    發表于 08-06 08:00 ?10次下載
    關于12.AD采集<b class='flag-5'>cc2530</b>溫度<b class='flag-5'>串口</b>顯示

    CC2530芯片的基本特性和CC2530無線模塊的設計

    本文介紹了CC2530芯片的基本特性,論述了以CC2530芯片為核心的無線通信模塊的硬件設計和調試軟件設計,在介紹設計規范和模塊結構的基礎上,采用TI公司的CC2530芯片作為主控制芯片設計出具
    發表于 02-11 08:00 ?96次下載
    <b class='flag-5'>CC2530</b>芯片的基本特性和<b class='flag-5'>CC2530</b>無線模塊的設計

    使用CC2530芯片點亮LED的資料和程序免費下載

    CC2530芯片使用51增強型的內核,跟51單片機還是有一些區別的,例如:51單片機不需要對IO口進行配置,而cc2530芯片卻需要對IO口進行配置,才能對它進行賦值。
    發表于 07-30 17:35 ?4次下載
    使用<b class='flag-5'>CC2530</b>芯片點亮LED的資料和程序免費下載

    CC2530控制LED閃爍

    CC2530控制LED閃爍CC2530 控制LED閃爍電路圖知識點CC2530有兩個高頻時鐘輸入輸出配置程序及注釋CC2530 控制LED閃
    發表于 11-29 18:51 ?15次下載
    <b class='flag-5'>CC2530</b>控制LED閃爍

    CC2530定時器3

    LED1的亮滅周期為2s。文章目錄CC2530用定時器3完成對LED1周期為2s控制前言一、定時器3和定時器1哪些不同?二、使用步驟1.配置LED12.配置定時器33.完成中斷函數三、
    發表于 11-29 18:51 ?9次下載
    <b class='flag-5'>CC2530</b>定時器3

    CC2530中文數據手冊下載

    CC2530中文數據手冊下載
    發表于 01-14 10:57 ?19次下載

    CC2530無線通信模塊使用串口通信參考方法

    CC2530無線通信模塊使用串口通信參考方法
    發表于 04-24 17:20 ?13次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>