nich20xx 发表于 2020-7-9 06:16

【NUCLEO-WL55JC2测评5】移植RT-Thread到NUCLEO-WL55JC2

<div class='showpostmsg'> 本帖最后由 nich20xx 于 2020-7-9 09:10 编辑

<p><meta name="source" content="lake" /></p>

<h1 data-lake-id="df66d31825de10acf1141314fdf38d6c" id="XfwKl"><br />
1 前言</h1>

<p data-lake-id="ef14be26d8521c0d1066a6dd571dddd1">RT-Thread是一款功能强大、组件丰富的开源操作系统,结合STM32WL低功耗物联等特性,在STM32WL中运行RTOS有助于加速产品的开发与落地。</p>

<p data-lake-id="bc2189445d17b97d5d9339af2ecde84f">本文主要描述如何将RT-Thread移植到NUCLEO-WL55JC2开发板,新建一个基于RT-Thread的NUCLEO-WL55JC2 BSP。</p>

<p data-lake-id="9c3a0fd9d0aed8651474ab0719d89f7d">本文主要内容包括:</p>

<ul data-lake-id="1b3722a1260d669e62c1277619570b43" lake-indent="1">
        <li>新增STM32WL BSP</li>
        <li>运行控制台finish</li>
</ul>

<h1 data-lake-id="5340ea20852d7be51467cf8a82f8cb01" id="QvoSg">2 STM32 系列 BSP 流程</h1>

<p data-lake-id="cf29aa6876b9e4841ae9fa5060febbc2">RT-Thread官方提供了非常详细的《STM32 系列 BSP 制作教程》</p>

<ul>
        <li><a href="https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/STM32%E7%B3%BB%E5%88%97BSP%E5%88%B6%E4%BD%9C%E6%95%99%E7%A8%8B.md" target="_blank">https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/</a>STM32系列BSP制作教程.md</li>
</ul>

<p data-lake-id="093f5fd19914d29c1822427fedb4a8e2">STM32 BSP 框架结构如下图所示:</p>

<p data-lake-id="71b545f5782c9e3559938bd69d118291"></p>

<p data-lake-id="7d09c34d30a518da11bbf1efe590a407">每一个 STM32 系列的 BSP 由三部分组成,分别是通用库、BSP 模板和特定开发板 BSP。</p>

<table>
        <colgroup>
                <col span="1" width="162" />
                <col span="1" width="286" />
                <col span="1" width="316" />
        </colgroup>
        <thead>
                <tr>
                        <td colspan="3" rowspan="1">
                        <p data-lake-id="ab8109ad629563375eccd65023c50aa2">STM32WL BSP主要组成部分</p>
                        </td>
                </tr>
                <tr>
                        <td>项目</td>
                        <td>文件夹</td>
                        <td>说明</td>
                </tr>
        </thead>
        <tbody>
                <tr>
                        <td>通用库</td>
                        <td>stm32/libraries</td>
                        <td>
                        <ol data-lake-id="b926e5b639f218e1d466b0d4639eff26" lake-indent="0" start="1">
                                <li data-lake-id="099f4e0a8e5b4878ff7e6a8ab08da63b">用于存放 HAL 库(STM32WLxx_HAL)</li>
                                <li data-lake-id="b0408084b2bd3d07b89feec1401bf1a8">基于 HAL 库的多系列通用外设驱动文件(HAL_Drivers)</li>
                        </ol>
                        </td>
                </tr>
                <tr>
                        <td>
                        <p data-lake-id="bc8791229201044704e8272beb687224">STM32WL系列 BSP 工程模板</p>
                        </td>
                        <td>stm32/libraries/templates/stm32wlxx</td>
                        <td>
                        <p data-lake-id="335e48f2806827d8c874405485383b55">当前RT-thread暂未支持STM32WL</p>

                        <p data-lake-id="d719b25194838df57257083dc6b376a3">&nbsp;</p>
                        </td>
                </tr>
                <tr>
                        <td>特定开发板 BSP</td>
                        <td>stm32/nucleo-wl55jc2</td>
                        <td>
                        <p data-lake-id="338c6f201fc0de990dffc5a36da64e2e">主芯片 STM32WL55JC</p>
                        </td>
                </tr>
        </tbody>
