国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2024年11月18日(星期一)

正在發(fā)生

2019年11月18日 | STM8S——Universal asynchronous receiver transmitter (UART)

發(fā)布者:渤海灣 來源: eefocus關(guān)鍵字:STM8S  Universal  asynchronous  receiver  transmitter  UART 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

UART基本介紹:


通用異步收發(fā)器UART他的功能非常強(qiáng)大


我們只使用UART的全雙工異步通信功能,使用中斷接收數(shù)據(jù)。


UART_RX:串行數(shù)據(jù)輸入。


UART_TX:串行數(shù)據(jù)輸出。


硬件支持:


連接串口(RS232)實(shí)現(xiàn)在超級(jí)終端里輸入輸出

軟件支持:


超級(jí)終端,teraterm-4.75

1、配置UART,我們使用UART2


(1)設(shè)置波特率為115200,設(shè)置數(shù)據(jù)字段長為8字,使用1個(gè)停止位,無基偶校驗(yàn),UART Clock disabled,打開發(fā)送和接收使能


  以上基本設(shè)置使用一個(gè)函數(shù)進(jìn)行封裝設(shè)置:




  函數(shù)內(nèi)部實(shí)現(xiàn):


    設(shè)置數(shù)據(jù)字段長為8字:UART2->CR1 |= 0x00;


    使用1個(gè)停止位: UART2->CR3 |= 0x00;


    使用基數(shù)位校驗(yàn):UART2->CR1 |= 0x00;


    UART Clock disabled、打開發(fā)送和接收使能等等


(2)打開接收中斷,當(dāng)接收發(fā)生或者溢出發(fā)生時(shí)候,產(chǎn)生接收中斷




(3)UART使能


 UART2->CR1 &= (uint8_t)(~0x02);


(4)全局中斷使能


 enableInterrupts();


總體UART配置函數(shù)實(shí)現(xiàn)如下代碼所示:

 1 static void UART2_Config(void)

 2 {

 3   /* EVAL COM (UART) configuration -----------------------------------------*/

 4   /* USART configured as follow:

 5         - BaudRate = 115200 baud  

 6         - Word Length = 8 Bits

 7         - One Stop Bit

 8         - Odd parity

 9         - Receive and transmit enabled

10         - UART Clock disabled

11   */

12   UART2_Init((uint32_t)115200, UART2_WORDLENGTH_8D,UART2_STOPBITS_1, UART2_PARITY_NO,

13                    UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);

14 

15   /* Enable the UART Receive interrupt: this interrupt is generated when the UART

16     receive data register is not empty */

17   UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);

18   

19   /* Enable the UART Transmit complete interrupt: this interrupt is generated 

20      when the UART transmit Shift Register is empty */

21   UART2_ITConfig(UART2_IT_TXE, ENABLE);

22 

23   /* Enable UART */

24   UART2_Cmd(ENABLE);

25   

26     /* Enable general interrupts */

27   enableInterrupts();

28 }

UART2_Config

2、UART輸出功能


如果直接使用C語言的printf函數(shù),只會(huì)在編譯器的Terminal-I/O中輸出,不會(huì)在我們想要的超級(jí)終端里面輸出,所以需要對(duì)輸出函數(shù)做重定向;


實(shí)現(xiàn)每次想要輸出的時(shí)候,將信息打印到超級(jí)終端中,故重定向putchar (int c)函數(shù),在函數(shù)內(nèi)使用UART的傳送數(shù)據(jù)功能就可以了,即將要輸出的信息寫入U(xiǎn)ART的數(shù)據(jù)寄存器


 1 #define PUTCHAR_PROTOTYPE int putchar (int c)

 2 ...

 3 /**

 4   * @brief Retargets the C library printf function to the UART.

 5   * @param c Character to send

 6   * @retval char Character sent

 7   */

 8 PUTCHAR_PROTOTYPE

 9 {

10   /* Write a character to the UART2 */

11   UART2_SendData8(c);

12   /* Loop until the end of transmission */

13   while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET);

14 

15   return (c);

16 }

3、UART輸入功能


輸入功能實(shí)際上是字符串處理過程的實(shí)現(xiàn),在超級(jí)終端中輸入內(nèi)容實(shí)際上是在UART的數(shù)據(jù)寄存器里寫內(nèi)容,所我們只需要去數(shù)據(jù)寄存器里面讀取并處理字符串即可;


