379
社区成员




#include "usart.h"
void Usart1_Config(uint32_t bond)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//打开A端口时钟
GPIO_InitTypeDef GPIO_InitStruct={0};
//设置PA9为复用推挽输出
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//设置端口为复用模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//无上下拉电阻,即浮空
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitStruct);
// //配置PA10为复用输入
// GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//设置端口为复用
//// GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
// GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉电阻,即浮空
//// GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
// GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
// GPIO_Init(GPIOA,&GPIO_InitStruct);
//复用功能映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//PA9复用为串口1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10复用为串口1
//串口配置 1.打开Usart1的时钟 2.1:232协议,1+8+0+1 2.2 波特率 2.3 接收发送使能
RCC_AHB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//打开串口1时钟
USART_InitTypeDef USART_InitStruct={0};
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件控制
USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8位数据长度
USART_InitStruct.USART_Parity = USART_Parity_No;//无奇偶校验
USART_InitStruct.USART_StopBits = USART_StopBits_1;//停止位1
USART_InitStruct.USART_BaudRate = bond;//波特率
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接收和发送模式
USART_Init(USART1,&USART_InitStruct);//初始化串口1
USART_Cmd(USART1,ENABLE);//使能串口1
//对串口1进行中断配置
USART1_NVICConfig();
}
//对串口1进行中断配置
void USART1_NVICConfig(void)
{
//配置中断源(开启串口1接收和空闲中断)
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
// USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);
//配置中断通道
NVIC_InitTypeDef NVIC_InitStruct={0};
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//中断通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//中断通道使能
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//该通道的占先优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//次级优先级
NVIC_Init(&NVIC_InitStruct);//初始化中断配置
}
//串口1的中断服务函数
struct Usart_massage Usart1_massage;
void USART1_IRQHandler(void)
{
u8 temp;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){//若接收中断置位
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除接收中断标志位
temp = USART_ReceiveData(USART1); //USART1->DR;保存数据
USART_SendData(USART1,temp);
}
// if(USART_GetFlagStatus(USART1,USART_IT_IDLE)==SET){//若空闲中断置位(接收完成)
// USART_ClearITPendingBit(USART1,USART_IT_IDLE); //清除空闲中断标志位
// Usart1_massage.recv_flag = 1;//数据接收完成
// }
}
int fputc(int ch,FILE *f)
{
while((USART1->SR&0x40) == 0);//循环发送,直到数据发送完毕
USART1->DR = (u8)ch;
return ch;
}有问题吗?