国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

RT-Thread STM32L475 IoT Discovery kit BSP說明①

這篇具有很好參考價值的文章主要介紹了RT-Thread STM32L475 IoT Discovery kit BSP說明①。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

RT-Thread STM32L475 IoT Discovery kit BSP說明①

RT-Thread STM32L475 IoT Discovery kit BSP說明①,Linux,ARM?MCU,MCU C51,stm32,linux,arm開發(fā),運維,物聯(lián)網(wǎng),嵌入式硬件,單片機

簡介

本文檔為 RT-Thread 開發(fā)團隊為 STM32L475 IoT Discovery kit開發(fā)板提供的 BSP (板級支持包) 說明。

主要內容如下:

  • 開發(fā)板資源介紹
  • BSP 快速上手
  • 進階使用方法

通過閱讀快速上手章節(jié)開發(fā)者可以快速地上手該 BSP,將 RT-Thread 運行在開發(fā)板上。在進階使用指南章節(jié),將會介紹更多高級功能,幫助開發(fā)者利用 RT-Thread 驅動更多板載資源。

開發(fā)板介紹

STM32L475 IoT Discovery kit 是 ST 官方推出的一款基于 ARM Cortex-M4 內核的開發(fā)板,最高主頻為 80Mhz,該開發(fā)板具有豐富的板載資源,可以充分發(fā)揮 STM32L475 的芯片性能。

開發(fā)板外觀如下圖所示:
RT-Thread STM32L475 IoT Discovery kit BSP說明①,Linux,ARM?MCU,MCU C51,stm32,linux,arm開發(fā),運維,物聯(lián)網(wǎng),嵌入式硬件,單片機

該開發(fā)板常用 板載資源 如下:

  • MCU:STM32L475VGT6,主頻 80MHz,1024KB FLASH ,128KB RAM
  • 常用外設
    • 姿態(tài)傳感器
    • 加速度傳感器
    • 磁力計
    • 接近傳感器
    • 壓力傳感器
    • 濕度傳感器
    • 擴音器
    • 板載 ST LINK V2.1 功能
  • 常用接口:USB OTG、Arduino Uno 和 Pmod 接口
  • 調試接口:ST-LINK Micro USB 接口(ST-LINK 轉串口對應 串口1)
  • 支持 mbed

開發(fā)板更多詳細信息請參考ST官方網(wǎng)站 STM32 開發(fā)板介紹

外設支持

本 BSP 目前對片上外設的支持情況如下:

片上外設 支持情況 備注
GPIO 支持
UART 支持 UART1

使用說明

使用說明分為如下兩個章節(jié):

  • 快速上手

    本章節(jié)是為剛接觸 RT-Thread 的新手準備的使用說明,遵循簡單的步驟即可將 RT-Thread 操作系統(tǒng)運行在該開發(fā)板上,看到實驗效果。

  • 進階使用

    本章節(jié)是為需要在 RT-Thread 操作系統(tǒng)上使用更多開發(fā)板資源的開發(fā)者準備的。通過使用 ENV 工具對 BSP 進行配置,可以開啟更多板載資源,實現(xiàn)更多高級功能。

快速上手

本 BSP 為開發(fā)者提供 MDK5 和 IAR 工程,并且支持 GCC 開發(fā)環(huán)境。下面以 MDK5 開發(fā)環(huán)境為例,介紹如何將系統(tǒng)運行起來。

硬件連接

使用數(shù)據(jù)線連接開發(fā)板到 PC。

編譯下載

雙擊 project.uvprojx 文件,打開 MDK5 工程,編譯并下載程序到開發(fā)板。

工程默認配置使用板載 ST-LINK 下載程序,只需一根 USB 線連接開發(fā)板,點擊下載按鈕即可下載程序到開發(fā)板

運行結果

下載程序成功之后,系統(tǒng)會自動運行,觀察開發(fā)板上 LED 的運行效果,綠色 LED 會周期性閃爍。

連接開發(fā)板對應串口到 PC , 在終端工具里打開相應的串口(115200-8-1-N),復位設備后,可以看到 RT-Thread 的輸出信息:

 \ | /
