STM32串口硬件電路
開發(fā)板串口硬件電路
STM32串口編程
1、整體流程
?、?開啟GPIO時鐘和USARTX時鐘
② 配置TX和RX引腳
?、?初始化USART控制器
2、細(xì)節(jié)實(shí)現(xiàn)
?、?開啟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的三種串口通信協(xié)議
1、USART
通用同步異步收發(fā)器(USART)提供了一種靈活的方法與使用工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的外部設(shè)備之間進(jìn)行全雙工數(shù)據(jù)交換。
USART支持同步單向通信和半雙工單線通信,也支持LIN(局部互聯(lián)網(wǎng))、智能卡協(xié)議和IrDA(紅外數(shù)據(jù)組織)SIR ENDEC規(guī)范,以及調(diào)制解調(diào)器(CTS/RTS)操作。
USART雙向通信至少需要兩個引腳:接收數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。
同步模式下需要引腳:發(fā)送器時鐘輸出(CK)
IrDA模式需要引腳:數(shù)據(jù)輸入(IrDA_RDI)、數(shù)據(jù)輸出(IrDA_RDO)
USART特點(diǎn):
1. 全雙工操作(相互獨(dú)立的接收數(shù)據(jù)和發(fā)送數(shù)據(jù));
2. 同步操作時,可主機(jī)時鐘同步,也可從機(jī)時鐘同步;
3. 獨(dú)立的高精度波特率發(fā)生器,不占用定時/計數(shù)器;
4. 支持5、6、7、8和9位數(shù)據(jù)位,1或2位停止位的串行數(shù)據(jù)楨結(jié)構(gòu);
5. 由硬件支持的奇偶校驗(yàn)位發(fā)生和檢驗(yàn);
6. 數(shù)據(jù)溢出檢測;
7. 幀錯誤檢測;
8. 包括錯誤起始位的檢測噪聲濾波器和數(shù)字低通濾波器;
9. 三個完全獨(dú)立的中斷,TX發(fā)送完成、TX發(fā)送數(shù)據(jù)寄存器空、RX接收完成;
10.支持多機(jī)通信模式;
11.支持倍速異步通信模式。
2、SPI
串口外圍設(shè)備接口SPI是一種低成本,易使用的接口,主要用于微控制器與外圍設(shè)備芯片之間的連接。SPI接口可以用來連接存儲器、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器、實(shí)時時鐘日歷、LCD驅(qū)動、傳感器、音頻芯片等。
SPI是一個四線接口:主機(jī)輸出/從機(jī)輸入(MOSI)、主機(jī)輸入/從機(jī)輸出(MISO)、串行SCLK或SCK、外設(shè)芯片(CS/)。
SPI是一個同步協(xié)議接口,所有的傳輸都參照一個共同的時鐘,這個時鐘信號由主機(jī)產(chǎn)生。SPI允許芯片與外部設(shè)備以半/全雙工、同步、串行方式通信。
根據(jù)時鐘極性和時鐘相位的不同,SPI有4種工作模式,如圖。
3、I2C
I2C總線是同步通信的一種特殊形式,具有接口少,控制簡單,器件封裝形式小、通信速率較高等優(yōu)點(diǎn)。
I2C總線由數(shù)據(jù)線SDA和時鐘線SCL兩條線構(gòu)成通信線路,既可以發(fā)送數(shù)據(jù),也可以接收數(shù)據(jù)。
I2C總線的操作模式:主發(fā)送模式、從接收模式、從發(fā)送模式、從接收模式。
I2C總線的模擬時序如下圖:
STM32串口通信程序設(shè)計要點(diǎn)
1、要是能串口時鐘同時要是能復(fù)用總線時鐘和對應(yīng)的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,在中斷函數(shù)中加入相應(yīng)的程序。
簡單的配置例程:
/**************************************************************
文件名:USART.c
功能:串口初始化配置以及相關(guān)函數(shù)
串口配置注意事項(xiàng):
1、 stm32f10x_conf.h 中使能
#include “stm32f10x_usart.h”
#include “misc.h”
2、 本文件中定義的串口相關(guān)函數(shù)需要在頭文件中做外部函數(shù)聲明
***************************************************************/
#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);
}
}
評論
查看更多