[其他ST产品] 【STM32G4评测+03+MDK+Stm32cubeIDE双工程搞定Printf 】

[复制链接]
2560|39
 楼主| caizhiwei 发表于 2021-3-26 09:39 | 显示全部楼层 |阅读模式
    这几天一直在捣鼓板子,查资料现学现卖,觉都睡不好,一遍熟悉知识点消化,一边总结。做梦都在搞板子!由于第一次使用Hal库,第一次使用新的编译器,又在LL库的边缘徘徊,期间又切换到RTTstudio。            最初几天串口没有调试通,很郁闷,看到别的小伙伴一篇篇的优质测评帖,我心里急啊。今天,我的第三篇测评,他终于来了!

    1. 首先,来个驱动讲解吧,这里要注意的是一个回调函数,我们基本不用管就行,但是和初始化函数长得很像,初学者容易搞糊涂。
092429txx630xcl6g666hc.png
那么我们在使用的时候,main函数中调用A函数初始化即可。
C函数为回调函数,其他外设初始化的时候也会自动产生,C函数已经被B函数调用了!B函数在HAL库中。
这就是三个长得像的家伙的关系。
CubeMX有个特点,函数前都不会有啥注释的。哈哈。
下面就是初始化代码了,这个是CubeMx自动产生的:

  • #include "usart.h"
  • /* USER CODE BEGIN 0 */
  • /* USER CODE END 0 */
  • UART_HandleTypeDef hlpuart1;
  • UART_HandleTypeDef huart1;
  • /* LPUART1 init function */
  • void MX_LPUART1_UART_Init(void)
  • {
  •   /* USER CODE BEGIN LPUART1_Init 0 */
  •   /* USER CODE END LPUART1_Init 0 */
  •   /* USER CODE BEGIN LPUART1_Init 1 */
  •   /* USER CODE END LPUART1_Init 1 */
  •   hlpuart1.Instance = LPUART1;
  •   hlpuart1.Init.BaudRate = 115200;
  •   hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
  •   hlpuart1.Init.StopBits = UART_STOPBITS_1;
  •   hlpuart1.Init.Parity = UART_PARITY_NONE;
  •   hlpuart1.Init.Mode = UART_MODE_TX_RX;
  •   hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  •   hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  •   hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  •   hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  •   if (HAL_UART_Init(&hlpuart1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN LPUART1_Init 2 */
  •   /* USER CODE END LPUART1_Init 2 */
  • }
  • /* USART1 init function */
  • void MX_USART1_UART_Init(void)
  • {
  •   /* USER CODE BEGIN USART1_Init 0 */
  •   /* USER CODE END USART1_Init 0 */
  •   /* USER CODE BEGIN USART1_Init 1 */
  •   /* USER CODE END USART1_Init 1 */
  •   huart1.Instance = USART1;
  •   huart1.Init.BaudRate = 115200;
  •   huart1.Init.WordLength = UART_WORDLENGTH_9B;
  •   huart1.Init.StopBits = UART_STOPBITS_1;
  •   huart1.Init.Parity = UART_PARITY_NONE;
  •   huart1.Init.Mode = UART_MODE_TX_RX;
  •   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  •   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  •   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  •   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  •   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  •   if (HAL_UART_Init(&huart1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
  •   /* USER CODE BEGIN USART1_Init 2 */
  •   /* USER CODE END USART1_Init 2 */
  • }
  • void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
  • {
  •   GPIO_InitTypeDef GPIO_InitStruct = {0};
  •   if(uartHandle->Instance==LPUART1)
  •   {
  •   /* USER CODE BEGIN LPUART1_MspInit 0 */
  •   /* USER CODE END LPUART1_MspInit 0 */
  •     /* LPUART1 clock enable */
  •     __HAL_RCC_LPUART1_CLK_ENABLE();
  •     __HAL_RCC_GPIOA_CLK_ENABLE();
  •     /**LPUART1 GPIO Configuration
  •     PA2     ------> LPUART1_TX
  •     PA3     ------> LPUART1_RX
  •     */
  •     GPIO_InitStruct.Pin = LPUART1_TX_Pin|LPUART1_RX_Pin;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  •     GPIO_InitStruct.Alternate = GPIO_AF12_LPUART1;
  •     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  •   /* USER CODE BEGIN LPUART1_MspInit 1 */
  •   /* USER CODE END LPUART1_MspInit 1 */
  •   }
  •   else if(uartHandle->Instance==USART1)
  •   {
  •   /* USER CODE BEGIN USART1_MspInit 0 */
  •   /* USER CODE END USART1_MspInit 0 */
  •     /* USART1 clock enable */
  •     __HAL_RCC_USART1_CLK_ENABLE();
  •     __HAL_RCC_GPIOC_CLK_ENABLE();
  •     /**USART1 GPIO Configuration
  •     PC4     ------> USART1_TX
  •     PC5     ------> USART1_RX
  •     */
  •     GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
  •     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  •     GPIO_InitStruct.Pull = GPIO_NOPULL;
  •     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  •     GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
  •     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  •   /* USER CODE BEGIN USART1_MspInit 1 */
  •   /* USER CODE END USART1_MspInit 1 */
  •   }
  • }
  • void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
  • {
  •   if(uartHandle->Instance==LPUART1)
  •   {
  •   /* USER CODE BEGIN LPUART1_MspDeInit 0 */
  •   /* USER CODE END LPUART1_MspDeInit 0 */
  •     /* Peripheral clock disable */
  •     __HAL_RCC_LPUART1_CLK_DISABLE();
  •     /**LPUART1 GPIO Configuration
  •     PA2     ------> LPUART1_TX
  •     PA3     ------> LPUART1_RX
  •     */
  •     HAL_GPIO_DeInit(GPIOA, LPUART1_TX_Pin|LPUART1_RX_Pin);
  •   /* USER CODE BEGIN LPUART1_MspDeInit 1 */
  •   /* USER CODE END LPUART1_MspDeInit 1 */
  •   }
  •   else if(uartHandle->Instance==USART1)
  •   {
  •   /* USER CODE BEGIN USART1_MspDeInit 0 */
  •   /* USER CODE END USART1_MspDeInit 0 */
  •     /* Peripheral clock disable */
  •     __HAL_RCC_USART1_CLK_DISABLE();
  •     /**USART1 GPIO Configuration
  •     PC4     ------> USART1_TX
  •     PC5     ------> USART1_RX
  •     */
  •     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4|GPIO_PIN_5);
  •   /* USER CODE BEGIN USART1_MspDeInit 1 */
  •   /* USER CODE END USART1_MspDeInit 1 */
  •   }
  • }


复制代码

然后:重点来了:这个部分还是要自己添加才行,CubeMX还没有达到100%给你写代码的水平哦:
  • /**
  •   * @brief  Retargets the C library printf function to the USART.
  •   * @param  None
  •   * @retval None
  •   */
  • #ifdef __GNUC__
  • /* With GCC, small printf (option LD Linker->Libraries->Small printf
  •    set to 'Yes') calls __io_putchar() */
  • #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  • #else
  • #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  • #endif /* __GNUC__ */
  • PUTCHAR_PROTOTYPE
  • {
  •   /* Place your implementation of fputc here */
  •   /* e.g. write a character to the USART1 and Loop until the end of transmission */
  •   HAL_UART_Transmit(&hlpuart1, (uint8_t *)&ch, 1, 0xFFFF);
  •   return ch;
  • }


复制代码

整个工程编译下来占用空间大小:
==============================================================================


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   

      8204        434        568         20       1316     691029   Grand Totals
      8204        434        568         20       1316     691029   ELF Image Totals
      8204        434        568         20          0          0   ROM Totals

==============================================================================

    Total RO  Size (Code + RO Data)                 8772 (   8.57kB)
    Total RW  Size (RW Data + ZI Data)              1336 (   1.30kB)
    Total ROM Size (Code + RO Data + RW Data)       8792 (   8.59kB)

==============================================================================



最后,看看效果如何:
092933rvcnz8a1d8c8x9wc.png
非常完美!
整个工程代码见附件:
游客,如果您要查看本帖隐藏内容请回复



 楼主| caizhiwei 发表于 2021-3-26 09:40 | 显示全部楼层
欢迎各位点评~
isniper10 发表于 2022-6-6 10:31 | 显示全部楼层
按照这个操作,依然还是不行.我的板子是NUCLEO-G491RE,持续崩溃中.
isniper10 发表于 2022-6-6 10:38 | 显示全部楼层
相同的板子,我直接用你的工程编译,也还是不行.好奇怪啊.一到printf就卡死了.
isniper10 发表于 2022-6-6 10:39 | 显示全部楼层
你用的是虚拟串口输出打印的嘛?
isniper10 发表于 2022-6-6 10:43 | 显示全部楼层
硬件上需要做什么处理嘛?多谢啊,我是初学者,不太懂.
isniper10 发表于 2022-6-6 14:31 | 显示全部楼层
搞定了,多谢参考.
quickman 发表于 2022-7-3 14:19 | 显示全部楼层
资料还是相当全面的                                 
vivilyly 发表于 2022-7-3 15:04 | 显示全部楼层
资料的确是很全面                                 
tabmone 发表于 2022-7-3 15:40 | 显示全部楼层
回复查看一下相关的内容。                                 
lzbf 发表于 2022-7-3 15:55 | 显示全部楼层
以后多交流交流                  
sheflynn 发表于 2022-7-3 16:08 | 显示全部楼层
相当全的资料,很适合初学者                                 
modesty3jonah 发表于 2022-7-3 16:22 | 显示全部楼层
资料的确是很全面                                 
juliestephen 发表于 2022-7-3 16:36 | 显示全部楼层
这些资料太全了!!!                 
selongli 发表于 2022-7-3 16:50 | 显示全部楼层
资料还是相当全面的                                 
soodesyt 发表于 2022-7-3 17:46 | 显示全部楼层
分享的资料很高端呢。                                    
cashrwood 发表于 2022-7-3 18:00 | 显示全部楼层
以后多交流交流                  
rosemoore 发表于 2022-7-3 18:14 | 显示全部楼层
楼主,资料很好。谢谢楼主!                                 
tifmill 发表于 2022-7-3 18:29 | 显示全部楼层
资料还是相当全面的                                 
yeates333 发表于 2022-7-3 19:26 | 显示全部楼层
有时间需要好好看看   不错                                 
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

856

帖子

16

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