天天看點

STM32-RS232通信軟硬體實作

OS:Windows 64

Development kit:MDK5.14

IDE:UV4

MCU:STM32F103C8T6/VET6

AD:Altium Designer 18.0.12

1、RS232簡介

  RS232是個人計算機上的通訊接口之一,由電子工業協會(Electronic Industries Association,EIA) 所制定的異步傳輸标準接口。通常 RS-232 接口以9個引腳 (DB-9) 或是25個引腳 (DB-25) 的型态出現,一般個人計算機上會有兩組 RS-232 接口,分别稱為 COM1 和 COM2。

  接口标準RS-232-C是美國電子工業協會EIA(Electronic Industry Association)制定的一種串行實體接口标準。RS是英文“推薦标準”的縮寫,232為辨別号,C表示修改次數。RS-232-C總線标準設有25條信号線,包括一個主通道和一個輔助通道。在多數情況下主要使用主通道,對于一般雙工通信,僅需幾條信号線就可實作,如一條發送線、一條接收線及一條地線。

  RS-232-C标準規定的資料傳輸速率為50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。

  RS-232接口符合美國電子工業聯盟(EIA)制定的串行資料通信的接口标準,原始編号全稱是EIA-RS-232(簡稱232,RS232)。它被廣泛用于計算機串行接口外設連接配接。連接配接電纜和機械、電氣特性、信号功能及傳送過程。

2、硬體實作

  晶片選擇MAX3232,一個晶片可以實作兩個232接口。應用電路如圖:

STM32-RS232通信軟硬體實作

  DB9型232接口實作單片機和電腦的連接配接,前面的電位器用以調節232線路電壓,事實上隻要不太過分,電位器電阻值并沒有确切值,但電路設計時建議保留。

3、軟體實作

  RS232是全雙工通信,相比485要簡單一些。

STM32-RS232通信軟硬體實作
STM32-RS232通信軟硬體實作
1 #include "sys.h"
 2 #include "stdio.h"
 3 
 4 #define        USART1_RX_LEN      50           //接收最大位元組
 5 #define        USART1_TX_LEN      50          //發送最大位元組
 6 
 7 extern  u8 USART1_RX_Buf[USART1_RX_LEN];  //接收緩沖
 8 extern  u8 USART1_TX_Buf[USART1_TX_LEN];  //發送緩沖
 9 extern  u8 USART1_RX_Data_Len;           //實際接收資料位元組長度
10 extern  u8 USART1_TX_Data_Len;           //待發送資料位元組長度
11 extern  u8 USART1_RX_Flag;               //是否收到資料
12 
13 void USART1_Config(u32 bound);
14 void USART1_IRQHandler(void);
15 void USART1_Send_Data(u8 *buf,u8 len);      

usart1_232.h

STM32-RS232通信軟硬體實作
STM32-RS232通信軟硬體實作
1 #include "sys.h"
 2 #include "usart1.h"
 3 
 4 u8 USART1_RX_Buf[USART1_RX_LEN];  //接收緩沖
 5 u8 USART1_TX_Buf[USART1_TX_LEN];  //發送緩沖
 6 u8 USART1_RX_Data_Len = 0;        //實際接收資料位元組長度
 7 u8 USART1_TX_Data_Len = 0;        //待發送資料位元組長度
 8 u8 USART1_RX_Flag = 0;            //序列槽1是否接收完資料
 9 
10 void USART1_IRQHandler(void)
11 {
12     u8 res;
13     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到資料
14     {
15         res =USART_ReceiveData(USART1); //讀取接收到的資料
16         if(USART1_RX_Data_Len<USART1_RX_LEN)
17         {
18             USART1_RX_Buf[USART1_RX_Data_Len]=res; //記錄接收到的值
19             USART1_RX_Data_Len++; //接收資料增加 1
20         }
21         USART1_RX_Flag=1;   //序列槽1接收到資料
22     }
23 }
24 
25 void USART1_Config(u32 bound)
26 {
27     GPIO_InitTypeDef GPIO_InitStructure;
28     USART_InitTypeDef USART_InitStructure;
29     NVIC_InitTypeDef NVIC_InitStructure;
30     
31     /*********************配置序列槽1**************************/
32     
33     /* config USART1 clock */
34     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
35     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  , ENABLE);
36     
37     /* USART1 GPIO config */
38     /* Configure USART1 Tx (PA.02) as alternate function push-pull *///TX
39     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
40     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //複用推挽輸出
41     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
42     GPIO_Init(GPIOA, &GPIO_InitStructure);    
43     /* Configure USART1 Rx (PA.03) as input floating *///RX
44     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
45     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空輸入
46     GPIO_Init(GPIOA, &GPIO_InitStructure);
47         
48     /* USART1 mode config */    
49     USART_InitStructure.USART_BaudRate = bound;
50     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
51     USART_InitStructure.USART_StopBits = USART_StopBits_1;
52     USART_InitStructure.USART_Parity = USART_Parity_No ;
53     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
54     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
55     USART_Init(USART1, &USART_InitStructure);
56     
57     /*  USART1 接收中斷 */
58     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能序列槽1中斷
59     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占優先級 3 級
60     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //從優先級 2級
61     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
62     NVIC_Init(&NVIC_InitStructure);//初始化 NVIC 寄存器
63     
64     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //開啟中斷
65     USART_Cmd(USART1, ENABLE); //使能序列槽
66     
67 }
68 
69 void USART1_Send_Data(u8 *buf,u8 len)       
70 {
71     u8 t;
72     for(t=0;t<len;t++)
73     {
74         while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
75         USART_SendData(USART1,buf[t]);
76     }
77     while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
78 }      

usart1_232.c

  注意:RX設為浮空輸入、TX設定為複用推挽輸出

作者:白色淚光

出處:http://www.cnblogs.com/WhiteTears/

繼續閱讀