處理函數(shù)功能

首先我們得定義一個(gè)支持終端回顯的函數(shù)uart_GetStr,其中功能包括:


(1)當(dāng)有我們?cè)诮K端里敲鍵盤的時(shí)候會(huì)立馬有正確的內(nèi)容顯示;


(2)當(dāng)按下特殊按鍵的時(shí)候會(huì)有正確的反應(yīng);比如backspace會(huì)刪除一個(gè)字符;return會(huì)表示輸入完畢進(jìn)入發(fā)送;


(3)對(duì)于其他特殊案件處理不了應(yīng)當(dāng)屏蔽;比如不想實(shí)現(xiàn)delete功能,刪除剛剛讀入的delete字符,并不會(huì)回顯;


函數(shù)實(shí)現(xiàn):

uart_GetStr傳入的第一個(gè)參數(shù)是指向接收數(shù)據(jù)數(shù)組的指針,第二個(gè)參數(shù)表示是否允許回顯;


幾個(gè)有用變量:


  __IO uint8_t ReciveBuff = 0; //save the current char


  uint8_t RxBuffer[32] = {0}; //save the input string


  __IO uint8_t RxCounter = 0; //the length of valid string


所以,RxBuffer就是uart_GetStr函數(shù)的第一個(gè)參數(shù),在uart_GetStr函數(shù)內(nèi)部會(huì)對(duì)每一個(gè)字符進(jìn)行處理,正確的字符才放入RxBuffer中;


//====================================================================================

  2 //Function Name    | dbg_GetStr

  3 //Description    | Get string via UART port.

  4 //Input        | *p_recv_buff : pointer to receive data buffer

  5 //        | b_echo_on : echo back on or off

  6 //Output    | detect terminal(0x0d character) :TRUE or FALSE

  7 //Remark    |

  8 //====================================================================================

  9 uint8_t uart_GetStr(uint8_t *p_recv_buff, bool b_echo_on)

 10 {

 11     uint8_t b_end = 0;

 12     int i;

 13     static uint8_t len = 0;

 14     static uint8_t pos = 0;

 15     static uint8_t esc_seq = 0;

 16     uint8_t c;

 17 

 18     // Get a character.

 19     if((c = ReciveBuff) == 0){

 20           return 0;

 21     }

 22     // echo back

 23     if(b_echo_on){

 24           printf("%c",c); //show the input

 25     }

 26 

 27     //Check

 28     switch(esc_seq){

 29         // Normal

 30         case 0:

 31           // Return(Terminate)

 32           if(c == 0x0d){

 33             p_recv_buff[len] = 0;

 34             len =  pos = 0;    // clear

 35             if(b_echo_on){

 36               printf("n");

 37             }

 38             b_end = 1;

 39           }

 40           // Back Space

 41           else if(c == 0x08){

 42             if(len){

 43               if(b_echo_on){

 44                 printf(" ");

 45                 printf("%c",0x08);      // BS

 46               }

 47               len--;    // update length info.

 48               pos--;    // update pos info

 49             }

 50           }

 51           // ESC

 52           else if(c == 0x1b){

 53             esc_seq = 1;

 54           }

 55           // DEL

 56           else if(c == 0x7f){

 57             if(len){

 58               DeleteChar(pos, len, &p_recv_buff[0]);

 59               len --;   // update length info

 60               if(b_echo_on){

 61                 printf("%s",&p_recv_buff[pos]);

 62                 printf(" ");

 63                 printf("%c",0x08);      // BS

 64         // move cursor to character end.

 65         for(i = 0; i < len - pos; i++){

 66                   printf("%c",0x1b);    // ESC

 67                   printf("%c",'[');

 68                   printf("%c",'D');

 69                 }

 70               }

 71             }

 72           }

 73           // Other

 74           else{

 75             p_recv_buff[pos] = c;

 76             len++;      // update length info

 77             pos++;      // update pos info

 78           }

 79           break;

 80           // ESC SEQ -> 1st

 81         case 1:

 82           if(c == '['){

 83             esc_seq = 2;        // Next seq.

 84           }

 85           else{

 86             esc_seq = 0;        // not support(to normal)

 87           }

 88           break;

 89           //ESC SEQ -> 2nd

 90         case 2:

 91           if(c=='D'){

 92             if(pos){

 93               pos--;    // "<-" key

 94             }

 95           }

 96           else if(c=='C'){

 97             if(pos < len){

 98               pos++;    // "->" key

 99             }

100           }

101           esc_seq = 0;  // To normal

102           break;

103         }

104         

105         return (b_end);

106 }

