• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

配置两个串口的问题

hehung 2018-05-01 浏览量:1238

同时使用两个串口可以正常的发送,但是不能接收,单独使用的时候既可以发送又可以接收,并且单独使用的时候发送的时候可以使用printf进行发送,一起使用的使用就不能用printf了,为什么?下面是对两个串口的配置,最开始串口接收中断是没有屏蔽的,最后接受不了才屏蔽的。

/**
  
******************************************************************************
  * @file    bsp_usart.c
  * @author  fire
  * @version V1.0
  * @date    2013-xx-xx
  * @brief   重定向c库printf函数到usart端口
  
******************************************************************************
  * @attention
  *
  * 实验平台:秉火STM32 F103-霸道 开发板  
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  
******************************************************************************
  */ 

#include "bsp_usart.h"

void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

// 打开串口GPIO的时钟
DEBUG_USART1_GPIO_APBxClkCmd(DEBUG_USART1_GPIO_CLK ENABLE);

// 打开串口外设的时钟
DEBUG_USART1_APBxClkCmd(DEBUG_USART1_CLK ENABLE);

// 将USART Tx的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART1_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART1_TX_GPIO_PORT &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART1_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART1_RX_GPIO_PORT &GPIO_InitStructure);

// 配置串口的工作参数
// 配置波特率
USART_InitStructure.USART_BaudRate = DEBUG_USART1_BAUDRATE;
// 配置 针数据字长
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(DEBUG_USART1 &USART_InitStructure);

// 串口中断优先级配置
/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* 配置USART为中断源 */
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART1_IRQ;
/* 抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/* 使能中断 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* 初始化配置NVIC */
NVIC_Init(&NVIC_InitStructure);

// 使能串口接收中断
USART_ITConfig(DEBUG_USART1 USART_IT_RXNE ENABLE);

// 使能串口
USART_Cmd(DEBUG_USART1 ENABLE);    
}

//void USART1_IRQHandler(void) //中断处理函数;
//{
// uint8_t ucTemp;
// if(USART_GetITStatus(DEBUG_USART1USART_IT_RXNE)!=RESET)
// {
// ucTemp = USART_ReceiveData(DEBUG_USART1);
// USART_SendData(DEBUG_USART1ucTemp);    
// }
//} 



void USART2_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;        

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 ENABLE );

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2 TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA &GPIO_InitStructure); //端口A;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2 RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;
GPIO_Init(GPIOA &GPIO_InitStructure); //端口A;

USART_InitStructure.USART_BaudRate = 9600; //波特率;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(USART2 &USART_InitStructure);//配置串口参数;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,
4位响应优先级;

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //中断号;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

USART_ITConfig(USART2 USART_IT_RXNE ENABLE);
USART_Cmd(USART2 ENABLE); //使能串口;
}


//void USART2_IRQHandler(void) //中断处理函数;
//{
//// u8 res;    
//// if(USART_GetITStatus(USART2 USART_IT_RXNE) == SET) //判断是否发生中断;
//// {
//// USART_ClearFlag(USART2 USART_IT_RXNE); //清除标志位;
//// res=USART_ReceiveData(USART2); //接收数据;
//// USART2_SendByte(res); //用户自定义;
//// }  
//
// uint8_t ucTemp;
// if(USART_GetITStatus(DEBUG_USART2USART_IT_RXNE)!=RESET)
// {
// ucTemp = USART_ReceiveData(DEBUG_USART2);
// USART_SendData(DEBUG_USART2ucTemp);    
// }
//} 

/*****************  发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx uint8_t ch)
{
/* 发送一个字节数据到USART */
USART_SendData(pUSARTxch);

/* 等待发送数据寄存器为空 */
while (USART_GetFlagStatus(pUSARTx USART_FLAG_TXE) == RESET);
}

/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx char *str)
{
unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTxUSART_FLAG_TC)==RESET)
  {}
}

/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx uint16_t ch)
{
uint8_t temp_h temp_l;

/* 取出高八位 */
temp_h = (ch&0XFF00)>>8;
/* 取出低八位 */
temp_l = ch&0XFF;

/* 发送高八位 */
USART_SendData(pUSARTxtemp_h);
while (USART_GetFlagStatus(pUSARTx USART_FLAG_TXE) == RESET);

/* 发送低八位 */
USART_SendData(pUSARTxtemp_l);
while (USART_GetFlagStatus(pUSARTx USART_FLAG_TXE) == RESET);
}



0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 为什么配置使用了中断而把中断函数注释掉呢?不用中断的话,把中断的配置也注释掉。
    • 发布于 2018-05-02
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:2
  • 要先同步,然后缓冲区足够
    • 发布于2018-05-02
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这个程序有问题 需要检查一下中断
    • 发布于2018-05-03
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

配置两个串口的问题