stm32cubeide+freertos+c/c++混合编程踩坑记录

1. freertos时钟配置问题

选择freertos后,系统时钟sys建议选择TIM6。至于原因可以参考:

STM32 HAL使用TIM6代替Systick作为时基_stm32f4 hal tim6-CSDN博客

2. freertos 任务配置问题

建立的任务除了要注意设置优先级外,还应该注意设置stack size,因为在任务中运行比较大的函数,尤其是printf函数比较多的时候,内存设置过小容易导致程序卡死。

3. C,C++混合编程问题

这里涉及两个相互调用,即在C+文件中调用C文件和在C中调用C+文件。在工程生成之初,就要选择生成C++代码,然后在编译器添加C+编译路径要包含有C+的文件路径。

另外调用C++文件中的函数,要采用外包一层的方式,参考下文:

如何从C中调用C++函数 - 知乎

编译的时候,C+源文件对应的h文件里还添加了

#ifdef __cplusplus


....//带有C++特性的代码


#endif

4. 添加串口调试重映射printf方式,在使用cubeide生成代码中,需要在main.cpp如下位置添加代码:

/* USER CODE BEGIN 0 */

// 重定向print start

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart5 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
// 重定向print end
/* USER CODE END 0 */

5. stm32cubeide  +dma  + uart 实现不定长数据接收,参考如下博客

STM32—cubeIDE+DMA+USART 接收任意长度的数据_cubeide串口数据任意长度-CSDN博客

重点是,打开dma接收,打开串口闲时中断,在串口闲时中断中添加处理函数

main.c中


 /* USER CODE BEGIN 2 */

  HAL_UART_Receive_DMA(&huart7, receive_gps_buff, receive_gps_buff_size);
  __HAL_UART_ENABLE_IT(&huart7, UART_IT_IDLE);         //使能串UART2 IDLE中断

  /* USER CODE END UART7_IRQn 0 */
  HAL_UART_IRQHandler(&huart7);
  /* USER CODE BEGIN UART7_IRQn 1 */

  if(RESET != __HAL_UART_GET_FLAG(&huart7, UART_FLAG_IDLE))   //判断是否是空闲中
          {
              __HAL_UART_CLEAR_IDLEFLAG(&huart7);                     //清楚空闲中断标志(否则会 直不断进入中断)

              HAL_UART_DMAStop(&huart7);                                                     //停止本次DMA传输

              uint8_t data_length  = receive_buff_size - __HAL_DMA_GET_COUNTER(&hdma_uart7_rx);   //计算接收到的数据长度


       //       char temp[data_length];
       //       memcpy(temp,0,data_length);

       //       memcpy(temp,receive_buff,data_length);



              HAL_UART_Receive_DMA(&huart7, receive_buff, receive_buff_size);
              data_length = 0;                         //调用中断处理函数
          }

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值