打印
[STM32F4]

串口通信(基于keil5.13)

[复制链接]
1352|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Roderman_z|  楼主 | 2016-4-18 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TM32F411一共有三个串口,分别是串口一,串口二和串口六。这个串口折腾了好多好多天,说多了都是泪,我一开始就上串口二,没想到串口二是个坑!!!!!使劲调都调不通,最后还是放弃先,之后试了试串口一和串口六,一试就通!   

别跟我说是不是硬件问题,或者说是不是串口二的时钟没开之类的!都不是!!!!!我调通串口一和串口六之后,试了试用stn32的专用库来试试,我擦想死的心都有,一下就成了!!!别烦我先,我一个人想静静,别问静静是谁!     为什么标准库不行!!!!请广大网友解决这个问题能发发善心告诉我,这里我奉上我调通的三个串口源码。(串口一和串口六我都写好接收中断了,串口二仅仅写好了发送的没写接收的)
(1)建立工程,新建工程的步骤就不说了!
(2)新建bsp_usart.c和bsp_usart.h
bsp_usart.c
#include "bsp_usart.h"
void NVIC_USART1_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

void USART1_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        //串口1对应引脚复用映射
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
        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_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);            
                        
        NVIC_USART1_Config();

        USART_InitStructure.USART_BaudRate=115200;
        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_Cmd(USART1,ENABLE);        
}
/// 重定向c库函数printf到USART1
int fputc(int ch, FILE *f)
{
                /* 发送一个字节数据到USART1 */
                USART_SendData(USART1, (uint8_t) ch);
               
                /* 等待发送完毕 */
                while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
        
                return (ch);
}

/// 重定向c库函数scanf到USART1
int fgetc(FILE *f)
{
                /* 等待串口1输入数据 */
                while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

                return (int)USART_ReceiveData(USART1);
}
/*********************************************END OF FILE**********************/


沙发
Roderman_z|  楼主 | 2016-4-18 22:09 | 只看该作者
bsp_usart.h
#ifndef _BSP_USART_H_
#define _BSP_USART_H_

#include "stm32f4xx.h"
#include <stdio.h>
void USART1_Config(void);
#endif
(3)修改stm32f4xx_it.c
void USART1_IRQHandler(void)
{
        char c;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                c=USART_ReceiveData(USART1);
                USART_SendData(USART1,c);
        }
}
编译下载后利用USB转串口下载器进行通信(大家可以利用市面上的开发板的串口部分),打开串口助手后,给板子复位后



温馨提示,如果你要用串口二则板子的A2 和A3外引接口是没有跟MCU链接的   不过ST-link中的RX ,TX就是连上MCU的串口二的  我们也可以往这连!


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

354

帖子

2

粉丝