- RT -     Thread Operating System
 / | \     4.0.1 build Mar 18 2019
 2006 - 2019 Copyright by rt-thread team

進階使用

此 BSP 默認只開啟了 GPIO 和 串口1 的功能,如果需使用 更多高級功能,需要利用 ENV 工具對 BSP 進行配置,步驟如下:

  1. 在 bsp 下打開 env 工具。

  2. 輸入menuconfig命令配置工程,配置好之后保存退出。

  3. 輸入pkgs --update命令更新軟件包。

  4. 輸入scons --target=mdk4/mdk5/iar 命令重新生成工程。

本章節(jié)更多詳細的介紹請參考 STM32 系列 BSP 外設驅動使用教程。

注意事項

暫無

示例代碼

…\src\ipc.c

static rt_ssize_t _rt_mq_recv(rt_mq_t mq,
                              void *buffer,
                              rt_size_t size,
                              rt_int32_t *prio,
                              rt_int32_t timeout,
                              int suspend_flag)
{
    struct rt_thread *thread;
    rt_base_t level;
    struct rt_mq_message *msg;
    rt_uint32_t tick_delta;
    rt_err_t ret;
    rt_size_t len;

    /* parameter check */
    RT_ASSERT(mq != RT_NULL);
    RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);
    RT_ASSERT(buffer != RT_NULL);
    RT_ASSERT(size != 0);

    /* current context checking */
    RT_DEBUG_SCHEDULER_AVAILABLE(timeout != 0);

    /* initialize delta tick */
    tick_delta = 0;
    /* get current thread */
    thread = rt_thread_self();
    RT_OBJECT_HOOK_CALL(rt_object_trytake_hook, (&(mq->parent.parent)));

    level = rt_spin_lock_irqsave(&(mq->spinlock));

    /* for non-blocking call */
    if (mq->entry == 0 && timeout == 0)
    {
        rt_spin_unlock_irqrestore(&(mq->spinlock), level);

        return -RT_ETIMEOUT;
    }

    /* message queue is empty */
    while (mq->entry == 0)
    {
        /* reset error number in thread */
        thread->error = -RT_EINTR;

        /* no waiting, return timeout */
        if (timeout == 0)
        {
            /* enable interrupt */
            rt_spin_unlock_irqrestore(&(mq->spinlock), level);

            thread->error = -RT_ETIMEOUT;

            return -RT_ETIMEOUT;
        }

        /* suspend current thread */
        ret = _ipc_list_suspend(&(mq->parent.suspend_thread),
                            thread,
                            mq->parent.parent.flag,
                            suspend_flag);
        if (ret != RT_EOK)
        {
            rt_spin_unlock_irqrestore(&(mq->spinlock), level);
            return ret;
        }

        /* has waiting time, start thread timer */
        if (timeout > 0)
        {
            /* get the start tick of timer */
            tick_delta = rt_tick_get();

            LOG_D("set thread:%s to timer list",
                  thread->parent.name);

            /* reset the timeout of thread timer and start it */
            rt_timer_control(&(thread->thread_timer),
                             RT_TIMER_CTRL_SET_TIME,
                             &timeout);
            rt_timer_start(&(thread->thread_timer));
        }

        rt_spin_unlock_irqrestore(&(mq->spinlock), level);

        /* re-schedule */
        rt_schedule();

        /* recv message */
        if (thread->error != RT_EOK)
        {
            /* return error */
            return thread->error;
        }

        level = rt_spin_lock_irqsave(&(mq->spinlock));

        /* if it's not waiting forever and then re-calculate timeout tick */
        if (timeout > 0)
        {
            tick_delta = rt_tick_get() - tick_delta;
            timeout -= tick_delta;
            if (timeout < 0)
                timeout = 0;
        }
    }

    /* get message from queue */
    msg = (struct rt_mq_message *)mq->msg_queue_head;

    /* move message queue head */
    mq->msg_queue_head = msg->next;
    /* reach queue tail, set to NULL */
    if (mq->msg_queue_tail == msg)
        mq->msg_queue_tail = RT_NULL;

    /* decrease message entry */
    if(mq->entry > 0)
    {
        mq->entry --;
    }

    rt_spin_unlock_irqrestore(&(mq->spinlock), level);

    /* get real message length */
    len = ((struct rt_mq_message *)msg)->length;

    if (len > size)
        len = size;
    /* copy message */
    rt_memcpy(buffer, GET_MESSAGEBYTE_ADDR(msg), len);

