STM32F030F4P6 PA2 PA3串口收发程序

2019-07-21 07:16发布

网上参考大多数都是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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。