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)
上一篇:STM8S——Analog/digital converter (ADC)
下一篇:M41T11-RTC(實(shí)時(shí)時(shí)鐘)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 中國制定的全球首項(xiàng)鋰離子電池硅基負(fù)極材料國際標(biāo)準(zhǔn)發(fā)布
- 智能汽車合成數(shù)據(jù)架構(gòu)與應(yīng)用實(shí)踐分享
- 15家車企的固態(tài)電池汽車及供應(yīng)商一覽!
- 8月交付!鋰電巨頭全固態(tài)電池商業(yè)化“快進(jìn)”
- 白皮書點(diǎn)破汽車智駕營銷現(xiàn)象:六個(gè)“不等于”揭示真實(shí)的輔助駕駛
- Unity引擎在智能座艙項(xiàng)目流程之深入優(yōu)化與未來技術(shù)
- Unity引擎在智能座艙項(xiàng)目流程之未來技術(shù)趨勢(shì)與高級(jí)整合
- Stellantis宣布終止氫燃料電池技術(shù)開發(fā)
- 汽車攝像頭模塊中敏感和動(dòng)態(tài)電源軌的紋波降低技術(shù)
- 如何在炎熱的夏日保持汽車前攝像頭的熱性能
- 蘋果新發(fā)布iOS 12.4第七個(gè)測(cè)試版
- 三星Note 10的國行版通過3C認(rèn)證
- IGBT功率半導(dǎo)體項(xiàng)目投資7.5億美元,落戶嘉善
- 盧比奧又提案!要阻止解禁華為,且要斷美國公司“后路”
- 美司法部要求法院暫停對(duì)高通的反壟斷裁決!
- 基于單片機(jī)ULN2803驅(qū)動(dòng)點(diǎn)陣屏仿電梯數(shù)字滾動(dòng)顯示
- 用動(dòng)作識(shí)別控制GUI輸入的研究及其實(shí)現(xiàn)
- ARM的異常中斷處理方案
- 基于ARM9的嵌入式智能車載系統(tǒng)設(shè)計(jì)
- 基于μC/OS-Ⅱ的圓度誤差的測(cè)量裝置的研究
- 關(guān)于flash 存儲(chǔ)的問題請(qǐng)指點(diǎn)指點(diǎn)
- 正學(xué)習(xí)candence 信號(hào)完整性分析 求一本書
- 【GD32L233C-START評(píng)測(cè)】5. IIC驅(qū)動(dòng)OLED
- Verilog HDL---復(fù)雜數(shù)字系統(tǒng)的構(gòu)成
- PCB電路板散熱技巧
- windows和linux串口通信問題
- 分析藍(lán)牙和MSP430音頻信宿參考設(shè)計(jì)
- 求cc2530溫度采集的程序 ,最簡(jiǎn)單的就行
- MSP430F1611學(xué)習(xí)
- 友善之臂專用串口通信工具DNW