欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
RT-Thread工程移植到STM32f103 RTT-RTC做TICK 串口DMA接收源程序
[打印本頁]
作者:
312859829
時間:
2019-8-1 21:56
標題:
RT-Thread工程移植到STM32f103 RTT-RTC做TICK 串口DMA接收源程序
初學RT-Thread,官網給的歷程大多是HAL庫版本的,原來做的項目中都是用的固件庫,底層驅動移植起來相當麻煩,于是網上找資料動手移植起來,實現功能:①線程中LED閃爍;②軟件定時器回調函數打印“timer1 is timeout”;③串口DMA接收數據,郵箱實現線程同步(信號量本已實現,為了驗證郵箱實現同樣的功能,屏蔽)并打印接收到的數據。
平臺:正點原子精英開發板
全部資料51hei下載地址:
RTT-RTC做TICK.7z
(2.03 MB, 下載次數: 29)
2019-8-2 04:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
RT-Thread-串口DMA接收.7z
(846.48 KB, 下載次數: 60)
2019-8-2 04:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
STM32單片機源程序如下:
/*
*************************************************************************
* 包含的頭文件
*************************************************************************
*/
#include "board.h"
#include "rtthread.h"
#include <string.h>
/*
******************************************************************
* 變量
******************************************************************
*/
/* 定義線程控制塊 */
static rt_thread_t usart_thread = RT_NULL;
/* 定義線程控制塊 */
static rt_thread_t led1_thread = RT_NULL;
/* 定義信號量控制塊 */
rt_sem_t test_sem = RT_NULL;
/* 郵 箱 控 制 塊 */
struct rt_mailbox mb;
/* 用 于 放 郵 件 的 內 存 池 */
static char mb_pool[128];
/* 定 時 器 的 控 制 塊 */
static rt_timer_t timer1;
/************************* 全局變量聲明 ****************************/
/*
* 當我們在寫應用程序的時候,可能需要用到一些全局變量。
*/
/* 相關宏定義 */
extern char Usart_Rx_Buf[USART_RBUFF_SIZE];
/*
*************************************************************************
* 函數聲明
*************************************************************************
*/
static void usart_thread_entry(void* parameter);
static void led1_thread_entry(void* parameter);
static void timeout1(void *parameter);
/*
*************************************************************************
* main 函數
*************************************************************************
*/
/**
* @brief 主函數
* @param 無
* @retval 無
*/
int main(void)
{
rt_err_t result;
/*
* 開發板硬件初始化,RTT系統初始化已經在main函數之前完成,
* 即在component.c文件中的rtthread_startup()函數中完成了。
* 所以在main函數中,只需要創建線程和啟動線程即可。
*/
/* 創建一個信號量 */
//test_sem = rt_sem_create("test_sem",/* 消息隊列名字 */
// 0, /* 信號量初始值,默認有一個信號量 */
// RT_IPC_FLAG_FIFO); /* 信號量模式 FIFO(0x00)*/
//if (test_sem != RT_NULL)
//rt_kprintf("信號量創建成功!\n\n");
/* 初 始 化 一 個 mailbox */
result = rt_mb_init(&mb,
"mbt", /* 名 稱 是 mbt */
&mb_pool[0], /* 郵 箱 用 到 的 內 存 池 是 mb_pool */
sizeof(mb_pool) / 4, /* 郵 箱 中 的 郵 件 數 目 , 因 為 一 封 郵
件 占 4 字 節 */
RT_IPC_FLAG_FIFO); /* 采 用 FIFO 方 式 進 行 線 程 等 待 */
if (result != RT_EOK)
{
rt_kprintf("init mailbox failed.\n");
return -1;
}
usart_thread = /* 線程控制塊指針 */
rt_thread_create( "usart", /* 線程名字 */
usart_thread_entry, /* 線程入口函數 */
RT_NULL, /* 線程入口函數參數 */
512, /* 線程棧大小 */
2, /* 線程的優先級 */
20); /* 線程時間片 */
/* 啟動線程,開啟調度 */
if (usart_thread != RT_NULL)
rt_thread_startup(usart_thread);
else
return -1;
led1_thread = /* 線程控制塊指針 */
rt_thread_create( "led1", /* 線程名字 */
led1_thread_entry, /* 線程入口函數 */
RT_NULL, /* 線程入口函數參數 */
512, /* 線程棧大小 */
3, /* 線程的優先級 */
20); /* 線程時間片 */
/* 啟動線程,開啟調度 */
if (led1_thread != RT_NULL)
rt_thread_startup(led1_thread);
else
return -1;
/* 創 建 定 時 器 1 周 期 定 時 器 */
timer1 = rt_timer_create("timer1", timeout1,
RT_NULL, 2500,
RT_TIMER_FLAG_PERIODIC);
/* 啟 動 定 時 器 1 */
if (timer1 != RT_NULL)
rt_timer_start(timer1);
}
/*
*************************************************************************
* 線程定義
*************************************************************************
*/
static void usart_thread_entry(void* parameter)
{
rt_err_t uwRet = RT_EOK;
char *str;
/* 任務都是一個無限循環,不能返回 */
while (1)
{
//uwRet = rt_sem_take(test_sem, /* 獲取串口中斷的信號量 */
//-1); /* 等待時間:0 */
uwRet=rt_mb_recv(&mb, (rt_uint32_t *)&str, RT_WAITING_FOREVER);
if(RT_EOK == uwRet)
{
//rt_kprintf("收到數據:%s\n",Usart_Rx_Buf);
rt_kprintf("收到數據:%s\n",str);
memset(Usart_Rx_Buf,0,USART_RBUFF_SIZE);/* 清零 */
}
}
}
static void led1_thread_entry(void* parameter)
{
while (1)
{
LED1_ON;
rt_kprintf("LED1_ON\r\n");
rt_thread_delay(5000); /* 延時500個tick */
LED1_OFF;
rt_kprintf("LED1_OFF\r\n");
rt_thread_delay(5000); /* 延時500個tick */
}
}
/* 定 時 器 2 超 時 函 數 */
static void timeout1(void *parameter)
{
rt_kprintf("timer1 is timeout\n");
}
/********************************END OF FILE****************************/
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1