【STM32F103攻城笔记】串口 实战

串口的理论知识就不重复了!


编写串口流程很简单:初始化端口 ==> 发送程序编写 + 接受程序编写 ==> PC串口调试助手


第一步:因为涉及接受和发送的优先级,所以在初始化串口端口之前必须先初始化中断的设置,下面就先给出主函数的程序:


int main(void)
{
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断向量的初始化
   Usart_Init(115200);                             //串口初始化


  USART_SendData(USART1,0x88);
}


第二步:对Usart_Init()函数进行书写,代码如下:


void Usart_Init(u32 BaundRate) //参数表示传输数据的波特率 这个可以自己选择,一般9600或112500
{
  GPIO_InitTypeDef GPIO_InitStructure;    //IO口功能
  USART_InitTypeDef USART_InitStructure;  //串口功能
  NVIC_InitTypeDef NVIC_InitStructure;    //中断功能
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能串口1和相对应的PA口的时钟
  
  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);                //PA9 设置成输出模式,即TX 发送脚
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                //PA10 设置成输入模式 即RX 读取脚


  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       //选择串口1中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//设置先占优先级3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //设置从优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //中断使能
  NVIC_Init(&NVIC_InitStructure);
  
  USART_InitStructure.USART_BaudRate = BaundRate;            //波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据格式
  USART_InitStructure.USART_StopBits = USART_StopBits_1;     //1位校验码
  USART_InitStructure.USART_Parity = USART_Parity_No;      
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    


  USART_Init(USART1, &USART_InitStructure);  //初始化

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接受中断
  USART_Cmd(USART1, ENABLE);      //使能串口1              
}


这样关于串口1的初始化就好了;




第三步:接受中断处理函数的编程,我们要使接受到的数据发送出去,代码如下:




void USART1_IRQHandler(void)    //接受中断函数            
{
USART_SendData(USART1,USART_ReceiveData(USART1)); //将接受到的数据发送出去



运行上面的程序,在PC端的串口调试助手会接受到0x80,如果通过串口发送任何字符,你会发现单片机会发送回你发送的数据并显示在串口接受界面里!


最后加一个对于printf的说明,虽然printf方便,但一般我们调试不用printf发送数据,因为对于单片机来说耗内存!
下面的方法可以直接引用printf,在串口初始化函数文件增加以下代码:


#if 1
#pragma import(__use_no_semihosting)                            
struct __FILE 

int handle; 
}; 


FILE __stdout;       
_sys_exit(int x) 

x = x; 

int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0); 
    USART1->DR = (u8) ch;      
return ch;
}
#endif 


这样文明就可以直接使用printf输出数据了!

你可能感兴趣的:(printf,串口,stm32,usart)