my_usart1.c
/****************重要说明**************
使用此程序需要添加
#include "stdio.h"
#include "stdarg.h"
#include "string.h"
这三个头文件
**********************************/
#include "sys.h"
void My_USART1(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART1_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=USART1_GPIO_PIN_TX;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=USART1_GPIO_PIN_RX;//PA10
GPIO_Init(GPIOA,&GPIO_InitStrue);
USART1_InitStrue.USART_BaudRate=9600;
USART1_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART1_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART1_InitStrue.USART_Parity=USART_Parity_No;
USART1_InitStrue.USART_StopBits=USART_StopBits_1;
USART1_InitStrue.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART1_InitStrue);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//接收中断
USART_Cmd(USART1,ENABLE);
}
void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data));
/* Transmit Data */
USARTx->DR = (Data & (uint16_t)0x01FF);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
__align(8) char USART1_TxBuff[256];
void u1_printf(char* fmt,...)
{
unsigned int i =0,length=0;
va_list ap;
va_start(ap,fmt);
vsprintf(USART1_TxBuff,fmt,ap);
va_end(ap);
length=strlen((const char*)USART1_TxBuff);
while(i<length)
{
USART_SendByte(USART1,USART1_TxBuff[i]);
i++;
}
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
my_usart1.h
#ifndef __MY_USART1_H__
#define __MY_USART1_H__
#include "sys.h"
#define USART1_GPIO_PIN_TX GPIO_Pin_9
#define USART1_GPIO_PIN_RX GPIO_Pin_10
void My_USART1(void);
void u1_printf(char* fmt,...);
extern void USART_SendByte(USART_TypeDef* USARTx, uint16_t Data);
#endif
my_usart2.c
/****************重要说明**************
使用此函数需要添加
#include "stdio.h"
#include "stdarg.h"
#include "string.h"
这三个头文件
**********************************/
#include "sys.h"
u16 USART2_RxCounter = 0;
char USART2_RxBuff[1024];
void My_USART2(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART2_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=USART2_GPIO_PIN_TX;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=USART2_GPIO_PIN_RX;
GPIO_Init(GPIOA,&GPIO_InitStrue);
USART2_InitStrue.USART_BaudRate=115200;
USART2_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART2_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART2_InitStrue.USART_Parity=USART_Parity_No;
USART2_InitStrue.USART_StopBits=USART_StopBits_1;
USART2_InitStrue.USART_WordLength=USART_WordLength_8b;
USART_Init(USART2,&USART2_InitStrue);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_Cmd(USART2,ENABLE);
}
__align(8) char USART2_TxBuff[256];
void u2_printf(char* fmt,...)
{
unsigned int i =0,length=0;
va_list ap;
va_start(ap,fmt);
vsprintf(USART2_TxBuff,fmt,ap);
va_end(ap);
length=strlen((const char*)USART2_TxBuff);
while(i<length)
{
USART_SendByte(USART2,USART2_TxBuff[i]);
i++;
}
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
if(USART2->DR)
{
USART2_RxBuff[USART2_RxCounter]=USART_ReceiveData(USART2);
USART2_RxCounter++;
}
}
};
my_usart2.h
#ifndef __MY_USART2_H__
#define __MY_USART2_H__
#include "sys.h"
#define USART2_GPIO_PIN_TX GPIO_Pin_2
#define USART2_GPIO_PIN_RX GPIO_Pin_3
extern u16 USART2_RxCounter;
extern char USART2_RxBuff[1024];
void My_USART2(void);
void u2_printf(char* fmt,...);
#endif
在系统文件添加中断函数
sys.c
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
在sys.h声明
void NVIC_Config(void);