qq_43792862
自娱自乐。
采纳率0%
2019-01-19 16:12 阅读 3.8k

STM32串口如何实现一个发数据,另外一个接收数据

在keil5在编程环境下,想要实现的功能是:利用中断,让串口四接收数据,串口一发送数据
部分代码如下:
int main(void)
{

//初始化USART1和UART4 配置模式为 115200 8-N-1,通过USART1发送数据,通过UART4接收数据
Debug_USART1_Config();
Debug_UART4_Config();

while(1)
{

}

}
、、、、、、、、、中断函数如下、、、、、、、、、
相关宏定义
#define DEBUG_R_USART_IRQHandler UART4_IRQHandler
#define DEBUG_R_USART_IRQ UART4_IRQn

//串口四的中断程序:用于接收数据

void DEBUG_R_USART_IRQHandler(void)
{
if(USART_GetITStatus(UART4,USART_IT_RXNE)!=RESET)
{

USART_ClearFlag(UART4,USART_IT_RXNE);

// USART_ClearITPendingBit(UART4,USART_IT_RXNE); //清除中断标志
ucTemp = USART_ReceiveData(UART4);
}

}

//串口一的中断程序:用于发送数据
void DEBUG_T_USART_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{

USART_ClearFlag(USART1,USART_IT_RXNE); //清除标志
// USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断预处理位
USART_SendData(USART1,ucTemp);
}

}

、、、、、、、、中断函数的配置、、、、、、、、、
//接收串口引脚定义
/*******************************************************/
#define DEBUG_USART UART4
#define DEBUG_USART_CLK RCC_APB1Periph_UART4
#define DEBUG_USART_BAUDRATE 115200 //串口波特率

#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_USART_RX_PIN GPIO_Pin_1
#define DEBUG_USART_RX_AF GPIO_AF_UART4
#define DEBUG_USART_RX_SOURCE GPIO_PinSource1

#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_USART_TX_PIN GPIO_Pin_0
#define DEBUG_USART_TX_AF GPIO_AF_UART4
#define DEBUG_USART_TX_SOURCE GPIO_PinSource0

#define DEBUG_R_USART_IRQHandler UART4_IRQHandler
#define DEBUG_R_USART_IRQ UART4_IRQn

/************************************************************/

//发送串口引脚定义
/*******************************************************/
#define DEBUG_T_USART USART1
#define DEBUG_T_USART_CLK RCC_APB2Periph_USART1
#define DEBUG_T_USART_BAUDRATE 115200 //串口波特率

#define DEBUG_T_USART_RX_GPIO_PORT GPIOA
#define DEBUG_T_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_T_USART_RX_PIN GPIO_Pin_10
#define DEBUG_T_USART_RX_AF GPIO_AF_USART1
#define DEBUG_T_USART_RX_SOURCE GPIO_PinSource10

#define DEBUG_T_USART_TX_GPIO_PORT GPIOA
#define DEBUG_T_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA
#define DEBUG_T_USART_TX_PIN GPIO_Pin_9
#define DEBUG_T_USART_TX_AF GPIO_AF_USART1
#define DEBUG_T_USART_TX_SOURCE GPIO_PinSource9

#define DEBUG_T_USART_IRQHandler USART1_IRQHandler
#define DEBUG_T_USART_IRQ USART1_IRQn

/************************************************************/
static void NVIC_Configuration(void) //串口四的中断参数的配置
{
NVIC_InitTypeDef NVIC_InitStructure;

/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

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

static void T_NVIC_Configuration(void) //串口一的中断参数的配置
{
NVIC_InitTypeDef NVIC_InitStructure;

/* 嵌套向量中断控制器组选择 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

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

、、、、、、、、有关串口的配置、、、、、、、、
void Debug_UART4_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK,ENABLE);

/* 使能 USART 时钟 */
RCC_APB1PeriphClockCmd(DEBUG_USART_CLK, ENABLE);

/* GPIO初始化 */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/* 配置Tx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ;

GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

/* 配置Rx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

/* 连接 PXx 到 USARTx_Tx*/
GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF);

/* 连接 PXx 到 USARTx__Rx*/
GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);

/* 配置串DEBUG_USART 模式 /
/
波特率设置:DEBUG_USART_BAUDRATE /
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
/
字长(数据位+校验位):8 /
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
/
停止位:1个停止位 /
USART_InitStructure.USART_StopBits = USART_StopBits_1;
/
校验位选择:不使用校验 /
USART_InitStructure.USART_Parity = USART_Parity_No;
/
硬件流控制:不使用硬件流 /
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
/
USART模式控制:同时使能接收和发送 /
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
/
完成USART初始化配置 */
USART_Init(DEBUG_USART, &USART_InitStructure);

/* 嵌套向量中断控制器NVIC配置 */
NVIC_Configuration();

/* 使能串口接收中断 */
USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);  //使能了接收中断,那么ORE中断也同时被开启了。

/* 使能串口 */
USART_Cmd(DEBUG_USART, ENABLE);
}

void Debug_USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

/* 使能 USART 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

/* GPIO初始化 */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/* 配置Tx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ;

GPIO_Init(DEBUG_T_USART_TX_GPIO_PORT, &GPIO_InitStructure);

/* 配置Rx引脚为复用功能 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_T_USART_RX_PIN;
GPIO_Init(DEBUG_T_USART_RX_GPIO_PORT, &GPIO_InitStructure);

/* 连接 PXx 到 USARTx_Tx*/
GPIO_PinAFConfig(DEBUG_T_USART_RX_GPIO_PORT,DEBUG_T_USART_RX_SOURCE,DEBUG_T_USART_RX_AF);

/* 连接 PXx 到 USARTx__Rx*/
GPIO_PinAFConfig(DEBUG_T_USART_TX_GPIO_PORT,DEBUG_T_USART_TX_SOURCE,DEBUG_T_USART_TX_AF);

/* 配置串DEBUG_USART 模式 /
/
波特率设置:DEBUG_USART_BAUDRATE /
USART_InitStructure.USART_BaudRate = DEBUG_T_USART_BAUDRATE;
/
字长(数据位+校验位):8 /
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
/
停止位:1个停止位 /
USART_InitStructure.USART_StopBits = USART_StopBits_1;
/
校验位选择:不使用校验 /
USART_InitStructure.USART_Parity = USART_Parity_No;
/
硬件流控制:不使用硬件流 /
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
/
USART模式控制:同时使能接收和发送 /
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
/
完成USART初始化配置 */
USART_Init(DEBUG_T_USART, &USART_InitStructure);

/* 嵌套向量中断控制器NVIC配置 */
T_NVIC_Configuration();

/* 使能串口接收中断 */
USART_ITConfig(DEBUG_T_USART, USART_IT_RXNE, ENABLE);

/* 使能串口 */
USART_Cmd(DEBUG_T_USART, ENABLE);
}

未解决:串口一和串口四都可以单独收发,但是我想要实现一个串口收,另外一个串口发的功能,,,,,,,,求助啊,,,,,,试了好多可能性了

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • qq_40044704 DWF文 2019-08-19 17:46

    ucTemp是什么?没有看到这个的定义

    点赞 评论 复制链接分享
  • qq_37033726 菜鸟+小白 2021-02-21 16:30

    真棒

    点赞 评论 复制链接分享

相关推荐