usart.c(串口)
#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>
void usart_init(void)
{
GPIO_InitTypeDef gpioinstructure;//GPIO结构体初始化函数
USART_InitTypeDef usartinstructure;//USART结构体初始化函数
NVIC_InitTypeDef nvicinstructure;//中断控制器结构体初始化函数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断控制器优先抢占级组
//1.配置GPIO、USART、引脚复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置引脚复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置USART时钟
//2.配置GPIO结构体
//配置PA9 TX 输出引脚
gpioinstructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
gpioinstructure.GPIO_Pin = GPIO_Pin_9 ;//引脚9
gpioinstructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为50Mhz
GPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化
//配置PA10 RX 接收引脚
gpioinstructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输出
gpioinstructure.GPIO_Pin = GPIO_Pin_10;//引脚10
GPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化
//3.配置串口的结构体
usartinstructure.USART_BaudRate = 115200;//波特率为115200
usartinstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流配置
usartinstructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx ;//接收模式
usartinstructure.USART_Parity = USART_Parity_No;//无校验位
usartinstructure.USART_StopBits = USART_StopBits_1;//一个停止位
usartinstructure.USART_WordLength = USART_WordLength_8b;//有效数据位为8位
USART_Init(USART1,&usartinstructure);//初始化串口1
USART_Cmd(USART1,ENABLE); //使能串口1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//串口中断配置
//4.配置中断控制器的结构
nvicinstructure.NVIC_IRQChannel = USART1_IRQn;//中断通道
nvicinstructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
nvicinstructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级配置为1
nvicinstructure.NVIC_IRQChannelSubPriority = 1;//子优先级配置为1
NVIC_Init(&nvicinstructure);//中断控制器初始化
}
//发送字符
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
USART_SendData(USARTx, Data);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
}
//发送字符串
void USARTSendStr(USART_TypeDef* USARTx, char *str)
{
uint16_t i=0;
do
{
USARTSendByte(USARTx,*(str+i));
i++;
}while(*(str+i)!='\0');
while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}
//printf函数的重映射
int fputc(int ch,FILE *f)
{
USART_SendData(USART1,(uint8_t)ch);//发送
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//发送数据寄存器空标志位判断
return (ch);
}
int fgetc(FILE *f)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);//接收数据寄存器非空标志位判断
return (int)USART_ReceiveData(USART1);//返回接收到的字符
}
|