#ifdef RT_USING_MESSAGEQUEUE_PRIORITY
    if (prio != RT_NULL)
        *prio = msg->prio;
#endif
    level = rt_spin_lock_irqsave(&(mq->spinlock));
    /* put message to free list */
    msg->next = (struct rt_mq_message *)mq->msg_queue_free;
    mq->msg_queue_free = msg;

    /* resume suspended thread */
    if (!rt_list_isempty(&(mq->suspend_sender_thread)))
    {
        _ipc_list_resume(&(mq->suspend_sender_thread));

        rt_spin_unlock_irqrestore(&(mq->spinlock), level);

        RT_OBJECT_HOOK_CALL(rt_object_take_hook, (&(mq->parent.parent)));

        rt_schedule();

        return len;
    }

    rt_spin_unlock_irqrestore(&(mq->spinlock), level);

    RT_OBJECT_HOOK_CALL(rt_object_take_hook, (&(mq->parent.parent)));

    return len;
}

rt_ssize_t rt_mq_recv(rt_mq_t    mq,
                    void      *buffer,
                    rt_size_t  size,
                    rt_int32_t timeout)
{
    return _rt_mq_recv(mq, buffer, size, 0, timeout, RT_UNINTERRUPTIBLE);
}
RTM_EXPORT(rt_mq_recv);

rt_ssize_t rt_mq_recv_interruptible(rt_mq_t    mq,
                    void      *buffer,
                    rt_size_t  size,
                    rt_int32_t timeout)
{
    return _rt_mq_recv(mq, buffer, size, 0, timeout, RT_INTERRUPTIBLE);
}
RTM_EXPORT(rt_mq_recv_interruptible);

rt_ssize_t rt_mq_recv_killable(rt_mq_t    mq,
                    void      *buffer,
                    rt_size_t  size,
                    rt_int32_t timeout)
{
    return _rt_mq_recv(mq, buffer, size, 0, timeout, RT_KILLABLE);
}
#ifdef RT_USING_MESSAGEQUEUE_PRIORITY
rt_err_t rt_mq_send_wait_prio(rt_mq_t mq,
                              const void *buffer,
                              rt_size_t size,
                              rt_int32_t prio,
                              rt_int32_t timeout,
                              int suspend_flag)
{
    return _rt_mq_send_wait(mq, buffer, size, prio, timeout, suspend_flag);
}
rt_ssize_t rt_mq_recv_prio(rt_mq_t mq,
                           void *buffer,
                           rt_size_t size,
                           rt_int32_t *prio,
                           rt_int32_t timeout,
                           int suspend_flag)
{
    return _rt_mq_recv(mq, buffer, size, prio, timeout, suspend_flag);
}
#endif
RTM_EXPORT(rt_mq_recv_killable);
/**
 * @brief    This function will set some extra attributions of a messagequeue object.
 *
 * @note     Currently this function only supports the RT_IPC_CMD_RESET command to reset the messagequeue.
 *
 * @param    mq is a pointer to a messagequeue object.
 *
 * @param    cmd is a command used to configure some attributions of the messagequeue.
 *
 * @param    arg is the argument of the function to execute the command.
 *
 * @return   Return the operation status. When the return value is RT_EOK, the operation is successful.
 *           If the return value is any other values, it means that this function failed to execute.
 */
