當(dāng)你需要設(shè)計(jì)一個(gè)上位機(jī)是串口通信必然是最基本的組件,STM32固件庫為串口通信的操作提供了很多有用的函數(shù),使得我們在使用串口時(shí)不必關(guān)注底層硬件的操作,使用相關(guān)函數(shù)即可,下面介紹串口操作的要點(diǎn)。
使用串口必然就要用到GPIO口,那么第一步就是配置GPIO口,STM32USART1的發(fā)送和接受引腳分別是PA9,PA10,初始化該兩只引腳的操作如下:
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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
配置PA9為復(fù)用推挽輸出,PA10為浮空輸入。
打開PA口和串口時(shí)鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
配置串口工作模式:
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_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
配置接受中斷:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPrio rity= 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
以上均為串口硬件的配置,為了方便的使用stdio.h中的printf函數(shù),還需要重定向fputc函數(shù):
///重定向c庫函數(shù)printf到USART1
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return (ch);
}
好了,下面就可以直接在主函數(shù)中使用printf函數(shù)輸出了,在接收字符時(shí),需要在中斷函數(shù)中編寫相應(yīng)的函數(shù):
void USART1_IRQHandler(void)
}
效果如下:在主函數(shù)中輸出想要輸出的內(nèi)容,在串口調(diào)試助手中輸入內(nèi)容,最后所有字符都顯示在串口調(diào)試助手的接收處: