一、實驗?zāi)康?/p>
STM32 通過串口和上位機的對話,STM32 在收到上位機發(fā)過來的字符串后,原原本本的返回給上位機。
二、STM32串口簡介
STM32F103ZET6 最多可提供 5 路串口,有分?jǐn)?shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持 LIN、 支持調(diào)制解調(diào)器操作、 智能卡協(xié)議和 IrDA SIR
ENDEC規(guī)范、具有 DMA等。
我們這里使用的是USART1。
串口設(shè)置的步驟:
1) 串口時鐘使能, GPIO 時鐘使能
2) 串口復(fù)位
3) GPIO 端口模式設(shè)置
4) 串口參數(shù)初始化
5) 開啟中斷并且初始化 NVIC(如果需要開啟中斷才需要這個步驟)
6) 使能串口
7) 編寫中斷處理函數(shù)
三、硬件設(shè)計
LED燈、串口1。
四、軟件設(shè)計
usart.c文件
對串口和IO進(jìn)行設(shè)置!
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能時鐘
USART_DeInit(USART1);//串口復(fù)位
//USART1_TXPA.9IO口設(shè)置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//USART1_RXPA.10
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//Usart1NVIC初始化
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//USART參數(shù)初始化
USART_InitStructure.USART_BaudRate=bound;;
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_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟中斷
USART_Cmd(USART1,ENABLE);//串口使能
}
在串口的接收方面,原子哥設(shè)計了一個接受協(xié)議,學(xué)習(xí)啦!就是自己定義一個全局變量,將這個變量看作是一個寄存器,是16位的,最高位當(dāng)作接收完成的標(biāo)識位,第14位當(dāng)作接收到0x0D標(biāo)識(回車的表示由兩個字節(jié)組成0x0D 和 0x0A,當(dāng)接收到這個兩個字節(jié)時表示接收完成);第13位-第0位,表示接受到的數(shù)據(jù)數(shù)目。
具體的程序是:
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
elseUSART_RX_STA|=0x8000;//接收完成了
}
else//還沒收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))
USART_RX_STA=0;//接收數(shù)據(jù)錯誤,重新開始接收
}
}
}
五、實驗結(jié)果
成功!