rt_err_t rt_mq_control(rt_mq_t mq, int cmd, void *arg)
{
    rt_base_t level;
    struct rt_mq_message *msg;

    /* parameter check */
    RT_ASSERT(mq != RT_NULL);
    RT_ASSERT(rt_object_get_type(&mq->parent.parent) == RT_Object_Class_MessageQueue);

    if (cmd == RT_IPC_CMD_RESET)
    {
        level = rt_spin_lock_irqsave(&(mq->spinlock));

        /* resume all waiting thread */
        _ipc_list_resume_all(&mq->parent.suspend_thread);
        /* also resume all message queue private suspended thread */
        _ipc_list_resume_all(&(mq->suspend_sender_thread));

        /* release all message in the queue */
        while (mq->msg_queue_head != RT_NULL)
        {
            /* get message from queue */
            msg = (struct rt_mq_message *)mq->msg_queue_head;

            /* move message queue head */
            mq->msg_queue_head = msg->next;
            /* reach queue tail, set to NULL */
            if (mq->msg_queue_tail == msg)
                mq->msg_queue_tail = RT_NULL;

            /* put message to free list */
            msg->next = (struct rt_mq_message *)mq->msg_queue_free;
            mq->msg_queue_free = msg;
        }

        /* clean entry */
        mq->entry = 0;

        rt_spin_unlock_irqrestore(&(mq->spinlock), level);

        rt_schedule();

        return RT_EOK;
    }

    return -RT_ERROR;
}
RTM_EXPORT(rt_mq_control);

/**@}*/
#endif /* RT_USING_MESSAGEQUEUE */
/**@}*/

源碼下載

…\bsp\stm32\stm32l475-st-discovery\project.uvproj

RT-Thread STM32L475 IoT Discovery kit BSP說明①,Linux,ARM?MCU,MCU C51,stm32,linux,arm開發(fā),運維,物聯(lián)網(wǎng),嵌入式硬件,單片機


RT-Thread STM32L475 IoT Discovery kit BSP說明① 源碼下載文章來源地址http://www.zghlxwxcb.cn/news/detail-783938.html


維護人:

  • 華為奮斗者精神, 郵箱:1992152446@qq.com

