打印
[STM32WB]

stm32wb55 基于rtt的ble sample制作过程

[复制链接]
3083|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wiba|  楼主 | 2021-8-10 10:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
准备活动
硬件
stm32wb55 nucleo开发板
stm32wb55 dangle
软件
rtthread stm32wb55 bsp
st官方 stm32wb固件包
开发环境
keil MDK
vscode
rtthread env
概述
本文的目的是将ST官方的STM32WB55 固件包里的BLE sample移植到RT-Thread,最终变为rtt生态的一个软件包,让更多开发者都可以直接做基于rtt开箱即用。

移植前准备
生成基于rtt的stm32wb55的最小工程
首先需要clone rtthread的stm32wb55的bsp,然后创建基本的工程,这一步很简单,从官方github仓库clone最新的代码,然后定位到stm32wb55的bsp,使用env scons --dist生成wb55最小工程。如下所示:


xph@XPHPC D:\GitHub\rt-thread\bsp\stm32\stm32wb55-st-nucleo         
> scons --dist                                                      
scons: Reading SConscript files ...                                 
make distribution....                                               
=> stm32wb55-st-nucleo                                             
=> start dist handle                                                
=> copy stm32 bsp library                                          
=> copy bsp drivers                                                
=> components                                                      
=> include                                                         
=> libcpu                                                           
=> src                                                              
=> tools                                                            
update mdk5 project                                                
update iar project                                                  
done!                                                               



然后用keil打开,编译烧录到nucleo开发板中验证。当开发板LED1蓝灯开始闪烁,同时串口有打印信息输出,则表示基于rtthread的最小工程生成成功。

\ | /
- RT -     Thread Operating System
/ | \     4.0.3 build Jan  7 2021
2006 - 2020 Copyright by rt-thread team
msh >
st官方固件包删除不相关代码
我们从最基础的beacon工程开始移植,删除其他不必要的工程文件和文件夹,方便代码分析工具分析和定位。如果工程文件夹太多,诸如vscode source insight这类代码工具就很难做到精确跳转。
如下图所示,我只保留基于keil mdk的beacon工程,其他的不相干的工程全部删除。

检查的方法也很简单,在固件包中搜索一下main.c函数,看一下有没有多余的就行了。
然后打开这个beacon工程,编译一下,没有错误,没有警告,那么准备工作就做好了。





使用特权

评论回复
沙发
wiba|  楼主 | 2021-8-10 10:13 | 只看该作者
移植
我的移植思路是,将ST官方的sample当作rtt中的一个线程,这样子即不影响其他线程的使用移植起来也比较方便。

工程创建
创建ibeacon线程
static int ibeacon_thread_init(void)
{
  rt_thread_t ibeacon_thread;
  ibeacon_thread = rt_thread_create("ibeacon",
                                    ibeacon_thread_entry,
                                    RT_NULL,
                                    1024,
                                    2,
                                    10);
  if (ibeacon_thread != RT_NULL)
  {
    rt_thread_startup(ibeacon_thread);
  }
  return RT_EOK;
}

INIT_APP_EXPORT(ibeacon_thread_init);




将st官方sample中的main函数移植过来,放在ibeacon线程的入口函数中
static void ibeacon_thread_entry(void *parameter)
{
  LOG_D("ibeacon thread entry...");
  /**
   * The OPTVERR flag is wrongly set at power on
   * It shall be cleared before using any HAL_FLASH_xxx() api
   */
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
  HAL_Init();
  Reset_Device();
  Init_Exti();
  MX_GPIO_Init();
  MX_RTC_Init();
  /* Init code for STM32_WPAN */
  APPE_Init();
  while (1)
  {
    UTIL_SEQ_Run(UTIL_SEQ_DEFAULT);
    rt_thread_mdelay(10);
  }
}




将STM32_WPAN中间件整体复制过来,然后根据st的sample工程将BLE相关文件都加进去


编译,根据编译错误将缺失的文件加入到工程中去,直到编译完成


使用特权

