久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3488|回復: 0
打印 上一主題 下一主題
收起左側

RT-Thread工程移植到STM32f103 RTT-RTC做TICK 串口DMA接收源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:593779 發表于 2019-8-1 21:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
       初學RT-Thread,官網給的歷程大多是HAL庫版本的,原來做的項目中都是用的固件庫,底層驅動移植起來相當麻煩,于是網上找資料動手移植起來,實現功能:①線程中LED閃爍;②軟件定時器回調函數打印“timer1 is timeout”;③串口DMA接收數據,郵箱實現線程同步(信號量本已實現,為了驗證郵箱實現同樣的功能,屏蔽)并打印接收到的數據。
      平臺:正點原子精英開發板
全部資料51hei下載地址:
RTT-RTC做TICK.7z (2.03 MB, 下載次數: 29)
RT-Thread-串口DMA接收.7z (846.48 KB, 下載次數: 60)

STM32單片機源程序如下:
  1. /*
  2. *************************************************************************
  3. *                             包含的頭文件
  4. *************************************************************************
  5. */
  6. #include "board.h"
  7. #include "rtthread.h"
  8. #include <string.h>

  9. /*
  10. ******************************************************************
  11. *                               變量
  12. ******************************************************************
  13. */
  14. /* 定義線程控制塊 */
  15. static rt_thread_t usart_thread = RT_NULL;

  16. /* 定義線程控制塊 */
  17. static rt_thread_t led1_thread = RT_NULL;

  18. /* 定義信號量控制塊 */
  19. rt_sem_t test_sem = RT_NULL;


  20. /* 郵 箱 控 制 塊 */
  21. struct rt_mailbox mb;
  22. /* 用 于 放 郵 件 的 內 存 池 */
  23. static char mb_pool[128];

  24. /* 定 時 器 的 控 制 塊 */
  25. static rt_timer_t timer1;

  26. /************************* 全局變量聲明 ****************************/
  27. /*
  28. * 當我們在寫應用程序的時候,可能需要用到一些全局變量。
  29. */

  30. /* 相關宏定義 */
  31. extern char Usart_Rx_Buf[USART_RBUFF_SIZE];

  32. /*
  33. *************************************************************************
  34. *                             函數聲明
  35. *************************************************************************
  36. */
  37. static void usart_thread_entry(void* parameter);

  38. static void led1_thread_entry(void* parameter);
  39. static void timeout1(void *parameter);

  40. /*
  41. *************************************************************************
  42. *                             main 函數
  43. *************************************************************************
  44. */
  45. /**
  46.   * @brief  主函數
  47.   * @param  無
  48.   * @retval 無
  49.   */
  50. int main(void)
  51. {       
  52.         rt_err_t result;
  53.         /*
  54.          * 開發板硬件初始化,RTT系統初始化已經在main函數之前完成,
  55.          * 即在component.c文件中的rtthread_startup()函數中完成了。
  56.          * 所以在main函數中,只需要創建線程和啟動線程即可。
  57.          */

  58.         /* 創建一個信號量 */
  59.         //test_sem = rt_sem_create("test_sem",/* 消息隊列名字 */
  60.           //               0,     /* 信號量初始值,默認有一個信號量 */
  61.          //                RT_IPC_FLAG_FIFO); /* 信號量模式 FIFO(0x00)*/
  62.         //if (test_sem != RT_NULL)
  63.         //rt_kprintf("信號量創建成功!\n\n");

  64.         /* 初 始 化 一 個 mailbox */
  65.         result = rt_mb_init(&mb,
  66.                                         "mbt", /* 名 稱 是 mbt */
  67.                                         &mb_pool[0], /* 郵 箱 用 到 的 內 存 池 是 mb_pool */
  68.                                         sizeof(mb_pool) / 4, /* 郵 箱 中 的 郵 件 數 目 , 因 為 一 封 郵
  69.                                         件 占 4 字 節 */
  70.                                         RT_IPC_FLAG_FIFO); /* 采 用 FIFO 方 式 進 行 線 程 等 待 */
  71.         if (result != RT_EOK)
  72.         {
  73.                 rt_kprintf("init mailbox failed.\n");
  74.                 return -1;
  75.         }

  76.         usart_thread =                          /* 線程控制塊指針 */
  77.         rt_thread_create( "usart",              /* 線程名字 */
  78.                           usart_thread_entry,   /* 線程入口函數 */
  79.                           RT_NULL,             /* 線程入口函數參數 */
  80.                           512,                 /* 線程棧大小 */
  81.                           2,                   /* 線程的優先級 */
  82.                           20);                 /* 線程時間片 */
  83.                       
  84.         /* 啟動線程,開啟調度 */
  85.         if (usart_thread != RT_NULL)
  86.             rt_thread_startup(usart_thread);
  87.         else
  88.             return -1;

  89.        
  90.     led1_thread =                          /* 線程控制塊指針 */
  91.     rt_thread_create( "led1",              /* 線程名字 */
  92.                       led1_thread_entry,   /* 線程入口函數 */
  93.                       RT_NULL,             /* 線程入口函數參數 */
  94.                       512,                 /* 線程棧大小 */
  95.                       3,                   /* 線程的優先級 */
  96.                       20);                 /* 線程時間片 */
  97.                   
  98.     /* 啟動線程,開啟調度 */
  99.    if (led1_thread != RT_NULL)
  100.         rt_thread_startup(led1_thread);
  101.     else
  102.         return -1;

  103.         /* 創 建 定 時 器 1 周 期 定 時 器 */
  104.         timer1 = rt_timer_create("timer1", timeout1,
  105.                                                         RT_NULL, 2500,
  106.                                                         RT_TIMER_FLAG_PERIODIC);
  107.         /* 啟 動 定 時 器 1 */
  108.         if (timer1 != RT_NULL)
  109.                 rt_timer_start(timer1);

  110. }

  111. /*
  112. *************************************************************************
  113. *                             線程定義
  114. *************************************************************************
  115. */
  116. static void usart_thread_entry(void* parameter)
  117. {
  118.   rt_err_t uwRet = RT_EOK;       
  119.   char *str;
  120.     /* 任務都是一個無限循環,不能返回 */
  121.   while (1)
  122.   {
  123.                 //uwRet = rt_sem_take(test_sem,        /* 獲取串口中斷的信號量 */
  124.                         //-1);           /* 等待時間:0 */
  125.     uwRet=rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER);
  126.                     
  127.     if(RT_EOK == uwRet)
  128.     {
  129.       //rt_kprintf("收到數據:%s\n",Usart_Rx_Buf);
  130.       rt_kprintf("收到數據:%s\n",str);
  131.       memset(Usart_Rx_Buf,0,USART_RBUFF_SIZE);/* 清零 */
  132.     }


  133.   }
  134. }

  135. static void led1_thread_entry(void* parameter)
  136. {       
  137.     while (1)
  138.     {
  139.         LED1_ON;
  140.          rt_kprintf("LED1_ON\r\n");       
  141.         rt_thread_delay(5000);   /* 延時500個tick */
  142.         
  143.         LED1_OFF;  
  144.          rt_kprintf("LED1_OFF\r\n");       
  145.         rt_thread_delay(5000);   /* 延時500個tick */                                
  146.     }
  147. }

  148. /* 定 時 器 2 超 時 函 數 */
  149. static void timeout1(void *parameter)
  150. {
  151.         rt_kprintf("timer1 is timeout\n");
  152. }


  153. /********************************END OF FILE****************************/
