stm32串口的配置過(guò)程
<一>配置串口用到的IO口:①Rx浮空輸入②Tx復(fù)用推挽輸出
注意:具體配置如下
//GPIOA.9/10用于串口通信
//設(shè)定GPIOA.9(USART.Tx)為復(fù)用推挽輸出
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);
//設(shè)定GPIOA.10(USART.Rx)為浮空輸入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
這里使用哪個(gè)端口的哪二個(gè)引腳可以自己選擇?。。?/p>
<二>配置USARTx,主要是 USART_InitTypeDef結(jié)構(gòu)體下的幾個(gè)成員包括波特率,字節(jié)長(zhǎng),停止位,校驗(yàn)位,硬件流,接受發(fā)送等等
注意:具體配置如下
voidUSART_Configuration(void)
{
//定義USART初始化結(jié)構(gòu)體
USART_InitTypeDef USART_InitStructure;
//設(shè)置波特率
USART_InitStructure.USART_BaudRate = 9600;
//設(shè)置傳輸位寬
USART_InitStructure.USART_WordLength =USART_WordLength_8b;
//設(shè)置停止位
USART_InitStructure.USART_StopBits =USART_StopBits_1;
//設(shè)置奇偶校驗(yàn)
USART_InitStructure.USART_Parity =USART_Parity_No;
//設(shè)置硬件流控制功能
USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
//設(shè)置工作方式為接受方式
USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx;
//初始化串行口
USART_Init(USART1,&USART_InitStructure);
//打開(kāi)接收中斷
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//打開(kāi)發(fā)送完中斷
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
//使能串行口
USART_Cmd(USART1,ENABLE);
}
<三>使能串口中需要用到的中斷
這些中斷如下- USART_IT_CTS: CTS改變中斷(對(duì)于UART4和UART5無(wú)法使用)
*- USART_IT_LBD: LIN間隔偵測(cè)中斷
*- USART_IT_TXE:發(fā)送寄存器空中斷
*- USART_IT_TC:發(fā)送完成中斷
*- USART_IT_RXNE:接收寄存器全滿中斷
*- USART_IT_IDLE: IDLE線性中斷
*- USART_IT_PE:奇偶錯(cuò)誤中斷
*- USART_IT_ERR:錯(cuò)誤中斷(楨錯(cuò)誤,噪聲錯(cuò)誤,超速錯(cuò)誤
注意:具體配置如下
//打開(kāi)接收中斷
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//打開(kāi)發(fā)送完中斷
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
這里需要用到什么中斷就調(diào)用函數(shù)開(kāi)啟哪個(gè)
<四>使能串口
注意:具體配置如下
//使能串行口
USART_Cmd(USARTx,ENABLE);
<五>打開(kāi)串口時(shí)鐘(有的工程把所有的需要開(kāi)啟的時(shí)鐘,放在一個(gè)文件里開(kāi)啟,這里自由選擇,)
注意:具體配置如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);需要什么時(shí)鐘就開(kāi)啟哪個(gè)時(shí)鐘,
⑵還有一種辦法就是用如下程序下面的配置用到哪個(gè)時(shí)鐘就開(kāi)啟哪個(gè)時(shí)鐘:
void RCC_Configuration(void)
{
ErrorStatusHSEStartUpStatus;
/*將外設(shè)RCC寄存器重設(shè)為缺省值 */
RCC_DeInit();
/*設(shè)置外部高速晶振(HSE)*/
RCC_HSEConfig(RCC_HSE_ON);//RCC_HSE_ON--HSE晶振打開(kāi)(ON)
/*等待HSE起振*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振穩(wěn)定且就緒
{
/*設(shè)置AHB時(shí)鐘(HCLK)*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);//RCC_SYSCLK_Div1--AHB時(shí)鐘 =系統(tǒng)時(shí)鐘
/*設(shè)置高速APB時(shí)鐘(PCLK2)*/
RCC_PCLK2Config(RCC_HCLK_Div1);//RCC_HCLK_Div1--APB2時(shí)鐘 = HCLK ,最大72MHz
/*設(shè)置低速APB時(shí)鐘(PCLK1)*/
RCC_PCLK1Config(RCC_HCLK_Div2);//RCC_HCLK_Div2--APB1時(shí)鐘 = HCLK / 2 ,最大36MHz
/*設(shè)置FLASH存儲(chǔ)器延時(shí)時(shí)鐘周期數(shù)*/
FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_22延時(shí)周期
/*選擇FLASH預(yù)取指緩存的模式*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//預(yù)取指緩存使能
/*設(shè)置PLL時(shí)鐘源及倍頻系數(shù)*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
// PLL的輸入時(shí)鐘 = HSE時(shí)鐘頻率;RCC_PLLMul_9--PLL輸入時(shí)鐘x 9
/*使能PLL */
RCC_PLLCmd(ENABLE);
/*檢查指定的RCC標(biāo)志位(PLL準(zhǔn)備好標(biāo)志)設(shè)置與否*/
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) ==RESET)
{
}
/*設(shè)置系統(tǒng)時(shí)鐘(SYSCLK) */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK--選擇PLL作為系統(tǒng)時(shí)鐘
/* PLL返回用作系統(tǒng)時(shí)鐘的時(shí)鐘源*/
while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作為系統(tǒng)時(shí)鐘
{
}
}
////設(shè)置ADC的預(yù)分頻器
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
//開(kāi)啟APB2上的GPIOA時(shí)鐘、GPIOB時(shí)鐘、GPIOC時(shí)鐘、GPIOD時(shí)鐘、GPIOE的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF,ENABLE);
//開(kāi)啟APB2上USART1、ADC1、ADC2的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2|RCC_APB2Periph_ADC3,ENABLE);
//開(kāi)啟AHB總線上的DMA1的時(shí)鐘
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//開(kāi)啟APB2上的AFIO功能用于中斷
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);
//開(kāi)啟APB1總線上的TIM2的時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//開(kāi)啟APB1總線上的TIM3的時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//開(kāi)啟APB1總線上的TIM4的時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//設(shè)置ADC的預(yù)分頻,保證ADC的時(shí)鐘不大于14MHz,負(fù)責(zé)影響精度;在72MHz的下,采用6分頻。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
}
<六>配置NVIC:使能串口中斷,同時(shí)要設(shè)置中斷的優(yōu)先級(jí)
注意:具體配置如下
//使能USART1中斷,0級(jí)先占優(yōu)先級(jí)和0級(jí)次優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
<七>在中斷向量表中app_vetc_vs.c中加入串口中斷
<八>在中斷函數(shù)中USARTx_IRHandler中寫入中斷函數(shù)。