STM32自学教程:串口发送与接收操作指南

一、相关函数说明:

 USART_ClockInit()和USART_ClockStructInit(); 用来配置同步时钟输出

 USART_DMACmd(); 开启USART到DMA的触发通道

 USART_SendData(); 发送数据

 USART_ReceiveData(); 接收数据

二、程序代码

serial.c文件

 #include "stm32f10x.h"

#include "stm32f10x_usart.h"

#include "serial.h"

#include "stdio.h"

#include <stdarg.h>

uint8_t serial_RxData;

uint8_t serival_RxFlag;

/*初始化函数*/

void serial_Init(void)

{

/*

 初始化步骤:

 1.开启GPIO和USART时钟

 2.初始化GPIO,把TX配置为复用输出,RX配置为输入

 3.初始化并配置USART 

 4.如果只需要发送的功能,就直接开启USART

 5.如果需要接受数据,还需要配置中断(即在开启USART之前添加ITConfig和NVIC的代码)

 */

 //开启时钟

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 //初始化配置GPIO

 GPIO_InitTypeDef GPIO_InitStruct;

 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;

 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;

 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

 GPIO_Init(GPIOA,&GPIO_InitStruct);

 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;

 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;

 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

 GPIO_Init(GPIOA,&GPIO_InitStruct);

 //初始化配置USART

 USART_InitTypeDef USART_InitStruct;

 USART_InitStruct.USART_BaudRate=9600; //波特率

 USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制

 USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //发送与接受模式

 USART_InitStruct.USART_Parity=USART_Parity_No; //校验位

 USART_InitStruct.USART_StopBits=USART_StopBits_1; //停止位

 USART_InitStruct.USART_WordLength=USART_WordLength_8b; //字长

 USART_Init(USART1,&USART_InitStruct);

 //开启中断

 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

 //配置NVIC

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

 NVIC_InitTypeDef NVIC_InitStruct;

 NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; //中断通道

 NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;  

 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;

 NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

 NVIC_Init(&NVIC_InitStruct);

 //开启USART

 USART_Cmd(USART1,ENABLE);

}

/*发送数据函数(发送一个字节)*/

void serial_SendByte(uint8_t Byte)

{

 USART_SendData(USART1,Byte);

 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

}

/*发送数据函数(发送一个数组)*/

void serial_SendArray(uint8_t *Array,uint16_t Length)

{

 uint16_t i;

 for(i=0;i<Length;i++)

 {

  serial_SendByte(Array[i]);

 }

}

/*发送数据函数(发送一个字符串)*/

void serial_SendString(char *String)

{

 uint8_t i;

 for(i=0;String[i]!='\0';i++)

 {

  serial_SendByte(String[i]);

 }

}

/*发送数据函数(发送一个数字)*/

uint32_t serial_Pow(uint32_t X,uint32_t Y)

{

 uint32_t Result=1;

 while(Y–)

 {

  Result*=X;

 }

 return Result;

}

void serial_SendNumber(uint32_t Number, uint8_t Length)

{

 uint8_t i;

 for(i=0;i<Length;i++)

 {

  serial_SendByte(Number/serial_Pow(10,Length-i-1)%10+'0');

 }

}

/*重写Fputc函数*/

int fputc(int ch,FILE *f)

{

 serial_SendByte(ch);

 return ch;

}

/*封装*/

void serial_Printf(char *format,…)

{

 char String[100];

 va_list arg;

 va_start(arg,format);

 vsprintf(String,format,arg);

 va_end(arg);

 serial_SendString(String);

}

/*读后清除标志位函数*/

uint8_t serial_GetRxFlag(void)

{

 if(serival_RxFlag==1)

 {

  serival_RxFlag=0;

  return 1;

 }

 return 0;

/*读后清除数据函数*/

uint8_t serial_GetRxData(void)

{

 return serial_RxData;

}

 

void USART1_IRQHandler(void)

{

 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)

 {

  serial_RxData=USART_ReceiveData(USART1);

  serival_RxFlag=1;

  USART_ClearITPendingBit(USART1,USART_IT_RXNE);

 }

}

serial.h文件

#ifndef _SERIAL_H

#define _SERIAL_H

#include "stdint.h"

#include <stdio.h>

void serial_Init(void);

void serial_SendByte(uint8_t Byte);

void serial_SendArray(uint8_t *Array,uint16_t Length);

void serial_SendString(char *String);

void serial_SendNumber(uint32_t Number, uint8_t Length);

void serial_Printf(char *format,…);

uint8_t serial_GetRxFlag(void);

uint8_t serial_GetRxData(void);

#endif

main.c文件

#include "stm32f10x.h"

#include "delay.h"

#include "OLED.h"

#include "serial.h"

uint8_t RxData;

int main (void)

 //初始化

 OLED_Init();

 serial_Init();

 OLED_ShowString(1,1,"RxData:");

 while(1)

 {

  if(serial_GetRxFlag()==1)

  {

   RxData=serial_GetRxData();

   serial_SendByte(RxData);

   OLED_ShowHexNum(1,8,RxData,2);

  }

 }

}

 

作者:鯨觞

物联沃分享整理
物联沃-IOTWORD物联网 » STM32自学教程:串口发送与接收操作指南

发表评论