本帖最后由 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 测试效果
|