</table>

<h1 data-lake-id="e198d64774631c989aa4783300ffa267" id="Iwswo">3 STM32WL BSP制作</h1>

<p data-lake-id="d67c8ab6e0bc71fe65280a2d0d13645a">由于当前RT-Thread暂未支持STM32WL,因此跟《STM32 系列 BSP 制作教程》中方式略微有些不同。当前STM32WL BSP 的制作过程主要如下步骤:</p>

<ol data-lake-id="a4aa4847e756d40465270a35bdd8ca4d" lake-indent="0" start="1">
        <li data-lake-id="981200917be3e97450c1934ce02dd6b2">在stm32/libraries增加STM32WL支持
        <ul>
                <li data-lake-id="981200917be3e97450c1934ce02dd6b2">新增 STM32WLxx_HAL</li>
                <li data-lake-id="981200917be3e97450c1934ce02dd6b2">更新HAL_Drivers
                <ul>
                        <li>STM32WL跟STM32L4比较接近,因此这部分可参考STM32L4</li>
                </ul>
                </li>
        </ul>
        </li>
        <li data-lake-id="623d009fc533edaf022f02b902d4fda6">新建NUCLEO-WL55JC2 BSP
        <ul>
                <li data-lake-id="623d009fc533edaf022f02b902d4fda6">修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本)</li>
                <li data-lake-id="623d009fc533edaf022f02b902d4fda6">配置工程
                <ul>
                        <li>当前 SetupSTM32CubeMX-6.99.1-D37 暂不支持C代码导出,当前需要手动修改</li>
                </ul>
                </li>
        </ul>
        </li>
</ol>

<h2 data-lake-id="13285438632643255f1c378d0c5bd571" id="CN2WI">3.1 在stm32/libraries增加STM32WL支持</h2>

<h3 data-lake-id="b1bb2b7a4f8acb72f5f89dea28599a16" id="1cbyc">3.1.1 新增 STM32WLxx_HAL</h3>

<ol data-lake-id="37089972db375e12c5d66e9d477659f4" lake-indent="0" start="1">
        <li data-lake-id="b17dc1240343e725234724c0411cae5b">在bsp\stm32\libraries 增加STM32WLxx_HAL及其相关驱动文件
        <ol>
                <li data-lake-id="b17dc1240343e725234724c0411cae5b">在rt-thread/bsp/stm32/libraries 新建 STM32WLxx_HAL</li>
                <li data-lake-id="b17dc1240343e725234724c0411cae5b">拷贝下面2个文件到STM32WLxx_HAL
                <ul>
                        <li>STM32Cube_FW_WL_V0.4.0\Drivers\STM32WLxx_HAL_Driver</li>
                        <li>STM32Cube_FW_WL_V0.4.0\Drivers\CMSIS</li>
                </ul>
                </li>
                <li>在STM32WLxx_HAL文件夹中增加SConsript文件</li>
        </ol>
        </li>
        <li data-lake-id="d39f3954ac8945833be1fc61495d3421">在bsp\stm32\libraries中的Kconfig增加 SOC_SERIES_STM32WL</li>
</ol>

<h3 data-lake-id="7271a31019155a1f258ad22db3623e3a" id="HQwLb">3.1.2 更新HAL_Drivers</h3>

<ol data-lake-id="fcb6d201a82f7b2eef1fe9923148331a" lake-indent="0" start="1">
        <li data-lake-id="6214ece20a26cb26423db9f5ab9c286c">在bsp\stm32\libraries\HAL_Drivers的Kconfig增加 SOC_SERIES_STM32WL<br />
        </li>
        <li data-lake-id="4fda03831b0bdcf85bb7ed035664d192">在bsp\stm32\libraries\HAL_Drivers的drv_config.h增加STM32WL支持</li>
</ol>

<p data-lake-id="ab2c511948d783db83c40bce0f853768"></p>

