下面按照这个一般步骤来进行一个简单的串口程序:
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
// 打开串口GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能
// 将USART Tx的GPIO配置为推挽复用模式 USART1_TX GPIOA.9
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
// 将USART Rx的GPIO配置为浮空输入模式 USART1_RX GPIOA.10
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
// 打开串口外设的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口端口使能
// 配置串口的工作参数
// 配置波特率
USART_InitStrue.USART_BaudRate=115200;
// 配置硬件流控制
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
// 配置工作模式,收发一起
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
// 配置校验位无奇偶校验位
USART_InitStrue.USART_Parity=USART_Parity_No;
// 配置停止位一个停止位
USART_InitStrue.USART_StopBits=USART_StopBits_1;
// 配置数据字长8位数据格式
USART_InitStrue.USART_WordLength=USART_WordLength_8b;
// 完成串口的初始化配置
USART_Init(USART1,&USART_InitStrue);//
// 使能串口
USART_Cmd(USART1,ENABLE);
//开启接收中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//配置USART为中断源
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
//使能中断
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
//抢断优先级
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
//子优先级
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
//初始化配置NVIC
NVIC_Init(&NVIC_InitStrue);
}
//串口1中断服务程序
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_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;//接收数据错误,重新开始接收
}
}
}
}
}
int main(void)
{
/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
My_USART1_Init();
while(1);
}
|