2978|4

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求助:sersontile之与Arduino的UART串口通讯问题疑问 [复制链接]

 要利用sersontile传感器的数据首先得先减慢数据的传送速度,不然我根本没法对数据进行分析处理,所以首先我尝试着在main函数里加上延时函数,在LED灯亮灭的时候里插入:
  1. if(SendOverUSB)
  2.   {
  3.   BSP_LED_On(LED1);
  4. for(i=0;i<5000;i++)
  5. {
  6. for(j=0;j<5000;j++);
  7. }
  8.   }
复制代码
  1. if(SendOverUSB)
  2.   {
  3.   BSP_LED_Off(LED1);
  4. for(i=0;i<5000;i++)
  5. {
  6. for(j=0;j<5000;j++);
  7. }
  8.   }
复制代码

延时时间暂时不用管,就做一个调试,不过让我感到纳闷的是如果我把延时放在 if(SendOverUSB)后面就会出问题,作为stm32菜鸟的我真的无法理解,逻辑上来说应该是没问题的才对,不过烧录进去后发现灯常亮,串口助手上也没有数据传出,真心不懂。。。


延时没问题后下一步就是尝试着把数据通过串口发送至arduino了,这里我用TTL-USB转串口芯片进行模拟,本以为stm32可以直接像发送数据至虚拟串口一样可以直接发送过去至TTL-USB转串口芯片上,没改变程序试了一遍,结果发现我想多了,数据根本发不过去,所以下一步尝试通过配置UART串口了。

通过查询相关的资料https://bbs.eeworld.com.cn/thread-520847-1-4.html,参照帖子配置了UART,修改代码如下:
首先修改SystemClock_Config()函数配置,在这我把所有不相关的代码全部注销,时钟源也修改了,USB也不使能了

  1. void SystemClock_Config(void)
  2. {
  3.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  4.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  5. // RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

  6. // __HAL_RCC_PWR_CLK_ENABLE();
  7. // HAL_PWR_EnableBkUpAccess();

  8. // /* Enable the LSE Oscilator */
  9. // RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
  10. // RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  11. // if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  12. // {
  13. // Error_Handler();
  14. // }
  15. //
  16. // /* Enable the CSS interrupt in case LSE signal is corrupted or not present */
  17. // HAL_RCCEx_DisableLSECSS();

  18.   /* Enable MSI Oscillator and activate PLL with MSI as source */
  19.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  20.   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  21.   RCC_OscInitStruct.HSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  22.   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;//RCC_MSIRANGE_11;
  23.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  24.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  25.   RCC_OscInitStruct.PLL.PLLM =1; //6;
  26.   RCC_OscInitStruct.PLL.PLLN = 40;
  27.   RCC_OscInitStruct.PLL.PLLP = 7;
  28.   RCC_OscInitStruct.PLL.PLLQ = 4;
  29.   RCC_OscInitStruct.PLL.PLLR = 2;//4;
  30.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  31.   {
  32.   Error_Handler();
  33.   }

  34.   //PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  35.   //PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  36. // if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  37. // {
  38. // Error_Handler();
  39. // }
  40. //
  41. // /* Enable MSI Auto-calibration through LSE */
  42. // HAL_RCCEx_EnableMSIPLLMode();

  43.   /* Select MSI output as USB clock source */
  44. // PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
  45. // PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI;
  46. // HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);

  47.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  48.   clocks dividers */
  49.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  50.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  51.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  52.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  53.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; //2
  54.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  55.   {
  56.   Error_Handler();
  57.   }
  58. }
复制代码

然后编写一个uart_init()函数,波特率设置为9600
  1. void uart_init(void)
  2. {
  3. UartHandle.Instance = USARTx;

  4.   UartHandle.Init.BaudRate = 9600;
  5.   UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  6.   UartHandle.Init.StopBits = UART_STOPBITS_1;
  7.   UartHandle.Init.Parity = UART_PARITY_NONE;
  8.   UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  9.   UartHandle.Init.Mode = UART_MODE_TX_RX;
  10.   if(HAL_UART_DeInit(&UartHandle) != HAL_OK)
  11.   {
  12.   while(1);
  13.   }
  14.   if(HAL_UART_Init(&UartHandle) != HAL_OK)
  15.   {
  16.   while(1);
  17.   }
  18. }
复制代码

