下面按照这个一般步骤来进行一个简单的串口程序:
- 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);
-
- }
|