我是兼任硬件设计和软件开发,在项目中遇到一些问题,主要是硬件设置中遇到的一些问题,最后解决是硬件和软件相配合去解决的
硬件 STM32F429
1 保留一个UART对外输出信息,但是IO口不好走线,或者被占用怎么处理?
可以使用UART的重定向(重映射)功能,比如USART1,常规使用的是PA9 PA10,但是可以将USART1 重映射到 PB6 PB7上
这个是常规的。还可以在保持TX和RX不变的情况喜,将待映射的管教自由组合。
USART1 | PA9-TX | |
USART1 | PA10-RX | 从两组TX和两组RX中选择一个进行组合 |
USART1 | PB6 -TX | 也是可以的 |
USART1 | PB7-RX |
比如 USART1的TX/RX可以是PA9/PB7,也可以是 PA10/PB6,这样组合也是可以的,可以得到如下组合
串口 | 可重映射IO | 重映射组 | 说明 |
USART1 | PA9-TX | PA9-TX PA10-RX | 常规设计 |
PA10-RX | PA9-TX PB7-RX | 可选设计 | |
PB6 -TX | PB6 -TX PB7-RX | 常规设计 | |
PB7-RX | PB6 -TX PA10-RX | 可选设计 |
关于验证是否正确的问题,可以在STM32CubeMX中确定,选择上表中的可选设计来验证下:PA9-TX PB7-RX
下图是我的默认设置,使用PA9/ PA10.
重新设置后 如下
2.USART的TXRX外接串口转接芯片,TXRX设计接反
我们在外接RS232芯片时,会犯这类低级错误,可能会将RXD和TXD两根线接反。如果发生错误,部分STM32型号可不必再修改硬件,注意是部分STM32型号
比如STM32F42系列就没有此功能
在一些比较新的MCU中就可以在结构框图中看到
在stm32f0xx_usart.c中找到下面函数:
/**
* @brief Enables or disables the swap Tx/Rx pins.
* @param USARTx: where x can be 1 or 2 to select the USART peripheral.
* @param NewState: new state of the USARTx TX/RX pins pinout.
* This parameter can be:
* @arg ENABLE: The TX and RX pins functions are swapped.
* @arg DISABLE: TX/RX pins are used as defined in standard pinout
* @note This function has to be called before calling USART_Cmd() function.
* @retval None
*/
void USART_SWAPPinCmd(USART_TypeDef* USARTx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the SWAP feature by setting the SWAP bit in the CR2 register */
USARTx->CR2 |= USART_CR2_SWAP;
}
else
{
/* Disable the SWAP feature by clearing the SWAP bit in the CR2 register */
USARTx->CR2 &= (uint32_t)~((uint32_t)USART_CR2_SWAP);
}
}
//于是在串口初始化后调用
USART_SWAPPinCmd(COM_USART[COM1], ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
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;
STM_COMInit(COM1, &USART_InitStructure);
USART_SWAPPinCmd(COM_USART[COM1], ENABLE); // 这里使能SWAP交换功能,便可以实现TXD & RXD交换!
3.TX RX 电平极性反转
通常默认串口电平是高电平为逻辑1,低电平为逻辑0。而在STM32的USART新特性中是可以将高电平设置为逻辑0,低电平设置为逻辑1的。
这一特性,让我们在一些特殊的场景下灵活使用,如:USART外接了反相器时就可以直接使用。
在数据接收发送寄存器中,数据也是可以反转的,原来的0变为1,原来的1变为0,这和电平极性反转是类似。需要特别注意的是,在极性反转的时候,起始位和结束位也都反转了,所有的信号电平都反转;而在数据寄存器中只反转了数据位,其中也包含了校验位,没有反转信号的起始位和结束位的极性。