天天看点

【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输出数据了!

继续阅读