7.1.串口基礎(chǔ)知識(shí)
7.1.1.串口介紹
串行接口簡稱串口,也稱串行通信接口或串行通信接口(通常指COM接口),是采用串行通信方式的擴(kuò)展接口。串行接口 (Serial Interface)是指數(shù)據(jù)一位一位地順序傳送。其特點(diǎn)是通信線路簡單,只要一對傳輸線就可以實(shí)現(xiàn)雙向通信(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用于遠(yuǎn)距離通信,但傳送速度較慢。
7.1.2.串口通信參數(shù)介紹
波特率:衡量通信速度的參數(shù),它表示每秒鐘傳送的bit的個(gè)數(shù)。
數(shù)據(jù)位:衡量通信中實(shí)際數(shù)據(jù)位的參數(shù),表示一個(gè)信息包里包含的數(shù)據(jù)位的個(gè)數(shù)。
停止位:用于表示單個(gè)信息包的最后位,典型值為1、1.5和2位。由于數(shù)據(jù)是在傳輸線上傳輸?shù)模總€(gè)設(shè)備都有自己的時(shí)鐘,很有可能在通信過程中出現(xiàn)不同步,停止位不僅僅表示傳輸?shù)慕Y(jié)束,還能提供校正時(shí)鐘同步的機(jī)會(huì)。停止位的位數(shù)越多,不同時(shí)鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率也越慢。
奇偶檢驗(yàn)位:表示一種簡單的檢查錯(cuò)誤的方式。
關(guān)于更為詳細(xì)的介紹請搜索百度。
7.1.3.串口工作模式
串口可以工作在單工、半雙工和全雙工模式下。
單工:在通信的任意時(shí)刻,信息只能由A傳到B。
半雙工:在通信的任意時(shí)刻,信息即可由A傳到B,又能由B傳到A,但同時(shí)只能有一個(gè)方向上的傳輸存在。
全雙工:在通信的任意時(shí)刻,通信線路上存在A到B和B到A的雙向信號傳輸。
7.1.4.串口通信協(xié)議
串口在進(jìn)行通信的時(shí)候會(huì)按照數(shù)據(jù)包的形式進(jìn)行發(fā)送,幀格式如圖1-4-1所示。
圖9-1 串口通信協(xié)議
串口通信是一位一位地傳輸,每傳輸一個(gè)字節(jié)總是以起始位開始,以停止位結(jié)束,字符之間沒有固定的時(shí)間間隔要求。每一個(gè)字符的前面都有一位起始位(低電平),后面由8位數(shù)據(jù)位組成,如果開啟了校驗(yàn)位,則最后一位數(shù)據(jù)位是校驗(yàn)位,最后是停止位。停止位后面是不定長的空閑位,停止位和空閑位都規(guī)定為高電平。
7.2.串口藍(lán)牙接線原理圖
在數(shù)字電壓電流表上默認(rèn)使用的串口是串口2,接口為CW_UART2_TX和CW_UART2_RX。關(guān)于串口和藍(lán)牙連接原理圖如圖9-2所示。
圖 9-2 串口藍(lán)牙接線
使用藍(lán)牙模塊KT6368將信息發(fā)送出去,只需要調(diào)用CW32的UART_2將信息傳輸至藍(lán)牙模塊即可。
7.3.串口驅(qū)動(dòng)流程
串口驅(qū)動(dòng)有以下幾個(gè)流程:配置CW32時(shí)鐘樹,配置UART_2串口,調(diào)用串口打印信息。通過查看上文的CW32時(shí)鐘樹可知,串口2掛載在高級外設(shè)時(shí)鐘 PCLK上,而此前的時(shí)鐘配置已將PCLK配置成了6MHz。具體的配置函數(shù)如下:
void Uart2_Init(void) { //外設(shè)時(shí)鐘使能 RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOA, ENABLE); //使能串口要用到的GPIO時(shí)鐘 RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_UART2, ENABLE); //使能串口時(shí)鐘 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; //設(shè)置波特率 USART_InitStructure.USART_Over = USART_Over_16; //串口采樣方式 USART_InitStructure.USART_Source = USART_Source_PCLK; //串口傳輸時(shí)鐘源采用PCLK USART_InitStructure.USART_UclkFreq = RCC_Sysctrl_GetPClkFreq(); //頻率為PCLK的頻率 USART_InitStructure.USART_StartBit = USART_StartBit_FE; //數(shù)據(jù)開始位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //數(shù)據(jù)停止位 USART_InitStructure.USART_Parity = USART_Parity_No ; //無校驗(yàn) USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //發(fā)送/接收使能 USART_Init(CW_UART2, &USART_InitStructure); }
在完成串口的配置后,還需要寫一個(gè)串口發(fā)送函數(shù)
void USART_SendString(UART_TypeDef *USARTx, char *String) { while (*String != '?') //?表示沒有數(shù)據(jù) { USART_SendData_8bit(USARTx, *String); //發(fā)送一位8bit數(shù)據(jù) while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); //發(fā)送緩沖器未空則等待 String++; //發(fā)送一次完成后,準(zhǔn)備發(fā)送下一位數(shù)據(jù) } while (USART_GetFlagStatus(USARTx, USART_FLAG_TXBUSY) == SET); //發(fā)送串口狀態(tài)忙則等待 }
由于定時(shí)器中斷為1ms,而串口發(fā)送占用的時(shí)間較長,所以我們1000ms使用藍(lán)牙發(fā)送一次信息,這里的寫法并未使用定時(shí)器。
char data_reg[24]; //定義數(shù)組,用于數(shù)據(jù)打印 uint32_t Ble_Time=0; //1000ms計(jì)時(shí)變量 while(1) //main函數(shù)里的while循環(huán) { if(GetTick() >= (Ble_Time + 1000)) //如果此時(shí)的時(shí)間大于上一次的1000ms { Ble_Time = GetTick(); //記錄此刻時(shí)間 Volt_Cal(); //電壓計(jì)算 sprintf(data_reg,"volt=%u ",Cal_Buffer); //打印數(shù)據(jù) USART_SendString(CW_UART2,data_reg); //調(diào)用串口上傳數(shù)據(jù)給藍(lán)牙 } }
注意 GetTick() 函數(shù)定義在頭文件 cw32f003_systick.h 中,而此函數(shù)要使用到系統(tǒng)時(shí)鐘中斷,所以還需要配置系統(tǒng)時(shí)鐘中斷:
InitTick(48000000); // SYSTICK 的工作頻率為48MHz,每ms中斷一次
最終可以收到藍(lán)牙傳遞的數(shù)據(jù):
圖9-3 藍(lán)牙發(fā)送數(shù)據(jù)
審核編輯:劉清
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1878瀏覽量
64544 -
串行通信接口
+關(guān)注
關(guān)注
0文章
17瀏覽量
9557 -
定時(shí)器中斷
+關(guān)注
關(guān)注
0文章
49瀏覽量
11167
原文標(biāo)題:CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)六:串口藍(lán)牙發(fā)送
文章出處:【微信號:武漢芯源半導(dǎo)體,微信公眾號:武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論