<ol data-lake-id="14eca02d89d50af5ec3e6bdd4b8a027c" lake-indent="0" start="3">
        <li data-lake-id="f412cb76935fe81ef6c37d76c5c66954">在bsp\stm32\libraries\HAL_Drivers\config 增加wl文件夹(直接复制STM32L4中的文件,然后在进行相应修改)
        <ul>
                <li data-lake-id="f412cb76935fe81ef6c37d76c5c66954">在drv_xx.c、.drv_xx.h中,在所有出现 SOC_SERIES_STM32L4 的地方,同时增加 SOC_SERIES_STM32WL 的条件判断</li>
                <li data-lake-id="f412cb76935fe81ef6c37d76c5c66954">例如&nbsp;</li>
        </ul>
        </li>
</ol>

<h2 data-lake-id="ec6710195cd74811a56c897a46601205" id="4smfU">3.2 新建NUCLEO-WL55JC2 BSP</h2>

<p data-lake-id="62f0df9a556ada82f7d0c515dc55b242">在rt-thread\bsp\stm32\路径下,新建stm32wl55-st-nucleo (拷贝 stm32l476-st-nucleo)</p>

<h3 data-lake-id="c282d1dcb3edadf7e495d7305ef65204" id="rh0xX">3.2.1 修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本)</h3>

<ol data-lake-id="a3bd7bd6e6b3e249ca53a2dab337dd89" lake-indent="0" start="1">
        <li data-lake-id="5f51b5d82970b1f09a3426ba143ffd7a">修改bsp\stm32\stm32wl55-st-nucleo\board\Kconfig,定义芯片型号SOC_STM32WL55JC,芯片系列为SOC_SERIES_STM32WL</li>
        <li data-lake-id="3fab871e0900b48011934e7e371c922f">修改 bsp\stm32\stm32wl55-st-nucleo\board\SConstruct,这步很关键,决定工程实际导入的stm32 HAL库</li>
</ol>

<p data-lake-id="d8e27bf58566faed145055379af9220b"></p>

<ol data-lake-id="6aeec5dce14f695b34aaf5ba6ffec326" lake-indent="0" start="3">
        <li data-lake-id="8e7e8f1b7246a45d4e56424d9d209e99">修改bsp\stm32\stm32wl55-st-nucleo\board\SConscript,<strong>SConscript</strong>&nbsp;脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件,SConscript脚本需要修改芯片型号以及芯片启动文件的地址,如下所示</li>
        <li data-lake-id="04130427ed26331c7b6273713bfc461f">修改bsp\stm32\stm32wl55-st-nucleo的template.uvprojx文件。<strong>template</strong>&nbsp;文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式等.</li>
</ol>

<blockquote>
<p data-lake-id="81c1174ca53752bcb51d94501b7f4803">注:首次需要安装STM32WLxx_DFP</p>
</blockquote>

<p data-lake-id="a3dba938e9d058b54010dff52a883785"></p>

<ol data-lake-id="5adfc970fc39bf3cae039fd500f80fb2" lake-indent="0" start="5">
        <li data-lake-id="4eb64e13f6fea0e56b43bebe6c23a5c4">修改bsp\stm32\stm32wl55-st-nucleo\board\linker_scripts链接脚本文件,MDK 使用的链接脚本 link.sct如下所示</li>
</ol>

<p data-lake-id="0e1f088bf0b48fcd33390888b7dcf19d"></p>

<h3 data-lake-id="8b3895bcdc1c8a7e2ec564eead232a6c" id="gc0M1">3.2.2 配置工程</h3>

<h4 data-lake-id="e654f984fbe0a490add3869012c2052f" id="78Sjt">3.2.2.1 修改board.h FLASH与SRAM大小</h4>

<ol>
        <li>修改bsp\stm32\stm32wl55-st-nucleo\board\board.h文件,Flash与SRAM大小</li>
</ol>

<h4 data-lake-id="da995dd9bb66e444c768ccea76eb7036" id="036Fy">3.2.2.2 修改SystemClock_Config</h4>

<ol data-lake-id="ed52e33909fdc97958e1c03e04385fe2" lake-indent="0" start="1">
        <li data-lake-id="86b9fd8a9c025c9f2d263b9652e09031">在&nbsp;board.c&nbsp;文件中存放了函数&nbsp;SystemClock_Config(),这部分可以先参考TM32Cube_FW_WL_V0.4.0\Projects\NUCLEO-WL55JC\Applications来进一步修改</li>