uart_GetStr

uart_GetStr函數(shù)值為0或者為1,只有在終端中輸入回車時(shí)才會(huì)返回1,其他情況均返回0;


有了這一特點(diǎn),我們?cè)谑褂眠@個(gè)函數(shù)的時(shí)候,只需要獲取返回值,當(dāng)返回0時(shí),把處理過后的、用戶正確輸入的字符串打印出來看;


運(yùn)行流程

(1)當(dāng)終端中有輸入的時(shí)候,即數(shù)據(jù)寄存器不為空,從而觸發(fā)接收中斷;


(2)在接收中斷中,我們每次從數(shù)據(jù)寄存器UART2->DR中讀取一個(gè)字節(jié),賦值到ReciveBuff;


(3)然后調(diào)用uart_GetStr函數(shù),對(duì)當(dāng)前輸入字符進(jìn)行處理;(即每一個(gè)輸入調(diào)用一次處理函數(shù))


(4)將uart_GetStr函數(shù)的返回值賦值給RT;


 1  INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21)

[1] [2]
關(guān)鍵字:STM8S  Universal  asynchronous  receiver  transmitter  UART 引用地址:STM8S——Universal asynchronous receiver transmitter (UART)

上一篇:STM8S——Analog/digital converter (ADC)
下一篇:M41T11-RTC(實(shí)時(shí)時(shí)鐘)

推薦閱讀

2018年雙十一購物狂歡節(jié)盡管已經(jīng)收官,但商品的配送仍然熱火朝天,為了讓剁手黨們盡早拿到快遞,快遞員真的很辛苦,“雙十一派件高峰,小哥熬夜搶快遞柜”,“快遞員三天兩夜睡了不到8小時(shí)的覺”,這一類的新聞層出不窮。 最后一公里的快遞配送難題如何解決,是各大物流最大痛點(diǎn)。人口紅利消失,人力成本飆升的當(dāng)下,單純的靠招聘快遞員已經(jīng)不能滿足配...
/*為自已寫的獨(dú)立鍵盤掃描犯的錯(cuò):unsigned密寫成了unsigner一直提示找不到a,b PORTD0=1;不行,要寫成PORTD=0x01;才可以,如果一定要寫,應(yīng)寫為RD0=1; PORTD=0x03;不是第三個(gè)燈亮,而是0000 0011是兩個(gè)燈亮 PORTD=0x8則是0000 1000是第4個(gè)燈亮。。。。。出錯(cuò)因原進(jìn)制轉(zhuǎn)化,剛開始寫程序進(jìn)制轉(zhuǎn)化混掉了。*/#include <pic.h>#define uchar uns...
11月18日,會(huì)通新材料股份有限公司(下稱“會(huì)通股份”)在上交所科創(chuàng)板上市,公司證券代碼為688219,發(fā)行價(jià)格8.29元/股,發(fā)行市盈率38.14倍。截至發(fā)稿,會(huì)通股份股價(jià)36.24元/股,漲幅達(dá)337.15%,總市值達(dá)166.4億元。資料顯示,會(huì)通股份成立于2008年,主要從事改性塑料的研發(fā)、生產(chǎn)和銷售,致力于為客戶提供高性能化、功能化的材料整體解決方案,是國內(nèi)規(guī)模...
廣告摘要聲明廣告工業(yè)4.0時(shí)代下,自動(dòng)化成為了制造業(yè)和倉庫運(yùn)營的新常態(tài),順應(yīng)這波工業(yè)浪潮的機(jī)器人正在迅猛發(fā)展,近年來,工業(yè)自主移動(dòng)機(jī)器人( AMR )的出現(xiàn)更是順應(yīng)了柔性制造的大勢(shì)。自主移動(dòng)機(jī)器人( AMR )是自動(dòng)導(dǎo)引運(yùn)輸車( AGV )的更智能、更靈活的替代方案。區(qū)別于磁導(dǎo)航式 AGV,工業(yè) AMR 的誕生更多地滿足了人機(jī)協(xié)同與柔性物流的需求...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved