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(Arrayi);

}

}

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

void serial_SendString(char *String)

{

uint8_t i;

for(i=0;Stringi!='\0';i++)

{

serial_SendByte(Stringi);

}

}

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

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 String100;

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);

}

}

}

相关推荐
comyccccc17 分钟前
平衡车底板设计:精准布局与高效布线学习笔记
单片机·嵌入式硬件
La Pulga28 分钟前
【FreeRTOS源码学习笔记】任务创建
笔记·stm32·mcu·学习·嵌入式·freertos·实时操作系统
芯片人0071 小时前
GEK100系列芯片进入上市公司上海移远通信供应链
人工智能·单片机·嵌入式硬件·物联网·芯片
fly_sunnn2 小时前
ADC模数转换器
单片机·嵌入式硬件
我叫洋洋2 小时前
I2C 为什么必须用开漏输出?从推挽短路、线与,到上拉电阻取值
单片机·嵌入式硬件
无敌贵点大王3 小时前
从寄存器层面重学STM32(5)——串口USART理论部分
stm32·单片机·嵌入式硬件
女神下凡3 小时前
芯参谋(83):AliOS Things_驱动开发指南
arm开发·驱动开发·单片机·嵌入式硬件·设计规范·1024程序员节
女神下凡3 小时前
芯参谋(84):Linux eMMC 驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件
szxinmai主板定制专家15 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB202617 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程