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

}

}

}

相关推荐
蓝斯4979 小时前
从.到实现一个Windows上的虚拟hid键盘设备
windows·单片机·计算机外设
熙芯XiChip10 小时前
硬实时与软实时RTOS核心区别
嵌入式硬件
伟大的前程10 小时前
unsigned int 定义的变量 在 电脑的 64 位系统中 和 32 位 cortex-m0 和 8 位的 51 单片机
单片机·嵌入式硬件
小渔村的拉线工10 小时前
1.HPM6E80 解析芯片整体工作原理和存储架构
单片机·嵌入式硬件·mcu·架构·hpm6e80
熙芯XiChip11 小时前
CAN与CANopen的本质区别
单片机
lilihewo11 小时前
Altium Designer 封装库的创建(分享pcb 3D封装库)
嵌入式硬件·51单片机
神罚天下ET12 小时前
典型arm位单片机启动流程(从上电到main.c)
c语言·arm开发·单片机
碧海银沙音频科技研究院13 小时前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
Zevalin爱灰灰14 小时前
模拟信号链电路——基于TL431的电压基准电路
单片机·嵌入式硬件
csdn杰哥14 小时前
瑞萨单片机开发教程[二十七] DTC 外部中断触发传输实验
单片机·嵌入式硬件·mongodb·瑞萨·ra6m5