1. 程式人生 > >stm32串口通訊

stm32串口通訊

啟動 group while floating uart nvic type 同一時間 技術分享

這篇主要了解通訊的概念:

全雙工:同一時刻,兩個設備之間可以同時收發數據;

半雙工:兩個設備之間可以收發數據,但不能在同一時間;

單工 一個設備固定發送,一個設備固定接收;

同步通訊:收發設備會使用一根信號線作為時鐘信號,在其驅動下,雙方進行協調以同步數據,通過規定在時鐘的上升沿或下降沿對數據進行采集;

異步通訊:不使用時鐘線,它在數據信號裏穿插一些同步作用的信號位;或者以數據幀的格式傳輸,可以約定好傳輸速率,以便更好的同步。

比特率:每秒傳輸的二進制位數;

波特率:每秒傳輸的碼元數;

串口通訊:現在使用到的一般是:RXDTXDGND三條信號線,數據包由發送設備通過自身的TXD接口傳輸到接收設備的

RXD接口;協議層規定了數據包由起始位,主體數據,校驗位,停止位組成;通訊雙方的數據包的格式要一致才能正常收發數據;

  1. 起始位:一個邏輯0的數據位表示;
  2. 主體數據:通常被約定位5,6,7,8,位長;
  3. 校驗位:奇偶校驗,01校驗,無校驗;
  4. 停止信號:由0.5,1,1.52個邏輯1的數據位表示;

USART:通用同步異步收發器

UART:通用異步收發器

技術分享圖片

bsp_usart.h文件:

#ifndef __USART_H
#define __USART_H
#include"stm32f10x.h"
#include"stdio.h"
#define USARTx                        USART1
#define
USART_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 #define
USART_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串口通訊