到了這里,關于RT-Thread STM32L475 IoT Discovery kit BSP說明①的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【STM32&RT-Thread零基礎入門】8. 基于 CubeMX 移植 RT-Thread Nano

    【STM32&RT-Thread零基礎入門】8. 基于 CubeMX 移植 RT-Thread Nano

    硬件:STM32F103ZET6、ST-LINK、usb轉串口工具、4個LED燈、1個蜂鳴器、4個1k電阻、2個按鍵、面包板、杜邦線 利用RT_Thread操作系統(tǒng)實現(xiàn)三種不同的LED等閃爍 提示:以下是本篇文章正文內容,下面案例可供參考 cubemx配置參考教程: 基于 CubeMX 移植 RT-Thread Nano 后面程序所需的引腳 RT

    2024年02月09日
    瀏覽(30)
  • STM32 + RT-Thread + LwIp + DM9000

    STM32 + RT-Thread + LwIp + DM9000

    開發(fā)板:STM32F103ZET6(戰(zhàn)艦) RT-Thread:5.0.0 LwIp:2.1.2 網(wǎng)卡芯片:DM9000 編譯環(huán)境:keil 我簡單了解了一下,在嵌入式中,網(wǎng)絡芯片的使用方式大致有三種,如下: (MCU + MAC + PHY) (MUC + MAC) —— PHY MCU —— (MAC + PHY) 注意: 我用括號里面的表示在同一塊芯片中 移植 RT-Thread 不是此文

    2024年02月07日
    瀏覽(59)
  • RT Thread Stdio生成STM32L431RCT6無法啟動問題

    RT Thread Stdio生成STM32L431RCT6無法啟動問題

    使用RT thread Stdio生成STM32L431RCT6工程后,編譯下載完成后系統(tǒng)無法啟動,無法仿真debug; 如果當前使用的芯片支持包版本為0.2.3,可能是這個版本問題,目前測試0.2.3存在問題,修改為0.1.9就可以正常使用。 (1)郵件單擊項目--修改工程--芯片支持包: (2)如果當前版本是0.2

    2024年01月19日
    瀏覽(30)
  • 【STM32&RT-Thread零基礎入門】 4. 線程介紹(理論)

    【STM32&RT-Thread零基礎入門】 4. 線程介紹(理論)

    前文中的最后一個任務發(fā)現(xiàn),一個main()函數(shù)很難同時實現(xiàn)按鍵功能和閃燈功能,就好像人很難同時完成左手畫圓右手畫方一樣,這種情況可以安排一人去畫圓、一人去畫方,并行進行就很容易了,兩人各司其職,互不干擾。 操作系統(tǒng)中,一個線程就像做事的一個人。一個操作

    2024年02月12日
    瀏覽(18)
  • RT-Thread:STM32實時時鐘 RTC開啟及應用

    RT-Thread:STM32實時時鐘 RTC開啟及應用

    說明: STM32F103/407系列基于 RT-Thread 系統(tǒng)的 RTC 開啟及應用 應用流程介紹。 完成以上系統(tǒng)配置,編譯無誤情況下RTC 就已經(jīng)開啟了。 官方 API 查詢地址:https://www.rt-thread.org/document/api/rtc_sample_8c-example.html#a3 1.設置日期:設置系統(tǒng)日期但不修改時間 2.設置時間:設置系統(tǒng)時間但不

    2024年01月17日
    瀏覽(26)
  • STM32CubeMX+VSCODE+EIDE+RT-THREAD 工程創(chuàng)建

    STM32CubeMX+VSCODE+EIDE+RT-THREAD 工程創(chuàng)建

    ????????Eide環(huán)境搭建暫且不表,后續(xù)補充。主要記錄下Vscode環(huán)境下 創(chuàng)建Rt-thread工程的過程。分別介紹STM32CubeMX添加rtt支持包的方式和手動添加rtt kernel方式。STM32CubeMX生成工程的時候有\(zhòng)\\"坑\\\",防止下次忘記,方便渡一下有緣人,特此記錄。 ? ? ? ? 此工程以創(chuàng)建stm32f405為例

    2024年02月14日
    瀏覽(27)
  • RT-Thread STM32 GoKit V2.1 開發(fā)板BSP說明

    RT-Thread STM32 GoKit V2.1 開發(fā)板BSP說明

    本文檔為劉恒為 GoKit V2.1 開發(fā)板提供的 BSP (板級支持包) 說明。 主要內容如下: 開發(fā)板資源介紹 BSP 快速上手 進階使用方法 通過閱讀快速上手章節(jié)開發(fā)者可以快速地上手該 BSP,將 RT-Thread 運行在開發(fā)板上。在進階使用指南章節(jié),將會介紹更多高級功能,幫助開發(fā)者利用 RT-

    2024年02月04日
    瀏覽(22)
  • 基于stm32單片機和rt-thread操作系統(tǒng)的智能燈

    基于stm32單片機和rt-thread操作系統(tǒng)的智能燈

    目????錄 一、 總體概況 二、 各部分介紹 2.1??STM32F4開發(fā)板 2.2??光敏模塊 2.3 ?麥克風模塊 2.4??超聲波模塊 三、 RT-Thread介紹 四、 開發(fā)過程 五、 未來設想 六、 開發(fā)心得 總體概況 本次測試技術與信號處理課程作業(yè),我利用了stm32單片機和rt-thread實時操作系統(tǒng)進行實踐。

    2023年04月16日
    瀏覽(21)
  • 【STM32&RT-Thread零基礎入門】 7. 線程創(chuàng)建應用(多線程運行機制)

    【STM32&RT-Thread零基礎入門】 7. 線程創(chuàng)建應用(多線程運行機制)

    硬件:STM32F103ZET6、ST-LINK、usb轉串口工具、4個LED燈、1個蜂鳴器、4個1k電阻、2個按鍵、面包板、杜邦線 本章進一步研究多線程的運行機制。要求實現(xiàn)功能如下:創(chuàng)建2個線程,線程名稱分別為LED和BEEP。兩個線程的任務是連續(xù)5次打印本線程的名字后退出線程(注意:線程不執(zhí)行

    2024年02月03日
    瀏覽(30)
  • Clion開發(fā)STM32之I2C驅動(參考RT-Thread)

    本章是根據(jù)RT-Thread源碼中的I2C組件進行抽離,主要不習慣用RT-Thread 然后在結合at24cxx模塊補充測試 也為了方便移植和獨立于框架的限制。 操作gpio部分 頭文件 源碼 頭文件 源文件

    2024年02月10日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包