×
单片机 > 单片机程序设计 > 详情

【STM32F103攻城笔记】串口 实战

发布时间:2020-05-23 发布时间:
|

编写串口流程很简单:初始化端口 ==> 发送程序编写 + 接受程序编写 ==> 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输出数据了!

关键字:STM32F103攻城笔记  串口  实战

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于单片机的医院护理呼叫对讲系统设计