在main.h里面添加
  1. #define USARTx UART5
  2. #define USARTx_CLK_ENABLE() __HAL_RCC_UART5_CLK_ENABLE()
  3. #define USARTx_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
  4. #define USARTx_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()

  5. #define USARTx_FORCE_RESET() __HAL_RCC_UART5_FORCE_RESET()
  6. #define USARTx_RELEASE_RESET() __HAL_RCC_UART5_RELEASE_RESET()

  7. /* Definition for USARTx Pins */
  8. #define USARTx_TX_PIN GPIO_PIN_12
  9. #define USARTx_TX_GPIO_PORT GPIOC
  10. #define USARTx_TX_AF GPIO_AF8_UART5
  11. #define USARTx_RX_PIN GPIO_PIN_2
  12. #define USARTx_RX_GPIO_PORT GPIOD
  13. #define USARTx_RX_AF GPIO_AF8_UART5

  14. /* Definition for USARTx's NVIC */
  15. #define USARTx_IRQn UART5_IRQn
  16. #define USARTx_IRQHandler UART5_IRQHandler

  17. /* Size of Trasmission buffer */
  18. #define TXBUFFERSIZE (COUNTOF(aTxBuffer) - 1)
  19. /* Size of Reception buffer */
  20. #define RXBUFFERSIZE TXBUFFERSIZE

  21. /* Exported macro ------------------------------------------------------------*/
  22. #define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
  23. /* Exported functions ------------------------------------------------------- */
复制代码

然后在主函数添加
  1. HAL_UART_Transmit_IT(&UartHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE);
复制代码

其中aTxBuffer[]="hello world!";,因为只是调试,所有先尝试下能否配置成功UART就行,发出什么不重要

然后在stm32l4xx_it.c里添加
  1. void USARTx_IRQHandler(void)
  2. {
  3.   HAL_UART_IRQHandler(&UartHandle);
  4. }
复制代码

然后添加相关的函数库(stm32l4xx_hal_uart.c  stm32l4xx_hal_uart_ex.c),编译没问题,烧写,但还是无法通讯!

然后想想还是查下stm32的UART的配置过程,发现是不是没有初始化GPIO口的问题,于是我配置了下GPIO

  1. void uart_gpio_init(void)
  2. {
  3. GPIO_InitTypeDef UART_GPIO_InitStruct;

  4. USARTx_TX_GPIO_CLK_ENABLE();

  5. HAL_GPIO_WritePin(USARTx_TX_GPIO_PORT,USARTx_TX_PIN,GPIO_PIN_SET);

  6. UART_GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  7. UART_GPIO_InitStruct.Pin = USARTx_TX_PIN;
  8. UART_GPIO_InitStruct.Mode = USARTx_TX_AF;

  9. HAL_GPIO_Init(USARTx_TX_GPIO_PORT,&UART_GPIO_InitStruct);
  10. }
复制代码

不过问题还是没有解决,我用的是sersontile的Arduino拓展板,板上的TX焊点已焊上,根据原理图Arduino拓展板上的TX引脚应该是CN9的第一个或第二个引脚,我都已经试着连接过了。
因为本人刚刚接触stm32单片机,对于UART的配置不是很懂,很想问下我是不是在配置的过程中哪个步骤出现了问题,代码出了问题?或是我缺少配置了一些东西?麻烦坛友门能帮我分析下问题所在,或者是有配置过sersontile与Arduino的UART串口通讯的坛友分享下相关代码让我参考下,万分感谢!


最新回复

1、本来通过USB可以在串口看到数据,你为什么要在UART这里看?即使是UART,后还是转成USB或者232, 2,、核心板焊接没问题吗? 3、如果使用UART,注意不要和蓝牙占用的串口冲突  详情 回复 发表于 2017-4-29 09:11
点赞 关注
 
 

回复
举报

2721

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
调整sensorstile中波特率就可以了
 
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
Arduino拓展板上的TX引脚应该是CN9的第二个引脚
 
 
 

回复

2721

帖子

0

TA的资源

纯净的硅(中级)

4
 
1、本来通过USB可以在串口看到数据,你为什么要在UART这里看?即使是UART,后还是转成USB或者232,
2,、核心板焊接没问题吗?
3、如果使用UART,注意不要和蓝牙占用的串口冲突
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

5
 
suoma 发表于 2017-4-29 09:11
1、本来通过USB可以在串口看到数据,你为什么要在UART这里看?即使是UART,后还是转成USB或者232,
2,、核 ...

嗯好!谢谢回复,主要是想把数据传到arduino再在arduino做下一步处理,设置阈值,触发设备
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表