本帖最后由 jinglixixi 于 2025-2-1 20:31 编辑
在前面曾介绍过,例程中对串口的配置是无效的,因此要实现串口通讯必须自行配置。
鉴于引脚资源的出借情况,这里选取PC4和PC5来供串口1所用。
图1 所用引脚
对串口进行配置的函数为:
void APM_MINI_COMInit(COM_T COM)
{
GPIO_Config_T gpioConfig;
USART_Config_T usartConfigStruct;
RCM_EnableAHBPeriphClock(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM]);
if (COM == COM1)
{
RCM_EnableAPB2PeriphClock(COM_USART_CLK[COM]);
}
else
{
RCM_EnableAPB1PeriphClock(COM_USART_CLK[COM]);
}
GPIO_ConfigPinAF(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]);
GPIO_ConfigPinAF(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]);
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.pin = COM_TX_PIN[COM];
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.pupd = GPIO_PUPD_PU;
GPIO_Config(COM_TX_PORT[COM], &gpioConfig);
gpioConfig.pin = COM_RX_PIN[COM];
GPIO_Config(COM_RX_PORT[COM], &gpioConfig);
usartConfigStruct.baudRate = 115200;
usartConfigStruct.mode = USART_MODE_TX_RX;
usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
usartConfigStruct.parity = USART_PARITY_NONE;
usartConfigStruct.stopBits = USART_STOP_BIT_1;
usartConfigStruct.wordLength = USART_WORD_LEN_8B;
USART_Config(COM_USART[COM], &usartConfigStruct);
USART_EnableInterrupt(COM_USART[COM], USART_INT_RXBNEIE);
if (COM_USART[COM] == USART1)
{
NVIC_EnableIRQRequest(USART1_IRQn, 2);
}
else if (COM_USART[COM] == USART2)
{
NVIC_EnableIRQRequest(USART2_IRQn, 3);
}
USART_Enable(COM_USART[COM]);
}
以中断方式接收数据的函数为:
void USART_Receive_Isr(void)
{
uint8_t dat;
if (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_RXBNE) == SET)
{
dat = (uint8_t)USART_RxData(MINI_COM1);
printf("%c", dat);
}
}
以中断方式发送信息的函数为:
void USART_Send_Isr(void)
{
while (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_TXBE) == RESET);
if (USART_ReadStatusFlag(MINI_COM1, USART_FLAG_TXC))
{
printf("APM MINI BOARD SEND FINISHED\r\n\r\n");
USART_ClearStatusFlag(MINI_COM1, USART_FLAG_TXC);
}
}
进行串口测试的主程序为:
int main(void)
{
GPIO_Config_T gpioConfig;
USART_Config_T usartConfig;
APM_MINI_COMInit(COM1);
RCM_EnableAHBPeriphClock(MINI_COM1_TX_GPIO_CLK | MINI_COM2_TX_GPIO_CLK);
RCM_EnableAPB2PeriphClock(MINI_COM1_CLK);
GPIO_ConfigPinAF(MINI_COM1_TX_GPIO_PORT, MINI_COM1_TX_SOURCE, MINI_COM1_TX_AF);
GPIO_ConfigPinAF(MINI_COM1_RX_GPIO_PORT, MINI_COM1_RX_SOURCE, MINI_COM1_RX_AF);
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.pin = MINI_COM1_TX_PIN;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.pupd = GPIO_PUPD_PU;
GPIO_Config(MINI_COM1_TX_GPIO_PORT, &gpioConfig);
gpioConfig.pin = MINI_COM1_RX_PIN;
GPIO_Config(MINI_COM1_RX_GPIO_PORT, &gpioConfig);
usartConfig.baudRate = 115200;
usartConfig.mode = USART_MODE_TX_RX;
usartConfig.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
usartConfig.parity = USART_PARITY_NONE;
usartConfig.stopBits = USART_STOP_BIT_1;
usartConfig.wordLength = USART_WORD_LEN_8B;
USART_Config(MINI_COM1, &usartConfig);
USART_EnableInterrupt(MINI_COM1, USART_INT_RXBNEIE);
NVIC_EnableIRQRequest(MINI_COM1_IRQn, 2);
USART_Enable(MINI_COM1);
USART_Write(MINI_COM1, (uint8_t*)"HELLO APM MINI BOARD\r\n");
while (1)
{
}
}
经程序的 编译与下载,其运行结果如图2所示。
图2 测试效果
|