[CW32F030系列] 【CW32F030CxTx StartKit测评】04串口体验printf输出+输入控制LED

[复制链接]
 楼主| 秦生0303 发表于 2022-7-12 23:45 | 显示全部楼层 |阅读模式
<
本帖最后由 秦生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初始化代码如下:
  1. void UART1_init(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;
  4.   USART_InitTypeDef USART_InitStructure;
  5.   
  6.   __RCC_GPIOA_CLK_ENABLE();
  7.   __RCC_UART1_CLK_ENABLE();
  8.   
  9.   GPIO_InitStructure.Pins = GPIO_PIN_8;
  10.   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  11.   GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  12.   PA08_AFx_UART1TXD();
  13.   GPIO_Init(CW_GPIOA,&GPIO_InitStructure);
  14.   GPIO_InitStructure.Pins = GPIO_PIN_9;
  15.   GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
  16.   PA09_AFx_UART1RXD();
  17.   GPIO_Init(CW_GPIOA,&GPIO_InitStructure);

  18.   USART_InitStructure.USART_BaudRate = 115200;
  19.   USART_InitStructure.USART_Over = USART_Over_16;
  20.   USART_InitStructure.USART_Source = USART_Source_PCLK;
  21.   USART_InitStructure.USART_UclkFreq = 64000000;
  22.   USART_InitStructure.USART_StartBit = USART_StartBit_FE;
  23.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  24.   USART_InitStructure.USART_Parity = USART_Parity_No ;
  25.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  26.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  27.   USART_Init(CW_UART1,&USART_InitStructure);
  28.   
  29. //  DMA_Configuration();
  30. //  
  31. //  USART_DMACmd(CW_UART1,USART_DMAReq_Tx, ENABLE);
  32.   
  33.   NVIC_SetPriority(UART1_IRQn, 0);
  34.   NVIC_EnableIRQ(UART1_IRQn);
  35.   
  36.   USART_ITConfig(CW_UART1,USART_IT_RC,ENABLE);

  37.   
  38. }
Printf重定向代码如下:
  1. int fputc(int ch, FILE *f)
  2. {
  3.   USART_SendData_8bit(CW_UART1, (uint8_t)ch);
  4.   while (USART_GetFlagStatus(CW_UART1, USART_FLAG_TXE) == RESET);
  5.   return ch;
  6. }
中断接收处理部分代码:
  1. void UART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN */
  4.   if(USART_GetITStatus(CW_UART1, USART_IT_RC) != RESET)
  5.   {
  6.     TxRxBuffer = USART_ReceiveData_8bit(CW_UART1);
  7.     USART_SendData_8bit(CW_UART1, TxRxBuffer);
  8.     USART_ClearITPendingBit(CW_UART1, USART_IT_RC);   
  9.   }

  10.   /* USER CODE END */
  11. }
While中的处理函数:
  1. if(UART1TxFlag == 1)
  2.     {
  3.       printf("\r\nCW32F030 UART1 Printf Test\r\n");
  4.       UART1TxFlag = 0;
  5.     }
  6.    
  7.     if(UART1RxFlag == 1)
  8.     {
  9.       if(TxRxBuffer == 0x00 || TxRxBuffer == 0x01 || TxRxBuffer == 0x02 || TxRxBuffer == 0x03)
  10.         LED.Mode_Dis = TxRxBuffer;
  11.       UART1RxFlag = 0;
  12.     }
      至于效果符合设计预期,视频无法上传,就不传了。

yangxiaor520 发表于 2022-7-13 08:07 来自手机 | 显示全部楼层
可以上传动图或者链接
 楼主| 秦生0303 发表于 2022-7-13 20:57 | 显示全部楼层
yangxiaor520 发表于 2022-7-13 08:07
可以上传动图或者链接

上一个链接失败了,动图看不清细节
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

181

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部