復制代碼



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看av免费 | 日韩欧美精品 | 黑人精品 | 99久久精品免费看国产小宝寻花 | www..99re| 成人精品一区二区三区中文字幕 | 视频二区 | 国产精品久久久久久久久久久新郎 | 色爱区综合 | 一区2区 | 国产精品久久久久久一区二区三区 | 亚洲高清视频在线观看 | 国产精品视频在线观看 | 国产精品7777777 | 国产精品一区二区日韩 | 亚洲欧美日韩高清 | 久久国产亚洲精品 | 国产精品国产三级国产aⅴ浪潮 | 天天操操| 日韩在线免费视频 | 亚洲一区二区三区视频 | 国产一区二区三区免费 | 日韩成人中文字幕 | 视频一区中文字幕 | 亚洲视频 欧美视频 | 日韩精品免费在线观看 | 久久国产精彩视频 | 色婷婷综合久久久久中文一区二区 | 亚洲精品一区二区三区四区高清 | 色综合色综合网色综合 | 亚洲欧美激情国产综合久久久 | 国产农村一级国产农村 | 国产欧美日韩在线播放 | 日日操av| 网站国产 | 国产a区 | 国产亚洲一区精品 | 久久久精品综合 | 成人免费大片黄在线播放 | 91精品国产乱码久久久久久久 | 午夜在线免费观看 |