<一>配置串口用到的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);
這里使用哪個端口的哪二個引腳可以自己選擇?。?!
<二>配置USARTx,主要是 USART_InitTypeDef結(jié)構(gòu)體下的幾個成員包括波特率,字節(jié)長,停止位,校驗位,硬件流,接受發(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è)置奇偶校驗
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);
//打開接收中斷
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//打開發(fā)送完中斷
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
//使能串行口
USART_Cmd(USART1,ENABLE);
}
<三>使能串口中需要用到的中斷
這些中斷如下- USART_IT_CTS: CTS改變中斷(對于UART4和UART5無法使用)
*- USART_IT_LBD: LIN間隔偵測中斷
*- USART_IT_TXE:發(fā)送寄存器空中斷
*- USART_IT_TC:發(fā)送完成中斷
*- USART_IT_RXNE:接收寄存器全滿中斷
*- USART_IT_IDLE: IDLE線性中斷
*- USART_IT_PE:奇偶錯誤中斷
*- USART_IT_ERR:錯誤中斷(楨錯誤,噪聲錯誤,超速錯誤
注意:具體配置如下
//打開接收中斷
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//打開發(fā)送完中斷
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
這里需要用到什么中斷就調(diào)用函數(shù)開啟哪個
<四>使能串口
注意:具體配置如下
//使能串行口
USART_Cmd(USARTx,ENABLE);
<五>打開串口時鐘(有的工程把所有的需要開啟的時鐘,放在一個文件里開啟,這里自由選擇,)
注意:具體配置如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);需要什么時鐘就開啟哪個時鐘,
⑵還有一種辦法就是用如下程序下面的配置用到哪個時鐘就開啟哪個時鐘:
void RCC_Configuration(void)
{
ErrorStatusHSEStartUpStatus;
/*將外設(shè)RCC寄存器重設(shè)為缺省值 */
RCC_DeInit();
/*設(shè)置外部高速晶振(HSE)*/
RCC_HSEConfig(RCC_HSE_ON);//RCC_HSE_ON--HSE晶振打開(ON)
/*等待HSE起振*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE晶振穩(wěn)定且就緒
{
/*設(shè)置AHB時鐘(HCLK)*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);//RCC_SYSCLK_Div1--AHB時鐘 =系統(tǒng)時鐘
/*設(shè)置高速APB時鐘(PCLK2)*/
RCC_PCLK2Config(RCC_HCLK_Div1);//RCC_HCLK_Div1--APB2時鐘 = HCLK ,最大72MHz
/*設(shè)置低速APB時鐘(PCLK1)*/
RCC_PCLK1Config(RCC_HCLK_Div2);//RCC_HCLK_Div2--APB1時鐘 = HCLK / 2 ,最大36MHz
/*設(shè)置FLASH存儲器延時時鐘周期數(shù)*/
FLASH_SetLatency(FLASH_Latency_2); //FLASH_Latency_22延時周期
/*選擇FLASH預(yù)取指緩存的模式*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//預(yù)取指緩存使能
/*設(shè)置PLL時鐘源及倍頻系數(shù)*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
// PLL的輸入時鐘 = HSE時鐘頻率;RCC_PLLMul_9--PLL輸入時鐘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)時鐘(SYSCLK) */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//RCC_SYSCLKSource_PLLCLK--選擇PLL作為系統(tǒng)時鐘
/* PLL返回用作系統(tǒng)時鐘的時鐘源*/
while(RCC_GetSYSCLKSource() != 0x08) //0x08:PLL作為系統(tǒng)時鐘
{
}
}
////設(shè)置ADC的預(yù)分頻器
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
//開啟APB2上的GPIOA時鐘、GPIOB時鐘、GPIOC時鐘、GPIOD時鐘、GPIOE的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF,ENABLE);
//開啟APB2上USART1、ADC1、ADC2的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_ADC1|RCC_APB2Periph_ADC2|RCC_APB2Periph_ADC3,ENABLE);
//開啟AHB總線上的DMA1的時鐘
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//開啟APB2上的AFIO功能用于中斷
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);
//開啟APB1總線上的TIM2的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//開啟APB1總線上的TIM3的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//開啟APB1總線上的TIM4的時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
//設(shè)置ADC的預(yù)分頻,保證ADC的時鐘不大于14MHz,負(fù)責(zé)影響精度;在72MHz的下,采用6分頻。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
}
<六>配置NVIC:使能串口中斷,同時要設(shè)置中斷的優(yōu)先級
注意:具體配置如下
//使能USART1中斷,0級先占優(yōu)先級和0級次優(yōu)先級
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ù)。