[STM32F3]

STM32F207串口

[复制链接]
425|7
手机看帖
扫描二维码
随时随地手机跟帖
范德萨发额|  楼主 | 2022-5-29 14:35 | 显示全部楼层 |阅读模式
使用STM32F207官方提供的串口例程时,定义串口2~5都没有问题。使用串口1或串口6时,无数据输出。TXD线上只是低电平。求解。。。。
附上代码。
串口2~5,先提供官方例程
#define EVAL_COM1 USART3
#define EVAL_COM1_CLK RCC_APB1Periph_USART3
#define EVAL_COM1_TX_PIN GPIO_Pin_10
#define EVAL_COM1_TX_GPIO_PORT GPIOC
#define EVAL_COM1_TX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define EVAL_COM1_TX_SOURCE GPIO_PinSource10
#define EVAL_COM1_TX_AF GPIO_AF_USART3
#define EVAL_COM1_RX_PIN GPIO_Pin_11
#define EVAL_COM1_RX_GPIO_PORT GPIOC
#define EVAL_COM1_RX_GPIO_CLK RCC_AHB1Periph_GPIOC
#define EVAL_COM1_RX_SOURCE GPIO_PinSource11
#define EVAL_COM1_RX_AF GPIO_AF_USART3
#define EVAL_COM1_IRQn USART3_IRQn
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;

使用特权

评论回复
范德萨发额|  楼主 | 2022-5-29 14:36 | 显示全部楼层
STM_EVAL_COMInit(COM1, &USART_InitStructure);
void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM], ENABLE);

if (COM == COM1)
{
/* Enable UART clock */
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
}

/* Connect PXx to USARTx_Tx*/
GPIO_PinAFConfig(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]);

/* Connect PXx to USARTx_Rx*/
GPIO_PinAFConfig(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]);

/* Configure USART Tx as alternate function */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);

/* Configure USART Rx as alternate function */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);

/* USART configuration */
USART_Init(COM_USART[COM], USART_InitStruct);

/* Enable USART */
USART_Cmd(COM_USART[COM], ENABLE);
}

按照上面的例程,将串口3改为串口1后,串口1不能工作,TXD线上是低电平,
仿真时发现,程序停留在
while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET)
{
}
这个地方。

使用特权

评论回复
范德萨发额|  楼主 | 2022-5-29 14:36 | 显示全部楼层
串口1的引脚定义是PA.09,PA.10

使用特权

评论回复
zljiu| | 2022-6-24 11:35 | 显示全部楼层
引脚有特殊的地方吗

使用特权

评论回复
aoyi| | 2022-6-24 12:10 | 显示全部楼层
硬件连接上有什么不一样的地方吗

使用特权

评论回复
andygirl| | 2022-6-26 13:00 | 显示全部楼层
只能回去查代码

使用特权

评论回复
sonicll| | 2022-6-27 09:26 | 显示全部楼层
本帖最后由 sonicll 于 2022-6-27 09:29 编辑

USART1和USART6在APB2总线上,所以下面这个开时钟的语句要做一下条件判断,如果是USART1和6,要用APB2的函数:
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);

使用特权

评论回复
香水城| | 2022-6-27 14:18 | 显示全部楼层
问题应该出在外设时钟的配置上,U1/u6挂在APB2总线上,另外几个UART挂在APB1总线上,时钟也不一样。

6094762b94ba13f719.png
所以 我们做配置尽量使用CUBEMX来做,减少这些时钟、管脚分配方面的问题。

使用特权

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

本版积分规则

42

主题

779

帖子

1

粉丝