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

干货 Nucleo072 usart 基于RTOS的应用 方便AT指令类外设开发  

[复制链接]
lovewyufeng 发布时间:2015-1-8 14:06
本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html

[url=CUBEMX  简单创建 FREERTOS 和RTX 工程,顺便讨论一处代码 https://www.stmcu.org.cn/module/foru ... 980&fromuid=1888292 (出处: 意法半导体STM32/STM8技术社区)]CUBEMX  简单创建 FREERTOS 和RTX 工程,顺便讨论一处代码 https://www.stmcu.org.cn/module/foru ... 980&fromuid=1888292 (出处: 意法半导体STM32/STM8技术社区)[/url]

添加了一个 os_usart.c的 文件  
内容

如下


  1. #include "stm32f0xx_hal.h"
  2. #include "cmsis_os.h"
  3. #include "stdio.h"

  4. extern UART_HandleTypeDef huart2;
  5. osSemaphoreId usart_sem;
  6. #define Buffersize 10
  7. struct usart_buf_t
  8. {
  9. char buffer[Buffersize];
  10. int rx_index;
  11. int save_index;

  12. }usart_buf;
  13. void os_usart_init()
  14. {
  15. usart_sem =osSemaphoreCreate(0,1);
  16. usart_buf.rx_index=0;
  17. usart_buf.save_index=0;
  18. osSemaphoreWait(usart_sem,osWaitForever);
  19.         
  20.         HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
  21.         HAL_NVIC_EnableIRQ(USART2_IRQn);
  22.         __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
  23. }

  24. void USART2_IRQHandler()
  25. {
  26. if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET))
  27.   {

  28.                 usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;
  29.                 if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;
  30.                 if(usart_buf.rx_index==usart_buf.save_index)
  31.                 {
  32.                         usart_buf.save_index++;
  33.                         if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;
  34.                 }
  35.                 osSemaphoreRelease(usart_sem);
  36.     /* Clear RXNE interrupt flag */
  37.     __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);
  38.   }
  39. }
  40. static unsigned int usart_timeout=osWaitForever;
  41. void Set_usart_timeout(int timeout)
  42. {
  43. usart_timeout=timeout;
  44. }

  45. int fgetc(FILE*f)
  46. {
  47. int ch;
  48.         if(usart_buf.rx_index!=usart_buf.save_index)
  49.         {
  50.                 ch=usart_buf.buffer[usart_buf.save_index++];
  51.                 if(usart_buf.save_index==Buffersize)
  52.                 {
  53.                 usart_buf.save_index=0;
  54.                 }
  55.                 return ch;
  56.         }
  57.         else
  58.         {
  59.         if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)
  60.         {
  61.         return fgetc(f);
  62.         }
  63.         else
  64.         {
  65.         return 0;
  66.         }
  67.         }
  68. }

  69. int fputc(int ch,FILE*f)
  70. {
  71.         while(!(huart2.Instance->ISR&UART_FLAG_TXE));
  72.         huart2.Instance->TDR=ch;
  73. }
复制代码

复制代码

下面是主函数  增加内容  

作用为  通过scanf 扫描串口 数据到 i

将收到数据  以0x-- 16进制 打印

使用 超级终端  运行程序  键盘输入 10 Enter  可见超级中端  输出0xa


QQ截图20150108135246.jpg


scanf阻塞  程序运行的过程中 仍然看见  072 LED闪烁

如此可见 使用OS  接收串口比 没有OS的优势~~

例如 用这种方式操作 GSM模块  printf("AT+XX");
发送  AT指令之后  

用scanf  接收模块回复

在此过程中  你的设备仍然可以通过其他线程 响应  按键或者  更新屏幕 显示~~

FREERTOS.zip

下载

4.76 MB, 下载次数: 319

工程文件 请打开freertos的 工程

收藏 3 评论28 发布时间:2015-1-8 14:06

举报

28个回答
lovewyufeng 回答时间:2015-1-8 21:57:26
晓枫VS枯叶 发表于 2015-1-8 16:27
我看你这个接收也是中断接收啊!

不知道 你有没有研究过 HAL 的 中断  API

运行机制是这样的  设置buffer地址和 需要接收的 数据 数量(这个是重点)!

然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧?

然后  需要所设置的  数量 数据接收完毕  才运行 callback函数  显然  通信过程中不知道需要接收多少字节?

总不能设置为1吧?  那HAL又相对于  自己写个中断函数  又显得臃肿了 很多~~
lovewyufeng 回答时间:2015-1-8 15:38:48
晓枫VS枯叶 发表于 2015-1-8 15:36
楼主的接收中断为什么不直接调用HAL的API写,还要搞寄存器!

HAL 库的 中断接收 是 主动调用的  

也就是主动接收  


我这里需要被动接收的
lovewyufeng 回答时间:2015-1-8 22:05:49
adersonl 发表于 2015-1-8 22:02
不太懂,估计楼主也是个小白。

  我先使用一下HAL API再来讨论啊  还真没用过~~
沐紫 回答时间:2015-1-8 14:12:57
楼主把上个帖子标题和网址也贴出来吧,这样能连贯看下来啦
liuqihui-347226 回答时间:2015-1-8 14:13:06
支持一下,做过类似的东西,确实,这样搞会方便很多
lovewyufeng 回答时间:2015-1-8 14:14:25
沐紫 发表于 2015-1-8 14:12
楼主把上个帖子标题和网址也贴出来吧,这样能连贯看下来啦

上一贴的 地址在 帖子 顶端呀
空漠 回答时间:2015-1-8 14:17:14
不明觉厉,MARK
lovewyufeng 回答时间:2015-1-8 14:19:28
贴的 代码  注释又没了  ,,,收敲酸了  明天重新编辑  注释吧
oipk 回答时间:2015-1-8 14:59:45
不明觉厉,MARK,楼主牛掰啊。看来我要动cube了
boyubeiyu 回答时间:2015-1-8 15:01:52
不错。学习下
qwe775208732 回答时间:2015-1-8 15:06:47
不懂,学习,哈哈
晓枫VS枯叶 回答时间:2015-1-8 15:36:34
楼主的接收中断为什么不直接调用HAL的API写,还要搞寄存器!
harvardx 回答时间:2015-1-8 15:44:18
不止是干活, 让我们这些rtos菜鸟 学习了怎么快速建立rtos项目 ,
晓枫VS枯叶 回答时间:2015-1-8 16:27:22
我看你这个接收也是中断接收啊!
aderson 回答时间:2015-1-8 22:02:25
晓枫VS枯叶 发表于 2015-1-8 16:27
我看你这个接收也是中断接收啊!

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