写一个STM32串口驱动程序
时间: 2023-06-05 07:07:38 浏览: 41
很高兴为您服务,我可以为您提供一个STM32串口驱动程序的示例:
#include <stm32f10x.h>
//Define USART1
#define USART1_DR_Base 0x40013804
#define USART1_BRR 0x40013808
#define USART1_CR1 0x4001380C
#define USART1_CR2 0x40013810
#define USART1_CR3 0x40013814
#define USART1_GTPR 0x40013818
//Define USART1 Baudrate
#define USART1_Baudrate 9600
//Define USART1 GPIO
#define USART1_GPIO_TX GPIOA,GPIO_Pin_9
#define USART1_GPIO_RX GPIOA,GPIO_Pin_10
//Define USART1 GPIO Mode
#define USART1_GPIO_Mode GPIO_Mode_AF_PP
//Define USART1 GPIO Speed
#define USART1_GPIO_Speed GPIO_Speed_50MHz
//Define USART1 GPIO Remap
#define USART1_GPIO_Remap GPIO_Remap_USART1
//Function Prototype
void USART1_Init(void);
void USART1_SendByte(uint8_t data);
uint8_t USART1_ReceiveByte(void);
//USART1 Init Function
void USART1_Init(void)
{
//Define Local Variables
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//Enable USART1 and GPIOA Periph Clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
//Configure USART1_TX and USART1_RX Pin
GPIO_InitStructure.GPIO_Pin = USART1_GPIO_TX | USART1_GPIO_RX;
GPIO_InitStructure.GPIO_Mode = USART1_GPIO_Mode;
GPIO_InitStructure.GPIO_Speed = USART1_GPIO_Speed;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Remap USART1_TX and USART1_RX
GPIO_PinRemapConfig(USART1_GPIO_Remap, ENABLE);
//Configure USART1
USART_InitStructure.USART_BaudRate = USART1_Baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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);
//Enable USART1
USART_Cmd(USART1, ENABLE);
//Configure USART1 NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//USART1 Send Byte Function
void USART1_SendByte(uint8_t data)
{
USART_SendData(USART1, data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
//USART1 Receive Byte Function
uint8_t USART1_ReceiveByte(void)
{
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
return (uint8_t)USART_ReceiveData(USART1);
}