打印
[CW32F030系列]

【CW32F030CxTx StartKit测评】04串口体验printf输出+输入控制LED

[复制链接]
947|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
秦生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初始化代码如下:
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;
    }
      至于效果符合设计预期,视频无法上传,就不传了。

使用特权

评论回复
沙发
yangxiaor520| | 2022-7-13 08:07 | 只看该作者
可以上传动图或者链接

使用特权

评论回复
板凳
秦生0303|  楼主 | 2022-7-13 20:57 | 只看该作者
yangxiaor520 发表于 2022-7-13 08:07
可以上传动图或者链接

上一个链接失败了,动图看不清细节

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

181

帖子

2

粉丝