STM32f103的數電採集電路的USART的使用與藍芽的連線的程式
阿新 • • 發佈:2019-02-20
STM32 的串列埠資源相當豐富的,功能也相當強勁。本專案所使用的 STM32F103C8T6 最多可提供 3 路串列埠,有分數波特率發生器、支援同步單線通訊和半雙工單線通訊、支援 LIN、 支援調變解調器操作、 智慧卡協議和 IrDA SIR ENDEC 規範、具有 DMA等。
串列埠設定的一般步驟可以總結為如下幾個步驟:
1.串列埠時鐘使能,GPIO 時鐘使能
2.串列埠復位
3.GPIO 埠模式設定
4.串列埠引數初始化
5.開啟中斷並且初始化 NVIC(如果需要開啟中斷才需要這個步驟)
6.使能串列埠
7.編寫中斷處理函式
HC-05 嵌入式藍芽串列埠通訊模組(以下簡稱模組)具有兩種工作模式:命令響應工作模式和自動連線工作模式,在自動連線工作模式下模組又可分為主(
前端採集模組使用了STM32F103C8T6的USART1串列埠通路,採用115200的波特率,資料位8位,1位停止位,無校驗位,作為串列埠配置協議。HC-05藍芽模組使用從機(Slave)模式,並用AT指令設定串列埠配置協議。藍芽作為無線傳輸方式,是和安卓智慧手機通訊的一種簡單快捷的通訊方式,
藍芽通訊協議報文格式詳情見3.2.6第4條。這樣的通訊協議充分利用了微控制器核心的移位運算器,比如資料的第0位SendBuff[0] = HexTable[( adcValue >> 12 ) & 0x0f ];同時穩定性極高,即使在資料傳輸途中某一位的資料出錯或者丟失,只要上位機識別報文標識字元,之後的資料還是可以準確的讀取,保證了資料傳輸的高效。而且保證了資料的可靠性,經過測試,系統連續執行3小時,可以實現0出錯,錯誤的資料自動拋棄。
USART1使用DMA傳送配置和接收中斷程式碼
void uart_init(u32 bound){ //GPIO埠設定 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鐘 USART_DeInit(USART1); //復位串列埠1 //USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複用推輓輸出 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9 //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶佔優先順序3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先順序3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根據指定的引數初始化VIC暫存器 //USART 初始化設定 USART_InitStructure.USART_BaudRate = bound;//一般設定為9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位資料格式 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(USART1, &USART_InitStructure); //初始化串列埠 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收暫存器滿開啟中斷 USART_Cmd(USART1, ENABLE); //使能串列埠 USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); } void USART1_IRQHandler(void) //串列埠1中斷服務程式 { uint8_t Res = 0; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收暫存器滿中斷) { Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的資料 } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //接收中斷(傳送暫存器空中斷) { } }
這裡使用USART的DMA傳送,同時使用接收中斷。其中Res是接收到的資料。DMA配置詳情請參考http://blog.csdn.net/devintt/article/details/46998173