OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5287|回复: 6

STM32F030F4P6 PA2 PA3串口收发程序

[复制链接]

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
发表于 2018-12-1 10:32:07 | 显示全部楼层 |阅读模式
网上参考大多数都是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!='\0')
        {                       
                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!\r\n");

用printf需要勾选micro lib

2018年12月1日 10:32:00
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6449
金钱
6449
注册时间
2018-6-27
在线时间
546 小时
发表于 2018-12-2 08:21:14 | 显示全部楼层
谢谢分享,学习学习。
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-2-2
在线时间
4 小时
发表于 2020-2-3 12:03:42 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-3-12
在线时间
0 小时
发表于 2020-3-12 14:01:14 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-3-23
在线时间
3 小时
发表于 2020-3-24 14:20:46 | 显示全部楼层
很棒,学习一下。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-6-22
在线时间
7 小时
发表于 2020-8-5 13:46:24 | 显示全部楼层
用printf需要勾选micro lib

谁能告诉我在哪勾选吗
回复 支持 反对

使用道具 举报

16

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2016-4-4
在线时间
54 小时
 楼主| 发表于 2020-9-9 12:18:22 | 显示全部楼层
mateng 发表于 2020-8-5 13:46
用printf需要勾选micro lib

谁能告诉我在哪勾选吗

魔术棒里面
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 11:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表