你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享STM32CUBEMX,UART_Transmit()及timeout参数的意义

[复制链接]
0721de 发布时间:2016-5-10 21:49
在main.c里
  /* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t transmit[3] ={1,2,3};      //定义8位数组,3个字节大小   
uint16_t len =3;
uint32_t timeout =10;
/* USER CODE END PV */

main(){
   HAL_UART_Transmit(&huart1, transmit,len, timeout);
  while (1)
  {}
}

复位键启动程序,上位机接收到01 02 03

关于timeout,它在HAL_UART_Transmit()里和uwTick做比较
uwTick是全局变量,在中断函数SysTick_Handler()里一直循环递增

可在main.c>>SystemClock_Config(void)里找到HCLK/1000
HCLK/1000就是中断进SysTick_Handler()的次数  你的CPU有1000分之一时间都在做uwTick++;
HCLK是什么?请看附件图

timeout的意义:
timeout就是等待上一字符发送完毕,或异常退出  
uint8_t string[123] ={0};   //这个数组很长
HAL_UART_Transmit(&huart1, transmit,len, timeout);                  //假设timeout=10;顺利从UART1发出
HAL_UART_Transmit(&huart2, transmit,len, timeout);                   //timeout=10;够长,顺利从UART2发出

关于传送完毕,有人用如下方法等待传送完毕
虽然方案可行
while(HAL_OK !=HAL_UART_Transmit(&huart2, transmit,len, timeout));     
这容易卡死,卡死都不知道
做产品应该尽量避免错误

很明显timeout提供一种方法(针对所有用到timeout的函数)
根据数组长度,根据波特率大小,根据处理器速度,根据中断资源的支配
适当增加timeout ,或减小timeout 会节约系统开支或保证系统运行的稳定性
不会丢数据
使用while有几个弊端,不仅程序写的难看
万一,HAL_UART_Transmit()返回的不是HAL_OK而是HAL_TIMEOUT,程序卡死在这里都不知道
作为程序员,自己写的程序的运行次数和运行时间一定要牢记在心的

HAL_UART_Transmit()用起来简单,全局可用
只是编程思想上要和HAL库统一起来
uint32_t transmit[3] ={1,2,3};     //发送的数组最好不要像这样定义成32位的  根据C语言,名字"transmit"就是32位指针
uint8_t transmit[3] ={1,2,3};      //定义成这样8位的   根据C语言,名字"transmit"就是8位指针对应于形参uint8_t *pData
HAL_UART_Transmit(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size, uint32_t Timeout)


stm32cubemx很重要的思想就是:/*USER CODE BEGIN*/
                                                               。。。//在KEIL中编辑
                                                     /*USER CODE END*/
代码一定!!!要放在这之间,可以用MDK和cubeMX两个软件同时!!!对代码进行更新
假设当你程序写UART完了,又需要添加新外设TIM1时可以用CUBEMX添加新外设
在CUBEMX软件中点击Project Generate Code
CUBEMX软件不会改变/*USER CODE BEGIN*/ 到 /*USER CODE END*/之间的代码


环境:STM32CUBEMX,MDK-4
硬件:STM32F405RGTx,LQFP64封装
UART1:A9和A10
简单的UART代码就没必要上传了吧

HCLK在cubemx里有看见

HCLK在cubemx里有看见
收藏 1 评论8 发布时间:2016-5-10 21:49

举报

8个回答
chen_hang 回答时间:2016-5-11 09:15:29
谢谢 分享 昨天向楼主提的问题 没想到今天就写好了
沐紫 回答时间:2016-5-11 09:24:01
支持!谢谢分享
wofei1314 回答时间:2016-5-11 13:17:40
谢谢经验分享!
MCU之路 回答时间:2016-5-11 16:40:28
你好  楼主 请问如果我不知道收到的数组有多少  只是知道一个上限,比如说我收到的数组是0-500的中的一个,这个用这个timeout能实现吗
0721de 回答时间:2016-5-12 14:01:01
本帖最后由 0721de 于 2016-5-12 14:03 编辑
MCU之路 发表于 2016-5-11 16:40
你好  楼主 请问如果我不知道收到的数组有多少  只是知道一个上限,比如说我收到的数组是0-500的中的一个, ...

(0)你的数组长度有上限,每组数组传输时间应该也有上限
(1)假设你在main()函数中有用hal_uart_transmit()传数组,这时来了一个更高级的中断(或者某个异常),如果这个中断(或异常)耗时太长,timeout太短就会丢数据。timeout够长,ha_uart_transmit()就会等待等到中断函数(或异常)结束,再继续传数据,所以timeout和你的中断耗时(异常耗时)有一定关系,timeout其实就是“等待”的意思.
(2)如果你传递任意长数组,每一组数传递时间间短(在ms级别)的话,可以考虑加大(如timeout =100000;)
用公式  等待时长 =timeout/(hclk/1000)单位秒   计算你需要的时长(timeout最大0xffff ffff 42亿多)
(4)建议按照严格的传输协议传数据,不要写容易卡死的程序,写能处理异常的程序才是好程序
david2016 回答时间:2016-5-12 17:35:22
while(HAL_OK !=HAL_UART_Transmit(&huart2, transmit,len, timeout));   关于这一点。。。
不会去用这句话吧?官方的demo是这样的
if(HAL_OK !=HAL_UART_Transmit(&huart2, transmit,len, timeout))
{
....................
}   
我觉得 不会有人去那么白痴的去写while的、
david2016 回答时间:2016-5-12 17:36:29
另外 一般是采用中断发送。
leochen2019 回答时间:2019-11-12 09:27:49
楼主文章不错!新手学习啦!

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版