</ol>

<h4 data-lake-id="d01c5ab815680af8cb0fb40876bdac91" id="87w00">3.2.2.3 修改CubeMX_Config</h4>

<p data-lake-id="bf92118a5df9f7cf2203c3242a1e6338">由于当前CubeMX暂不完全支持STM32WL,因此当前CubeMX_Config中的部分文件需要手动修改</p>

<ol data-lake-id="55313c4168a1f9c2f8da92f675a9d9c6" lake-indent="0" start="1">
        <li data-lake-id="74c60baa0d86eeeedd47ed46941cef62">stm32wlxx_hal_msp.c增加LPUART1初始化
        <pre>
<code class="language-cpp">/**
* @brief UART MSP Initialization
* This function configures the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart-&gt;Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspInit 0 */

/* USER CODE END LPUART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_LPUART1_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**LPUART1 GPIO Configuration   
    PA3   ------&gt; LPUART1_RX
    PA2   ------&gt; LPUART1_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
    HAL_GPIO_Init(GPIOA, &amp;GPIO_InitStruct);

/* USER CODE BEGIN LPUART1_MspInit 1 */

/* USER CODE END LPUART1_MspInit 1 */
}

}

/**
* @brief UART MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/

void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{

if(huart-&gt;Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspDeInit 0 */

/* USER CODE END LPUART1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_LPUART1_CLK_DISABLE();

    /**LPUART1 GPIO Configuration   
    PA0   ------&gt; LPUART1_RX
    PA1   ------&gt; LPUART1_TX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);

/* USER CODE BEGIN LPUART1_MspDeInit 1 */

/* USER CODE END LPUART1_MspDeInit 1 */
}

}</code></pre>

        <p>&nbsp;</p>
        </li>
        <li data-lake-id="b0240e1d395ca88164b4f842edfe127d">ENV--&gt; menuconfig中,配置Console/Finish使用LPUART1(NUCLEO-WL55JC2默认使用LPUART1连接到ST-LINKV3虚拟串口)</li>
</ol>

<p data-lake-id="3b4c0a43e58a3f7ea1d62534d9f63b15"></p>

<p data-lake-id="05ab3c53428ba56fc90a46949b5223fe">完成上述操作后,通过Scons工具,生成MDK工程,</p>

<h3 data-lake-id="2591e890833056bf8aa8d338d19bfc73" id="gtvFB">3.3 测试验证</h3>

<p data-lake-id="86354c59b5d2a86dda3ddba0e56b217b">通过Micro USB连接NUCLO-WL55JC到PC,通过板载STLINKV3E下载代码到NUCLEO-WL55JC,然后通过串口来验证Finish是否OK。</p>

<p data-lake-id="310b5094e1dce1a8412d6e6abd9d56d2"></p>

<h1 data-lake-id="7651f53f959ae542fc1a3c01d6ff1499" id="fJNBc">4 参考</h1>

<ul data-lake-id="2e54d4bb7b33143c6c462ddff789127f" lake-indent="0">
        <li data-lake-id="c287f746477e991fa65d6b13cc42b9d9">RT-Thread官方 STM32 系列 BSP 制作教程
        <ul>
                <li data-lake-id="c287f746477e991fa65d6b13cc42b9d9"><a href="https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/STM32%E7%B3%BB%E5%88%97BSP%E5%88%B6%E4%BD%9C%E6%95%99%E7%A8%8B.md" target="_blank">https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/STM32%E7%B3%BB%E5%88%97BSP%E5%88%B6%E4%BD%9C%E6%95%99%E7%A8%8B.md</a></li>
        </ul>
        </li>
</ul>

<ul data-lake-id="b88196e91b6cbc5c90470828da33f84c" lake-indent="1">
        <li data-lake-id="db86947d53d2286e6ef0ac9b1d42a6dd">STM32Cube_FW_WL_V0.4.0</li>
</ul>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

freebsder 发表于 2020-7-9 20:50

<p>怎么一会make menu一会keil的样子?好复杂。</p>
页: [1]
查看完整版本: 【NUCLEO-WL55JC2测评5】移植RT-Thread到NUCLEO-WL55JC2