网上参考大多数都是PA9 PA10做串口1,手册上也写的很清楚,串口1可以在A2 A3和A9 A10切换,一开始根据标准库去写发现不对,然后去网上看找大神的参考,发现几乎都是用的A9 A10,后来再回头看自己的程序发现没什么问题,找了一会发现原来串口线接反了。。。。。程序没有问题,分享出来,减少其他人走完路
/*********************************************C文件********************************************/
#include "fy_includes.h"
_typdef_usart _usart1;
int fputc(int ch, FILE *f)
{
USART_SendData(USART1,(uint8_t)ch);
while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
return (ch);
}
void Usart1_Configuration(u32 baud)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART的时钟
//复用引脚功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); //配置PA2为第二功能引脚 TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);//配置PA3为第二功能引脚 RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baud; //波特率
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);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能接收中断
USART_ITConfig(USART1,USART_IT_IDLE,ENABLE); //使能空闲中断
USART_Cmd(USART1, ENABLE); //使能USART1
// USART1的NVIC中断配置
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void Usart_SendBuf(USART_TypeDef *USARTx,u8 *buf,u16 len)
{
while(len--)
{
USART_SendData(USARTx, *buf++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
void Usart_SendString(USART_TypeDef *USARTx,u8 *str)
{
while(*str!=' ')
{
USART_SendData(USARTx, *str++);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_ORE) != RESET)//过载
{
USART_ClearITPendingBit(USART1,USART_IT_ORE);
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)//传输数据寄存器为空(发送中断)
{
}
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收数据寄存器非空
{
_usart1.rxbuf[_usart1.rxlen++] = USART1->RDR;//USART_ReceiveData(USART1);
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//接收空闲
{
USART_ClearITPendingBit(USART1,USART_IT_IDLE);
Usart_SendBuf(USART1,_usart1.rxbuf,_usart1.rxlen);
_usart1.rxlen=0;
}
}
/*********************************************头文件********************************************/
#ifndef _FY_USART_H
#define _FY_USART_H
#include "fy_includes.h"
typedef struct
{
u8 rxbuf[32],rxlen;
u8 txbuf[32],txlen;
}_typdef_usart;
void Usart1_Configuration(u32 baud);
void Usart_SendBuf(USART_TypeDef *USARTx,u8 *buf,u16 len);
void Usart_SendString(USART_TypeDef *USARTx,u8 *str);
extern u8 u1_rxBuf[128];
#endif
/*********************************************调用********************************************/
Usart1_Configuration(115200);
printf("the usart1 is ok!
");
用printf需要勾选micro lib
2018年12月1日 10:32:00
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>