查看: 1100|回复: 0

【怪兽F7】开始打怪——UART

[复制链接]
  • TA的每日心情
    奋斗
    2023-7-6 08:48
  • 签到天数: 169 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-6-27 08:49:56 | 显示全部楼层 |阅读模式
    分享到:
    支持同步单向通信、半双工单线通信以及多处理器通信;还支持 LIN (局域互连网络)、智能卡协议与 IrDA (红外线数据协会)SIR ENDEC 规范,以及调制解调器操作(CTS/RTS)。
    通过配置多个缓冲区使用 DMA (直接存储器访问)可实现高速数据通信。
    主要特性:

    串口初始化使用UART_HandleTypeDef类型的结构体。以9600波特率、8位数据、1位停止位的配置程序如下:
      UartHandle.Init.BaudRate   = 9600;  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;  UartHandle.Init.StopBits   = UART_STOPBITS_1;  UartHandle.Init.Parity     = UART_PARITY_NONE;  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;  UartHandle.Init.Mode       = UART_MODE_TX_RX;  UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;使用HAL_UART_DeInit函数将串口的配置默认,再使用HAL_UART_Init函数,将上面的结构体的配置写入到寄存器中。
    最终实现的函数如下:
    HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart){  uint32_t tmpreg                     = 0x00000000U;  UART_ClockSourceTypeDef clocksource = UART_CLOCKSOURCE_UNDEFINED;  uint16_t brrtemp                    = 0x0000U;  uint16_t usartdiv                   = 0x0000U;  HAL_StatusTypeDef ret               = HAL_OK;  /* Check the parameters */  assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate));  assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength));  assert_param(IS_UART_STOPBITS(huart->Init.StopBits));  assert_param(IS_UART_PARITY(huart->Init.Parity));  assert_param(IS_UART_MODE(huart->Init.Mode));  assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl));  assert_param(IS_UART_ONE_BIT_SAMPLE(huart->Init.OneBitSampling));  /*-------------------------- USART CR1 Configuration -----------------------*/  /* Clear M, PCE, PS, TE, RE and OVER8 bits and configure   *  the UART Word Length, Parity, Mode and oversampling:   *  set the M bits according to huart->Init.WordLength value   *  set PCE and PS bits according to huart->Init.Parity value   *  set TE and RE bits according to huart->Init.Mode value   *  set OVER8 bit according to huart->Init.OverSampling value */  tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling ;  MODIFY_REG(huart->Instance->CR1, UART_CR1_FIELDS, tmpreg);  /*-------------------------- USART CR2 Configuration -----------------------*/  /* Configure the UART Stop Bits: Set STOP[13:12] bits according   * to huart->Init.StopBits value */  MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits);  /*-------------------------- USART CR3 Configuration -----------------------*/  /* Configure   * - UART HardWare Flow Control: set CTSE and RTSE bits according   *   to huart->Init.HwFlowCtl value   * - one-bit sampling method versus three samples' majority rule according   *   to huart->Init.OneBitSampling */  tmpreg = (uint32_t)huart->Init.HwFlowCtl | huart->Init.OneBitSampling ;  MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE | USART_CR3_ONEBIT), tmpreg);  /*-------------------------- USART BRR Configuration -----------------------*/  UART_GETCLOCKSOURCE(huart, clocksource);  /* Check UART Over Sampling to set Baud Rate Register */  if (huart->Init.OverSampling == UART_OVERSAMPLING_8)  {    switch (clocksource)    {    case UART_CLOCKSOURCE_PCLK1:        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_PCLK2:        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_HSI:        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_SYSCLK:        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_LSE:        usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate));      break;      case UART_CLOCKSOURCE_UNDEFINED:    default:        ret = HAL_ERROR;      break;    }    brrtemp = usartdiv & 0xFFF0U;    brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);    huart->Instance->BRR = brrtemp;  }  else  {    switch (clocksource)    {    case UART_CLOCKSOURCE_PCLK1:        huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_PCLK2:        huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_HSI:        huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_SYSCLK:        huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate));      break;    case UART_CLOCKSOURCE_LSE:        huart->Instance->BRR = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate));      break;      case UART_CLOCKSOURCE_UNDEFINED:    default:        ret = HAL_ERROR;      break;    }  }  return ret;}从如下的宏定义,可看到,使用的是串口6,GPIO使用的是GPIOC的6、7引脚。

    这两个引脚连接到了Arduino上。

    板子的连线如下图,接了一个串口。

    运行结果,按下按键后,会在串口终端中输出如下:
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-16 00:09 , Processed in 0.116572 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.