评论回复
板凳
wiba|  楼主 | 2021-8-10 10:14 | 只看该作者
关于文件的分组
STM32_WPAN这个文件夹里面存放的是ST关于无线协议的中间件,包括BLE、thread、zigbee等等,所以移植的时候直接整体搬过去就好了,至于里面的东西可以暂不做考虑。

STM32WB特有的低功耗管理组件和列表单独做通用分组


其他需要用到的文件统一放到ibeacon分组中


移植注意事项
以上工作全部完成后,编译运行后程序运行正常,但是通过nrf connect是无法扫描到beacon的,对比分析后发现两部分地方需要修改。


使用特权

评论回复
地板
wiba|  楼主 | 2021-8-10 10:15 | 只看该作者
中断处理函数需要移植
之前的固有印象是STM32的HAL库中断处理函数全都是虚函数方式然后通过注册回调函数来最终执行用户自己的中断服务函数。这也是忽略该步骤的重要原因之一,因为之前的STD或者寄存器版本没有写中断服务函数是会编译报错的。

将以下三个中断服务函数放在ibeacon线程.c文件中。

/**
* ! RTC timeserver处理中断服务函数
*/
void RTC_WKUP_IRQHandler(void)
{
  HW_TS_RTC_Wakeup_Handler();
}

/**
* ! IPCC 通讯收发中断处理函数
*/
void IPCC_C1_TX_IRQHandler(void)
{
  HW_IPCC_Tx_Handler();

  return;
}

void IPCC_C1_RX_IRQHandler(void)
{
  HW_IPCC_Rx_Handler();
  return;
}




这三个中断服务函数主要是用来处理CPU1和CPU2之间的通讯的,这部分内容后面再介绍。

link文件需要更改
STM32WB是一颗双核MCU,他们共享了部分flash和RAM,所以不能像传统的单核M4内核那样定义link文件,需要将部分flash和RAM资源留出来给协处理器使用。具体的更改直接参考ST的sample工程中的link文件。


经过以上两步的修改,编译烧录后就可以正常使用了


使用特权

评论回复
5
wanduzi| | 2022-8-10 13:28 | 只看该作者

使用特权

评论回复
6
两只袜子| | 2022-8-10 15:36 | 只看该作者
很棒啊,感谢分享,学习了

使用特权

评论回复
7
morrisk| | 2022-8-10 22:04 | 只看该作者
处理CPU1和CPU2之间的通讯的部分是否可以详细说下

使用特权

评论回复
8
Uriah| | 2022-10-1 12:30 | 只看该作者

一种了解状态变化的简单方法

使用特权

评论回复
9
Bblythe| | 2022-10-1 15:29 | 只看该作者

单片机一般都有内部程序区和数据区

使用特权

评论回复
10
童雨竹| | 2023-1-20 07:25 | 只看该作者

需要设定一个阈值来对像素点进行设置

使用特权

评论回复
11
Wordsworth| | 2023-1-20 08:28 | 只看该作者

对于优秀程序员来说,这不是好代码

使用特权

评论回复
12
Clyde011| | 2023-1-20 09:31 | 只看该作者

电压范围称为工作电源电压

使用特权

评论回复
13
万图| | 2023-1-20 11:27 | 只看该作者

没有发现有哪本是介绍设计思想的

使用特权

评论回复
14
Uriah| | 2023-1-20 12:30 | 只看该作者

在掌握对象的变化频度时是有效的

使用特权

评论回复
15
帛灿灿| | 2023-1-20 14:26 | 只看该作者

一部分是I2C1的工作模块,另外一部分是其控制模块

使用特权

评论回复
16
Bblythe| | 2023-1-20 15:29 | 只看该作者

大部分单片机都带有加密锁定位或者加密字节

使用特权

评论回复
17
周半梅| | 2023-1-20 17:25 | 只看该作者

负片转印(Subtractive transfer)的方式将设计好的PCB线路板的线路底片“印刷”在金属导体上。

使用特权

评论回复
18
Pulitzer| | 2023-1-20 18:28 | 只看该作者

128以上的某些地址为特殊寄存器使用,不能给程序用

使用特权

评论回复
19
周半梅| | 2023-1-20 19:31 | 只看该作者

主定时器为TIM1,通道2配置为PWM输出

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

3305

帖子

3

粉丝