STM32之开发利器(USART)

STM32之开发利器(USART)

// 支持printf函数, 不需要选择use MicroLIB      
#if  1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE
{
    int handle;

};

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x)
{
    x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
    return ch;
}
#endif

  1. u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节
  2. .#if EN_USART1_RX   //如果使能了接收
  3. u16 USART_RX_STA=0;       //接收状态标记      
  4.  
  5. void uart_init( ){        //串口gpio,中断优先级,串口模式配置初始化
  6.   //GPIO端口设置
  7.   GPIO_InitTypeDef GPIO_InitStructure;        //初始化结构体
  8.     USART_InitTypeDef USART_InitStructure; 
  9.     NVIC_InitTypeDef NVIC_InitStructure;
  10.     
  11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟
  12.  
  13.     //USART1_TX   GPIOA.9
  14.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  15.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出(必须设定)
  17.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
  18.    
  19.   //USART1_RX      GPIOA.10初始化
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  22.   GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
  23.   //Usart1 NVIC 中断配置
  24.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  25.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  26.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
  27.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
  28.     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
  29.  
  30.    //USART 初始化设置
  31.     USART_InitStructure.USART_BaudRate = 115200;//串口波特率
  32.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  33.     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  34.     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  35.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  36.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
  37.   USART_Init(USART1, &USART_InitStructure); //初始化串口1
  38.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  39.   USART_Cmd(USART1, ENABLE);                    //使能串口1
  40. }
  41. void USART1_IRQHandler(void)                    //串口1中断服务程序
  42.     {
  43.     u8 Res;
  44.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断标志位检测(接收到的数据必须是0x0d 0x0a结尾)
  45.         {
  46.         Res =USART_ReceiveData(USART1);    //读取接收到的数据
  47.         
  48.         if((USART_RX_STA&0x8000)==0)//接收未完成
  49.             {
  50.             if(USART_RX_STA&0x4000)//接收到了0x0d
  51.                 {
  52.                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  53.                 else USART_RX_STA|=0x8000;    //接收完成了
  54.                 }
  55.             else //还没收到0X0D
  56.                 {    
  57.                 if(Res==0x0d)USART_RX_STA|=0x4000;
  58.                 else
  59.                     {
  60.                     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  61.                     USART_RX_STA++;
  62.                     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收      
  63.                     }        
  64.                 }
  65.             }           
  66.      }
  67.  
  68. }
  1. //可用以下3句函数配置发送和接受信息,便于调试
  2. void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
  3. uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
  4. printf("xxxxxxxxxxxxxxxxxx ");

//备注,0xoa和0x0d代表回车和空格,用做判断数据是否接收完毕!!

调用串口函数打印数据前必须在主函数中必须加串口初始化uart_init( );否则无法使用!!!

猜你喜欢

转载自blog.csdn.net/iyy123IUU/article/details/86169381