本帖最后由 秦生0303 于 2022-7-13 20:58 编辑
接下来体验串口通信功能,串口功能的实现,首先要选择串口接口,软件功能的实现的第一步就是要确保硬件连接正确,也就是RX和TX要和工具的串口连接正确,串口实现通信只要RX、TX和地连接上就可以,电不是必须的,逻辑正确就可以传输。printf功能非常适合日志输出,只要进行重定向加串口配置就可以了。 为了测试串口的输入输出,首先定义一下测试内容,输出方面就使用printf打印功能通过串口输出固定字符,通过KEY2按键实现逐次发送;输入方面通过串口中断接收数据,定义0~3为控制命令,切换LED的控制模式。 选定PA08和PA09作为UART1的接口,注意一下方面: UART控制器挂载到APB 总线上,注意时钟选择; 数据帧的配置要和串口调试工具保持一致; UARTx_TXD引脚配置成推挽复用输出模式; RXD 引脚配置成上拉输入复用模式;
UART1初始化代码如下: void UART1_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
__RCC_GPIOA_CLK_ENABLE();
__RCC_UART1_CLK_ENABLE();
GPIO_InitStructure.Pins = GPIO_PIN_8;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
PA08_AFx_UART1TXD();
GPIO_Init(CW_GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.Pins = GPIO_PIN_9;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
PA09_AFx_UART1RXD();
GPIO_Init(CW_GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_Over = USART_Over_16;
USART_InitStructure.USART_Source = USART_Source_PCLK;
USART_InitStructure.USART_UclkFreq = 64000000;
USART_InitStructure.USART_StartBit = USART_StartBit_FE;
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;
USART_Init(CW_UART1,&USART_InitStructure);
// DMA_Configuration();
//
// USART_DMACmd(CW_UART1,USART_DMAReq_Tx, ENABLE);
NVIC_SetPriority(UART1_IRQn, 0);
NVIC_EnableIRQ(UART1_IRQn);
USART_ITConfig(CW_UART1,USART_IT_RC,ENABLE);
}
Printf重定向代码如下: int fputc(int ch, FILE *f)
{
USART_SendData_8bit(CW_UART1, (uint8_t)ch);
while (USART_GetFlagStatus(CW_UART1, USART_FLAG_TXE) == RESET);
return ch;
}
中断接收处理部分代码: void UART1_IRQHandler(void)
{
/* USER CODE BEGIN */
if(USART_GetITStatus(CW_UART1, USART_IT_RC) != RESET)
{
TxRxBuffer = USART_ReceiveData_8bit(CW_UART1);
USART_SendData_8bit(CW_UART1, TxRxBuffer);
USART_ClearITPendingBit(CW_UART1, USART_IT_RC);
}
/* USER CODE END */
}
While中的处理函数: if(UART1TxFlag == 1)
{
printf("\r\nCW32F030 UART1 Printf Test\r\n");
UART1TxFlag = 0;
}
if(UART1RxFlag == 1)
{
if(TxRxBuffer == 0x00 || TxRxBuffer == 0x01 || TxRxBuffer == 0x02 || TxRxBuffer == 0x03)
LED.Mode_Dis = TxRxBuffer;
UART1RxFlag = 0;
}
至于效果符合设计预期,视频无法上传,就不传了。
|