7.1.串口基礎知識
7.1.1.串口介紹
串行接口簡稱串口,也稱串行通信接口或串行通信接口(通常指COM接口),是采用串行通信方式的擴展接口。串行接口 (Serial Interface)是指數據一位一位地順序傳送。其特點是通信線路簡單,只要一對傳輸線就可以實現雙向通信(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用于遠距離通信,但傳送速度較慢。
7.1.2.串口通信參數介紹
- 波特率:衡量通信速度的參數,它表示每秒鐘傳送的bit的個數。
- 數據位:衡量通信中實際數據位的參數,表示一個信息包里包含的數據位的個數。
- 停止位:用于表示單個信息包的最后位,典型值為1、1.5和2位。由于數據是在傳輸線上傳輸的,每個設備都有自己的時鐘,很有可能在通信過程中出現不同步,停止位不僅僅表示傳輸的結束,還能提供校正時鐘同步的機會。停止位的位數越多,不同時鐘同步的容忍程度越大,但是數據傳輸率也越慢。
- 奇偶檢驗位:表示一種簡單的檢查錯誤的方式。
關于更為詳細的介紹請搜索百度。
7.1.3.串口工作模式
串口可以工作在單工、半雙工和全雙工模式下。
- 單工:在通信的任意時刻,信息只能由A傳到B。
- 半雙工:在通信的任意時刻,信息即可由A傳到B,又能由B傳到A,但同時只能有一個方向上的傳輸存在。
- 全雙工:在通信的任意時刻,通信線路上存在A到B和B到A的雙向信號傳輸。
7.1.4.串口通信協議
串口在進行通信的時候會按照數據包的形式進行發送,幀格式如圖1-4-1所示。
圖9-1 串口通信協議
串口通信是一位一位地傳輸,每傳輸一個字節總是以起始位開始,以停止位結束,字符之間沒有固定的時間間隔要求。每一個字符的前面都有一位起始位(低電平),后面由8位數據位組成,如果開啟了校驗位,則最后一位數據位是校驗位,最后是停止位。停止位后面是不定長的空閑位,停止位和空閑位都規定為高電平。
7.2.串口藍牙接線原理圖
在數字電壓電流表上默認使用的串口是串口2,接口為CW_UART2_TX和CW_UART2_RX。關于串口和藍牙連接原理圖如圖9-2所示。
圖 9-2 串口藍牙接線
使用藍牙模塊KT6368將信息發送出去,只需要調用CW32的UART_2將信息傳輸至藍牙模塊即可。
7.3.串口驅動流程
串口驅動有以下幾個流程:配置CW32時鐘樹,配置UART_2串口,調用串口打印信息。通過查看上文的CW32時鐘樹可知,串口2掛載在高級外設時鐘 PCLK上,而此前的時鐘配置已將PCLK配置成了6MHz。具體的配置函數如下:
void Uart2_Init(void)
{
//外設時鐘使能
RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOA, ENABLE); //使能串口要用到的GPIO時鐘
RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_UART2, ENABLE); //使能串口時鐘
GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Pins = GPIO_PIN_7;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
PA07_AFx_UART2RXD();
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Pins = GPIO_PIN_6;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
PA06_AFx_UART2TXD();
USART_InitTypeDef USART_InitStructure; //串口初始化
USART_InitStructure.USART_BaudRate = 115200; //設置波特率
USART_InitStructure.USART_Over = USART_Over_16; //串口采樣方式
USART_InitStructure.USART_Source = USART_Source_PCLK; //串口傳輸時鐘源采用PCLK
USART_InitStructure.USART_UclkFreq = RCC_Sysctrl_GetPClkFreq(); //頻率為PCLK的頻率
USART_InitStructure.USART_StartBit = USART_StartBit_FE; //數據開始位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //數據停止位
USART_InitStructure.USART_Parity = USART_Parity_No ; //無校驗
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //發送/接收使能
USART_Init(CW_UART2, &USART_InitStructure);
}
在完成串口的配置后,還需要寫一個串口發送函數
void USART_SendString(UART_TypeDef *USARTx, char *String)
{
while (*String != '?') //?表示沒有數據
{
USART_SendData_8bit(USARTx, *String); //發送一位8bit數據
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); //發送緩沖器未空則等待
String++; //發送一次完成后,準備發送下一位數據
}
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXBUSY) == SET); //發送串口狀態忙則等待
}
由于定時器中斷為1ms,而串口發送占用的時間較長,所以我們1000ms使用藍牙發送一次信息,這里的寫法并未使用定時器。
char data_reg[24]; //定義數組,用于數據打印
uint32_t Ble_Time=0; //1000ms計時變量
while(1) //main函數里的while循環
{
if(GetTick() >= (Ble_Time + 1000)) //如果此時的時間大于上一次的1000ms
{
Ble_Time = GetTick(); //記錄此刻時間
Volt_Cal(); //電壓計算
sprintf(data_reg,"volt=%urn",Cal_Buffer); //打印數據
USART_SendString(CW_UART2,data_reg); //調用串口上傳數據給藍牙
}
}
注意 GetTick() 函數定義在頭文件 cw32f003_systick.h 中,而此函數要使用到系統時鐘中斷,所以還需要配置系統時鐘中斷:
InitTick(48000000); // SYSTICK 的工作頻率為48MHz,每ms中斷一次
最終可以收到藍牙傳遞的數據:
圖9-3 藍牙發送數據
審核編輯 黃宇
-
藍牙
+關注
關注
114文章
5809瀏覽量
170188 -
串口
+關注
關注
14文章
1551瀏覽量
76421 -
電流表
+關注
關注
2文章
231瀏覽量
26214 -
數字電壓
+關注
關注
0文章
9瀏覽量
9815 -
CW32
+關注
關注
1文章
203瀏覽量
626
發布評論請先 登錄
相關推薦
評論