stm32串口通訊
阿新 • • 發佈:2018-06-23
啟動 group while floating uart nvic type 同一時間 技術分享 RXD接口;協議層規定了數據包由起始位,主體數據,校驗位,停止位組成;通訊雙方的數據包的格式要一致才能正常收發數據;
這篇主要了解通訊的概念:
全雙工:同一時刻,兩個設備之間可以同時收發數據;
半雙工:兩個設備之間可以收發數據,但不能在同一時間;
單工 : 一個設備固定發送,一個設備固定接收;
同步通訊:收發設備會使用一根信號線作為時鐘信號,在其驅動下,雙方進行協調以同步數據,通過規定在時鐘的上升沿或下降沿對數據進行采集;
異步通訊:不使用時鐘線,它在數據信號裏穿插一些同步作用的信號位;或者以數據幀的格式傳輸,可以約定好傳輸速率,以便更好的同步。
比特率:每秒傳輸的二進制位數;
波特率:每秒傳輸的碼元數;
串口通訊:現在使用到的一般是:RXD,TXD,GND三條信號線,數據包由發送設備通過自身的TXD接口傳輸到接收設備的
- 起始位:一個邏輯0的數據位表示;
- 主體數據:通常被約定位5,6,7,8,位長;
- 校驗位:奇偶校驗,01校驗,無校驗;
- 停止信號:由0.5,1,1.5或2個邏輯1的數據位表示;
USART:通用同步異步收發器
UART:通用異步收發器
bsp_usart.h文件:
#ifndef __USART_H #define __USART_H #include"stm32f10x.h" #include"stdio.h" #define USARTx USART1 #defineUSART_CLK RCC_APB2Periph_USART1 #define USART_APBxClkCmd RCC_APB2PeriphClockCmd #define USART_BAUDRATE 115200 #define USART_TX_GPIO_PORT GPIOA #define USART_TX_GPIO_PIN GPIO_Pin_9 #define USART_RX_GPIO_PORT GPIOA #defineUSART_RX_GPIO_PIN GPIO_Pin_10//不要寫成GPIOA_Pin_10 #define USART_GPIO_CLK RCC_APB2Periph_GPIOA #define USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define USART_IRQ USART1_IRQn//在stm32f10x.h中 #define USART_IRQHandler USART1_IRQHandler//在啟動文件中 void USART_Config(void); #endif
bsp_usart.c文件:
#include"bsp_usart.h" static void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //開啟GPIO和 串口時鐘 RCC_APB2PeriphClockCmd(USART_GPIO_CLK, ENABLE); RCC_APB2PeriphClockCmd(USART_CLK, ENABLE); //配置傳輸模式 GPIO_InitStructure.GPIO_Pin = USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure); //配置接受模式 GPIO_InitStructure.GPIO_Pin = USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure); //配置串口工作模式 USART_InitStructure.USART_BaudRate = USART_BAUDRATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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(USARTx, &USART_InitStructure); //配置中斷 NVIC_Config(); //使能串口中斷 USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); //使能串口 USART_Cmd(USARTx, ENABLE); }
中斷處理函數:
void USART_IRQHandler(void) { uint8_t ucTemp; if(USART_GetITStatus(USARTx,USART_IT_RXNE)!=RESET) { ucTemp = USART_ReceiveData(USARTx); USART_SendData(USARTx,ucTemp); } }
//以上這串代碼就是通過PC上的串口調試助手發送數據到單片機上,然後單片機在把數據發送到PC上的串口調試助手
main.c文件:
#include "bsp_usart.h" int main() { USART_Config(); while(1) { } }
stm32串口通訊