STM32串口硬件電路
開發板串口硬件電路
STM32串口編程
1、整體流程
① 開啟GPIO時鐘和USARTX時鐘
② 配置TX和RX引腳
③ 初始化USART控制器
2、細節實現
① 開啟GPIO時鐘和USARTX時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
② 配置TX和RX引腳
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
③ 初始化USART控制器
/* USART1 mode config */
USART_InitStructure.USART_BaudRate = 115200;
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(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
STM32F的三種串口通信協議
1、USART
通用同步異步收發器(USART)提供了一種靈活的方法與使用工業標準NRZ異步串行數據格式的外部設備之間進行全雙工數據交換。
USART支持同步單向通信和半雙工單線通信,也支持LIN(局部互聯網)、智能卡協議和IrDA(紅外數據組織)SIR ENDEC規范,以及調制解調器(CTS/RTS)操作。
USART雙向通信至少需要兩個引腳:接收數據輸入(RX)和發送數據輸出(TX)。
同步模式下需要引腳:發送器時鐘輸出(CK)
IrDA模式需要引腳:數據輸入(IrDA_RDI)、數據輸出(IrDA_RDO)
USART特點:
1. 全雙工操作(相互獨立的接收數據和發送數據);
2. 同步操作時,可主機時鐘同步,也可從機時鐘同步;
3. 獨立的高精度波特率發生器,不占用定時/計數器;
4. 支持5、6、7、8和9位數據位,1或2位停止位的串行數據楨結構;
5. 由硬件支持的奇偶校驗位發生和檢驗;
6. 數據溢出檢測;
7. 幀錯誤檢測;
8. 包括錯誤起始位的檢測噪聲濾波器和數字低通濾波器;
9. 三個完全獨立的中斷,TX發送完成、TX發送數據寄存器空、RX接收完成;
10.支持多機通信模式;
11.支持倍速異步通信模式。
2、SPI
串口外圍設備接口SPI是一種低成本,易使用的接口,主要用于微控制器與外圍設備芯片之間的連接。SPI接口可以用來連接存儲器、A/D轉換器、D/A轉換器、實時時鐘日歷、LCD驅動、傳感器、音頻芯片等。
SPI是一個四線接口:主機輸出/從機輸入(MOSI)、主機輸入/從機輸出(MISO)、串行SCLK或SCK、外設芯片(CS/)。
SPI是一個同步協議接口,所有的傳輸都參照一個共同的時鐘,這個時鐘信號由主機產生。SPI允許芯片與外部設備以半/全雙工、同步、串行方式通信。
根據時鐘極性和時鐘相位的不同,SPI有4種工作模式,如圖。
3、I2C
I2C總線是同步通信的一種特殊形式,具有接口少,控制簡單,器件封裝形式小、通信速率較高等優點。
I2C總線由數據線SDA和時鐘線SCL兩條線構成通信線路,既可以發送數據,也可以接收數據。
I2C總線的操作模式:主發送模式、從接收模式、從發送模式、從接收模式。
I2C總線的模擬時序如下圖:
STM32串口通信程序設計要點
1、要是能串口時鐘同時要是能復用總線時鐘和對應的IO時鐘,如:
//使能串口1,PA,AFIO總線
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO |
RCC_APB2Periph_USART1 ,
ENABLE);
2、stm32f10x_conf.h 中使能
#include “stm32f10x_usart.h”
#include “misc.h”
3、使能中斷的話要配置NVIC,在中斷函數中加入相應的程序。
簡單的配置例程:
/**************************************************************
文件名:USART.c
功能:串口初始化配置以及相關函數
串口配置注意事項:
1、 stm32f10x_conf.h 中使能
#include “stm32f10x_usart.h”
#include “misc.h”
2、 本文件中定義的串口相關函數需要在頭文件中做外部函數聲明
***************************************************************/
#include “STM32Lib//stm32f10x.h”
void USART_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
//使能串口1,PA,AFIO總線
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_AFIO |
RCC_APB2Periph_USART1 ,
ENABLE);
/* A9 USART1_Tx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽輸出-TX
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* A10 USART1_Rx */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入-RX
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
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_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
USART_Init(USART1, &USART_InitStructure);
/* Enable the USARTx */
USART_Cmd(USART1, ENABLE);
}
void USART1_Putc(unsigned char c)
{
USART_SendData(USART1, c);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}
void USART1_Puts(char * str)
{
while(*str)
{
USART_SendData(USART1, *str++);
/* Loop until the end of transmission */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
}
評論
查看更多