nich20xx

  • 2020-07-09
  • 发表了主题帖: 【NUCLEO-WL55JC2测评6】 LoRa点对点通信

    本帖最后由 nich20xx 于 2020-7-9 09:09 编辑   1 前言 LoRa调制方式是STM32WL的核心功能之一。 NUCLEO-WL55JC2的LoRa IP采用的是SX126x,因此LoRa部分的软件操作,跟单芯片SX126x软件访问方式有些相似,ST提供了类似SPI方式的API接口。 本文主要内容提要: LoRa点对点单向、双向通信 互通性验证 NUCLEO-WL55JC2、SX126x 模块、SX1278模块 互联互通
    lora-radio-driver代码github仓库 https://github.com/Forest-Rain/lora-radio-driver
    2 LoRa通信 2.1 LoRa数据帧格式 LoRa数据帧支持显性格式(Explicit header mode packet)与隐形格式( Implicit header mode packet )(no header)。 2.2 LoRa通信参数 LoRa通信参数主要有: spreading factor (SF) modulation bandwidth (BW) error coding rate (CR) low data rate optimization (LDRO) 对于高SF或者低BW,同时长数据包,LDRO被使能,以便接收机更好正确解调LoRa信号 根据实际应用来选择合适的LoRa通信参数,以在链路预算、抗干扰、带宽、标称速率等之间获得平衡。 2.3 STM32WL LoRa驱动 3 LoRa点对点通信 一次完整的双向通信过程如下: 主机发起通信,发送一个数据包完成后,立即进入接收 从机默认一直处于接收状态,接收到主机的数据后,回传接收到的数据包 主机端接收到应答数据后,判断接收数据包内容是否正确 同时使用一个设备只接收,用作监听设备,用于监听与分析主机与从机发送的数据。 点对点双向通信流程 3.1 通信测试 3.1.1 LoRa通信参数配置 3.1.1.1 射频初始化 #define TX_OUTPUT_POWER 14 // dBm #define LORA_BANDWIDTH 0 // [0: 125 kHz, // 1: 250 kHz, // 2: 500 kHz, // 3: Reserved] #define LORA_SPREADING_FACTOR 7 // [SF7..SF12] #define LORA_CODINGRATE 1 // [1: 4/5, // 2: 4/6, // 3: 4/7, // 4: 4/8] #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx #define LORA_SYMBOL_TIMEOUT 0 // Symbols { // ... Radio.SetChannel( lora_radio_test_paras.frequency ); Radio.SetTxConfig( MODEM_LORA, lora_radio_test_paras.txpower, 0, lora_radio_test_paras.bw, lora_radio_test_paras.sf, lora_radio_test_paras.cr, LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, true, 0, 0, LORA_IQ_INVERSION_ON, 3000 ); Radio.SetRxConfig( MODEM_LORA, lora_radio_test_paras.bw, lora_radio_test_paras.sf, lora_radio_test_paras.cr, 0, LORA_PREAMBLE_LENGTH, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, true, 0, 0, LORA_IQ_INVERSION_ON, true ); } 3.1.1.2 生成空口测试包 void send_ping_packet(uint32_t src_addr,uint32_t dst_addr,uint8_t len) { tx_seq_cnt++; tx_timestamp = TimerGetCurrentTime(); // Send the next PING frame uint8_t index = 0; // header Buffer[index++] = 0x00; // echo cmd Buffer[index++] = src_addr & 0xFF; Buffer[index++] = src_addr >> 8; Buffer[index++] = src_addr >> 16; Buffer[index++] = src_addr >> 24; Buffer[index++] = dst_addr & 0xFF; Buffer[index++] = dst_addr >> 8; Buffer[index++] = dst_addr >> 16; Buffer[index++] = dst_addr >> 24; Buffer[index++] = tx_seq_cnt & 0xFF; Buffer[index++] = tx_seq_cnt >> 8; Buffer[index++] = tx_seq_cnt >> 16; Buffer[index++] = tx_seq_cnt >> 24; // data Buffer[index++] = 'P'; Buffer[index++] = 'I'; Buffer[index++] = 'N'; Buffer[index++] = 'G'; // 00,01,02... for( uint8_t i = 0; i < len - index ; i++) { Buffer[index + i] = i; } rt_thread_mdelay(1); Radio.Send( Buffer, len ); } 3.2 通信测试结果 3.2.1 单向通信 测试目的 验证NUCLEO-WL32JC2单向LoRa通信 测试设备: 1个NUCLEO-WL32JC2 1个SX1268模块 测试步骤 使用NUCLEO-WL32JC2发送,SX1268模块接收 1个NUCLEO-WL32JC2为发送端 ( lora ping -m) 1个SX1268模块只接收(监听)( lora ping -s) STM32WL发送,SX1268模块接收 3.2.2 双向通信 测试目的 验证NUCLEO-WL32JC2的双向通信 测试设备: 2个NUCLEO-WL32JC2 测试步骤 主机输入 lora ping -m,主机测试日志如下 主机STM32WL发送,并接收应答 从机输入 lora ping -s,-s也可以缺省,从机测试日志如下 从机SX1268模块侧接收数据,然后回传 3.2.3 互通性 测试目的: 验证STM32WL与SX126X、SX127X模块之间的互连互通。 测试设备: 1个NUCLEO-WL32JC2做主机 ( lora ping -m) 1个SX1268模块做从机 ( lora ping -s) 1个NUCLEO-WL32JC2只接收(监听)( lora rx) 1个SX1278模块只接收(监听)( lora rx) 互通性测试(STM32WL <-> SX1268模块,STM32WL、SX1278模块监听) 4 参考 RM0461 STM32WLEx advanced Arm-based 32-bit MCUs with sub-GHz radio solution Rev01.pdf STM32Cube_FW_WL_V0.4.0 基于RT-Thread的LoRa Radio Driver软件包 https://github.com/Forest-Rain/lora-radio-driver

  • 发表了主题帖: 【NUCLEO-WL55JC2测评5】移植RT-Thread到NUCLEO-WL55JC2

    本帖最后由 nich20xx 于 2020-7-9 09:10 编辑 1 前言 RT-Thread是一款功能强大、组件丰富的开源操作系统,结合STM32WL低功耗物联等特性,在STM32WL中运行RTOS有助于加速产品的开发与落地。 本文主要描述如何将RT-Thread移植到NUCLEO-WL55JC2开发板,新建一个基于RT-Thread的NUCLEO-WL55JC2 BSP。 本文主要内容包括: 新增STM32WL BSP 运行控制台finish 2 STM32 系列 BSP 流程 RT-Thread官方提供了非常详细的《STM32 系列 BSP 制作教程》 https://github.com/RT-Thread/rt-thread/blob/master/bsp/stm32/docs/STM32系列BSP制作教程.md STM32 BSP 框架结构如下图所示: 每一个 STM32 系列的 BSP 由三部分组成,分别是通用库、BSP 模板和特定开发板 BSP。 STM32WL BSP主要组成部分 项目 文件夹 说明 通用库 stm32/libraries 用于存放 HAL 库(STM32WLxx_HAL) 基于 HAL 库的多系列通用外设驱动文件(HAL_Drivers) STM32WL系列 BSP 工程模板 stm32/libraries/templates/stm32wlxx 当前RT-thread暂未支持STM32WL   特定开发板 BSP stm32/nucleo-wl55jc2 主芯片 STM32WL55JC 3 STM32WL BSP制作 由于当前RT-Thread暂未支持STM32WL,因此跟《STM32 系列 BSP 制作教程》中方式略微有些不同。当前STM32WL BSP 的制作过程主要如下步骤: 在stm32/libraries增加STM32WL支持 新增 STM32WLxx_HAL 更新HAL_Drivers STM32WL跟STM32L4比较接近,因此这部分可参考STM32L4 新建NUCLEO-WL55JC2 BSP 修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本) 配置工程 当前 SetupSTM32CubeMX-6.99.1-D37 暂不支持C代码导出,当前需要手动修改 3.1 在stm32/libraries增加STM32WL支持 3.1.1 新增 STM32WLxx_HAL 在bsp\stm32\libraries 增加STM32WLxx_HAL及其相关驱动文件 在rt-thread/bsp/stm32/libraries 新建 STM32WLxx_HAL 拷贝下面2个文件到STM32WLxx_HAL STM32Cube_FW_WL_V0.4.0\Drivers\STM32WLxx_HAL_Driver STM32Cube_FW_WL_V0.4.0\Drivers\CMSIS 在STM32WLxx_HAL文件夹中增加SConsript文件 在bsp\stm32\libraries中的Kconfig增加 SOC_SERIES_STM32WL 3.1.2 更新HAL_Drivers 在bsp\stm32\libraries\HAL_Drivers的Kconfig增加 SOC_SERIES_STM32WL 在bsp\stm32\libraries\HAL_Drivers的drv_config.h增加STM32WL支持 在bsp\stm32\libraries\HAL_Drivers\config 增加wl文件夹(直接复制STM32L4中的文件,然后在进行相应修改) 在drv_xx.c、.drv_xx.h中,在所有出现 SOC_SERIES_STM32L4 的地方,同时增加 SOC_SERIES_STM32WL 的条件判断 例如  3.2 新建NUCLEO-WL55JC2 BSP 在rt-thread\bsp\stm32\路径下,新建stm32wl55-st-nucleo (拷贝 stm32l476-st-nucleo) 3.2.1 修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本) 修改bsp\stm32\stm32wl55-st-nucleo\board\Kconfig,定义芯片型号SOC_STM32WL55JC,芯片系列为SOC_SERIES_STM32WL 修改 bsp\stm32\stm32wl55-st-nucleo\board\SConstruct,这步很关键,决定工程实际导入的stm32 HAL库 修改bsp\stm32\stm32wl55-st-nucleo\board\SConscript,SConscript 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件,SConscript脚本需要修改芯片型号以及芯片启动文件的地址,如下所示 修改bsp\stm32\stm32wl55-st-nucleo的template.uvprojx文件。template 文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式等.
    注:首次需要安装STM32WLxx_DFP
    修改bsp\stm32\stm32wl55-st-nucleo\board\linker_scripts链接脚本文件,MDK 使用的链接脚本 link.sct如下所示 3.2.2 配置工程 3.2.2.1 修改board.h FLASH与SRAM大小 修改bsp\stm32\stm32wl55-st-nucleo\board\board.h文件,Flash与SRAM大小 3.2.2.2 修改SystemClock_Config 在 board.c 文件中存放了函数 SystemClock_Config(),这部分可以先参考TM32Cube_FW_WL_V0.4.0\Projects\NUCLEO-WL55JC\Applications来进一步修改 3.2.2.3 修改CubeMX_Config 由于当前CubeMX暂不完全支持STM32WL,因此当前CubeMX_Config中的部分文件需要手动修改 stm32wlxx_hal_msp.c增加LPUART1初始化 /** * @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->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 ------> LPUART1_RX PA2 ------> 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, &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->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 ------> LPUART1_RX PA1 ------> LPUART1_TX */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); /* USER CODE BEGIN LPUART1_MspDeInit 1 */ /* USER CODE END LPUART1_MspDeInit 1 */ } }   ENV--> menuconfig中,配置Console/Finish使用LPUART1(NUCLEO-WL55JC2默认使用LPUART1连接到ST-LINKV3虚拟串口) 完成上述操作后,通过Scons工具,生成MDK工程, 3.3 测试验证 通过Micro USB连接NUCLO-WL55JC到PC,通过板载STLINKV3E下载代码到NUCLEO-WL55JC,然后通过串口来验证Finish是否OK。 4 参考 RT-Thread官方 STM32 系列 BSP 制作教程 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 STM32Cube_FW_WL_V0.4.0

  • 2020-07-08
  • 加入了学习《基于SensorTile的宝宝哭泣检测系统》,观看 宝宝哭泣检测系统

  • 2020-07-07
  • 加入了学习《儿童玩具“黑匣子”-- BabyCareAssistant 演示视频》,观看 儿童玩具“黑匣子”-- BabyCareAssistant 演示视频

  • 2020-07-06
  • 发表了主题帖: ST SensorTile.box传感器套件入门(5) 蓝牙连接

    1 前言 SensorTile.box内置一个ST BLE模块SPBTLE-1S来提供蓝牙连接功能。 SPBTLE-1S蓝牙模块采用的是ST BlueNRG-1芯片,实现了完整的BLE物理层(PHY)、数据链路层和网络/应用处理引擎,其中网络处理器基于低功耗ARM Cortex-M0内核,配备160KB闪存、有数据保留功能的24KB RAM和安全协处理器。 SPBTLE-1S主要功能特点: 支持Bluetooth v4.2 支持主机模式与从机模式 同时主持多从机 射频 最大输出功率+4dBm 2.4G板载陶瓷天线 工作电压 1.7-3.6V 工作温度  -40 °C to 85 °C 认证 SRRC认证 BQE审批 FCC,IC认证 CE-RED认证 2 SPBTLE-1S系统硬件框图 SPBTLE-1S系统框图 基于低功耗ARM Cortex-M0内核 160KB闪存 24KB RAM 封装大小 11.5×13.5mm 对外接口 UART(1个) IIC(2个) SPI(1个) 单线SBW调试接口 (1个) GPIO(14个) 2.1 SPBTLE-1S模块引脚定义   2.2 SensorTile.box的SPBTLE-1S BLE模块电路 Sensortile.box的SPBTLE-1S硬件连接 3 SPBTLE-1S软件架构 蓝牙核心规范将蓝牙协议栈分成Host和Controller两部分. SPBTLE-1S蓝牙模块支持两种软件架构 Host-less mode (application processor)与Hosted mode (network processor),分别对应蓝牙规范的两种典型架构:单芯片架构与Host+Controller双芯片标准架构。 Host-less mode (application processor) 《==》 单芯片架构 用户应用程序直接运行在SPBTLE-1S内部 host和controller之间直接通过API来交互 Hosted mode (network processor) 《==》Host+Controller双芯片标准架构 作为网络处理器模块,用户MCU通过SPI或者UART来操作SPBTLE-1S模块。 Host跑在AP上,Controller跑在蓝牙模块上,两者之间通过主机控制接口协议(HCI)进行通信   3.1 SensorTile.box BLE软件功能实现 SensorTile.box中采用的是SPBTLE-1S蓝牙模块的Hosted mode (network processor) ,Host运行在STM32L4R9+ MCU上面,通过HCI接口(基于SPI)来实现BLE功能。 STM32 BlueNRG HCI Transport Layer interface 3.1.1 HCI接口初始化 hci_tl_interface.c /** * @brief Initializes the peripherals communication with the BlueNRG * Expansion Board (via SPI, I2C, USART, ...) * * @param void* Pointer to configuration struct * @retval int32_t Status */ int32_t HCI_TL_SPI_Init(void* pConf) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ HAL_PWREx_EnableVddIO2(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure EXTI Line */ GPIO_InitStruct.Pin = HCI_TL_SPI_EXTI_PIN; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(HCI_TL_SPI_EXTI_PORT, &GPIO_InitStruct); /*Configure CS & RESET Line */ GPIO_InitStruct.Pin = HCI_TL_RST_PIN ; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(HCI_TL_RST_PORT, &GPIO_InitStruct); GPIO_InitStruct.Pin = HCI_TL_SPI_CS_PIN ; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(HCI_TL_SPI_CS_PORT, &GPIO_InitStruct); return BSP_SPI_Init(); } 5 参考 spbtle-1s datasheet DS12065 Very low power application processor module for Bluetooth® Low Energy v4.2 https://www.st.com/resource/en/datasheet/spbtle-1s.pdf

  • 发表了主题帖: ST SensorTile.box传感器套件入门(4) 编程模式体验

    本帖最后由 nich20xx 于 2020-7-8 05:30 编辑 1 前言 SensorTile.box编程模式(Pro Mode),可根据需要在SensorTile.box上编写/调试自己的代码,以满足个性化功能等需求。 2 硬件功能模块 SensorTile.box主控芯片采用STM32L4R9,配备一块500mAh锂电池和一张8GB microSD卡。板子上集成了各种传感器,同时集成一个BLE模块SPBTLE-1S。板载传感器包括: STTS751高准确度温度传感器 LSM6DSOX内置机器学习核心(MLC)的低功耗6轴惯性测量单元(IMU) LIS3DHH和LIS2DW12 3轴加速度计 LIS2MDL磁力计 LPS22HH压力传感器/高度计 MP23ABS1模拟麦克风 HTS221湿度传感器 2.1 主控芯片 STM32L4R9 STM32L4R9属于STM32L4+系列。 相比于STM32L4系列,STM32L4+系列提供更优越的性能(最高频率可达120 MHz)、更大容量嵌入式存储(最高达2 MB Flash存储器和640 KB SRAM)、以及更丰富的图形处理能力和连接特性,同时保持一流的超低功耗能力。新的STM32L4+系列还内置了高级图形处理功能,用以实现精彩美妙的用户图形界面。 STM32L4+功能框图   2.1.1 编程与调试方式 SensorTile.box提供两种编程/调试的方法: JTAG直接烧写 通过板上的JTAG接口连接ST-Link V2或是ST-LINK V3编程器、Jlink等 DFU固件更新(Device Fireware Update) 通过Micro USB连接PC使用STM32的DFU功能 2.2.1 JTAG直接烧写 通过板上的JTAG接口连接ST-Link V2或是ST-LINK V3编程器、Jlink等 使用IAR、MDK、ST-LINK Utility等工具直接烧写固件 SensorTile.box JTAG接口 2.2.1 DFU固件更新 SensorTile.box Micro USB接口 使用手机ST BLE Sensor app控制SensorTile.box进入DFU模式(开发者模式) 通过手机ST BLE Sensor app查找并连接SensorTile.box,在右上角选择“打开调试窗口” 进入调试控制台后,输入DFU,控制SensorTile.box进入DFU模式 使用 STM32CubeProgrammer 进行固件更新 打开SensorTile.box外壳,电池线拔掉,长按住BOOT键,然后通过USB数据线插入电脑,出现“STM32 BOOTLOADER”设备 打开STM32CubeProgrammer ,在右侧选择USB,CONNECT,连接成功后,便可以进行bin文件升级 可以先读取备份当前固件,点击“Read”所在的下拉框,选择“Save As.... 执行全片擦除“Full chip erase” 打开bin文件并下载,"+"-->"Open file"-->"Download" 3 SensorTile.box软件支持包 SensorTile.box编程模式提供了FP-SNS-STBOX1软件包,FP-SNS-STBOX1主要提供了如下组件:
    MEMS sensor devices: HTS221, LPS22HH, LIS2MDL, LSM6DSOX, STTS751, LIS3DHH, LIS2DW12 analog microphone BlueNRG-1 Bluetooth Low Energy System On Chip
    FP-SNS-STBOX1当前包含了如下应用示例:
    STM32CubeFunctionPack_STBOX1_V1.3.0\Projects\STM32L4R9ZI-SensorTile.box\Applications
    Applications 固件更新 BLEFOTA BLE固件升级 Secure (PIN) BLE Firmware Over The Air update (Must work with BootLoader example) BLEDualProgram Secure (PIN) BLE Firmware Over The Air update with Dual Boot option for Firmware Rollback BootLoader Boot Loader for enabling the Update of the code. The update could be in Flash or in SD-Card 传感器采集与BLE连接 BLELowPowerRToS 基于FreeRTOS采集传感器数据到ST BLE Sensor app 使能低功耗操作: 微控制器可以设置为睡眠时,没有任务调度执行 BLESensors 前后台方式,采集传感器数据到ST BLE Sensor app 机器学习 BLEMLC 机器学习核心演示(DecTree by Unico GUI) Example on how to program the LSM6DSOX Machine Learning Core (MLC) and Finite State Machine (FSM) 数据存储 SDDataLogRToS 使能max speed: 微控制器可以缓冲从传感器读取的数据,而SD卡上的操作写入仍在进行中 SD-Card data Log with FreeRTOS DataLogExtended 使用USB虚拟串口将传感器数据传送到PC上的Unicleo图形用户界面 4 参考 SensorTileBox_3_编程模式介绍.pdf FP-SNS-STBOX1 STM32Cube function pack for the Pro Mode of the SensorTile.box wireless multi sensor development kit https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-ode-function-pack-sw/fp-sns-stbox1.html

  • 发表了主题帖: 儿童玩具“黑匣子”-- BabyCareAssistant

    本帖最后由 nich20xx 于 2020-7-8 05:13 编辑 一、项目背景 玩具是儿童成长的必备小伙伴,也是当前母婴品类中占据非常大比例的一类产品。电子益智类玩具由于其丰富的交互元素,又是儿童玩具中非常好玩、对小朋友极具吸引力的一类。借助小巧智能的SensorTile.box运动与交互属性,可以快速让儿童玩具有百变玩法,新增更多乐趣。 二、作品简介 BabyCareAssistant(宝贝关爱小助手)是一个基于SensorTile.box实现的儿童玩具“黑匣子”,可用于动态显示运动数据、真实环境数据,辅助监测小朋友活动、哭声等等;同时对小朋友来说,BabyCareAssistant本身就相当于一个非常有趣的小玩具,小巧可爱又富有科技感,是小朋友非常棒的一个小科技启蒙玩物。BabyCareAssistant可灵活、携式地安装在小朋友的各种玩具上(扭扭车、滑板车、自行车、玩具枪等等),除了新增玩具的功能属性之外,也可以作为日常看护小朋友室内室外运动的小助手。   BabyCareAssistant1.0主要通过陀螺仪(LSM6DSOX-Gyroscope)进行方向检测,检测到方向变化后,触发三轴加速度传感器(LIS2DW12)工作,并使用模拟麦克风(MP23ABS1)对小朋友哭声进行监测与指示。同时连接到ST Sensor App中,实时显示运动数据与环境数据、哭声、BLE RSSI等。 BabyCareAssistant1.0当前主要基于ST Sensor App的专家模式(Expert mode)实现,专家模式(Expert mode)是一种无需编程的类图形化设计方式。   三、系统框图 BabyCareAssistant1.0基于SensorTile.box实现,BabyCareAssistant1.0主要定义的功能有: 方向检测 通过陀螺仪(LSM6DSOX - Gyroscope)对偏转、倾斜等动作角速度的测量,实现方向检测。 哭声检测 通过模拟麦克风(MP23ABS1)来采集语音信号,来识别儿童的哭声 采集环境数据 通过温度传感器(STTS751)、湿度传感器(HTS221)、压力传感器(LPS22HH)采集当前环境的温湿度、大气压等 采集运动数据 通过低功耗加速度传感器(LIS2DW12)采集三轴加速度数据 查看RSSI 通过BLE信号强度值(RSSI)来做简单的距离范围判断 蓝牙连接ST sensor App 通过BLE与手机app进行数据交互,实时动态展示运行数据与环境数据等 SD卡数据存储或者USB输出 采集运动传感器的数据与环境传感器的数据,并保存到SD中或者通过USB输出到PC端 四、各部分功能说明(图文结合) 4.1 方向检测 传感器选择 "Gyroscope Sensor"( LSM6DSOX ) 低功耗模式“Low power ” 输出数据速率:ODR = 12.5Hz 量程:FS = 2000dps(度/秒) 函数: NORM(范数) 范数(Norm)是一种关于向量的函数,可以用范数来度量一个向量的“长度”,即向量的模长,这模长就是向量的一种范数——L2范数 norm_l2 = sqrt(ax*ax + ay*ay + az*az);      Threshold Comparison( 阈值) 将计算得到的L2范数与阈值判断。 输出 Save as EXP 4.2 哭声检测 传感器选择 "Microphone"( MP23ABS1) 采集模拟语音信号,并输出到STM32L4R9 ADC1 函数:Baby Crying 输出方式 数据流输出到Bluetooth 4.3 环境数据与运动数据检测 运动传感器当前选用"Accesleration sensor(Low power)" ,即低功耗加速度传感器(LIS2DW12) 低功耗模式“Low power mode 1 ” 输出数据速率:ODR = 50Hz 数字低通滤波:LOWPASS FILTER = 3200Hz 数字高通滤波:HIGHPASS FILTER = ODR / 4 Hz 量程:FS = 2g 环境数据当前选用"Temperture sensor","Humidity sensor","Pressure sensor",即温度传感器(STTS751)、湿度传感器(HTS221)、压力传感器(LPS22HH) 输出方式 数据流输出到Bluetooth 选择数据流输出到USB(或者单独选择保存文件到SD卡 ) 4.4 蓝牙连接 SensorTile.box通过板载SPBTLE-1S蓝牙模块( Hosted mode 即network processor ),与进行手机ST Sensor App进行BLE数据交互与展示。 五、作品源码和案例中处理的传感器数据 BabyCareAssistant1.0z通过陀螺仪(LSM6DSOX-Gyroscope)检测到方向变化后,触发低功耗三轴加速度传感器(LIS2DW12)工作,并使用模拟麦克风(MP23ABS1)对小朋友哭声进行采集与指示。 通过BLE连接到ST Sensor App中,可实时查看运动数据与环境数据、哭声指示、BLE RSSI等。 5.1  运动与环境传感器数据
    温度 - 湿度 - 大气压,三轴加速度,RTC时间
    30.799999,67.699997,999.159973,287,-200,778,05/07/2020,09:26:44.630 30.799999,67.699997,999.159973,484,-180,832,05/07/2020,09:26:44.650 30.799999,67.699997,999.159973,403,-80,1031,05/07/2020,09:26:44.671 30.799999,67.699997,999.159973,288,-92,980,05/07/2020,09:26:44.691 30.799999,67.699997,999.159973,-275,160,1160,05/07/2020,09:26:44.791 30.799999,67.699997,999.159973,-280,42,1018,05/07/2020,09:26:44.811 30.799999,67.699997,999.159973,-398,88,1089,05/07/2020,09:26:44.831 30.799999,67.699997,999.159973,-464,34,922,05/07/2020,09:26:44.851 30.799999,67.699997,999.159973,-382,97,892,05/07/2020,09:26:44.872 30.799999,67.699997,999.159973,-550,157,848,05/07/2020,09:26:44.892 30.799999,67.699997,999.159973,-357,95,946,05/07/2020,09:26:44.912 30.799999,67.699997,999.159973,-248,128,954,05/07/2020,09:26:44.932 30.799999,67.699997,999.159973,-413,-1710,-729,05/07/2020,09:26:45.032 30.799999,67.699997,999.159973,80,-43,1191,05/07/2020,09:26:45.052 30.799999,67.699997,999.159973,137,34,1001,05/07/2020,09:26:45.072 30.799999,67.699997,999.159973,142,-77,959,05/07/2020,09:26:45.093 30.799999,67.699997,999.159973,162,-26,937,05/07/2020,09:26:45.113 30.799999,67.699997,999.159973,187,-61,879,05/07/2020,09:26:45.133 30.799999,67.699997,999.159973,180,-57,819,05/07/2020,09:26:45.153 30.799999,67.699997,999.159973,179,26,916,05/07/2020,09:26:45.173 30.799999,67.699997,999.159973,129,-43,1030,05/07/2020,09:26:45.193 30.799999,67.699997,999.159973,85,29,1084,05/07/2020,09:26:45.213 30.799999,67.699997,999.159973,-231,279,1312,05/07/2020,09:26:45.233 30.799999,67.699997,999.159973,-175,88,1044,05/07/2020,09:26:45.253 30.799999,67.699997,999.159973,-201,130,1024,05/07/2020,09:26:45.273 30.799999,67.699997,999.159973,-250,137,998,05/07/2020,09:26:45.293 30.799999,67.699997,999.159973,-181,90,932,05/07/2020,09:26:45.314 30.799999,67.699997,999.159973,-169,168,942,05/07/2020,09:26:45.334 30.799999,67.699997,999.159973,-128,71,978,05/07/2020,09:26:45.354
    5.2  模拟麦克风数据 Log start on 2020/7/5 21:01           Feature Audio Classification           Nodes T-BOX   @322C33           Date HostTimestamp (ms) NodeName NodeTimestamp RawData Audio Class (#) Algorithm (#) 05/07/2020 21:01:42.637 27762 T-BOX   @322C33 50727 FF01 -1 1 05/07/2020 21:02:06.386 51511 T-BOX   @322C33 57508 FF01 -1 1 05/07/2020 21:02:06.386 51511 T-BOX   @322C33 57508 FF01 -1 1 05/07/2020 21:02:53.171 98296 T-BOX   @322C33 63356 FF01 -1 1 05/07/2020 21:02:53.171 98296 T-BOX   @322C33 63356 FF01 -1 1 5.3 电池检测数据 Log start on 2020/7/5 21:01               Feature Battery               Nodes T-BOX   @322C33               Date HostTimestamp (ms) NodeName NodeTimestamp RawData Level (%) Voltage (V) Current (mA) Status 05/07/2020 21:01:52.708 37833 T-BOX   @322C33 55800 EE02930D008003 75 3.475 NaN 3 05/07/2020 21:01:53.184 38309 T-BOX   @322C33 55863 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:01:53.705 38830 T-BOX   @322C33 55925 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:01:54.227 39352 T-BOX   @322C33 55988 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:01:54.702 39827 T-BOX   @322C33 56050 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:01:55.224 40349 T-BOX   @322C33 56113 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:01:55.699 40824 T-BOX   @322C33 56175 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:01:56.220 41345 T-BOX   @322C33 56238 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:01:56.695 41820 T-BOX   @322C33 56300 EE02920D008003 75 3.474 NaN 3 05/07/2020 21:02:05.102 50227 T-BOX   @322C33 57352 EE02920D008003 75 3.474 NaN 3 六、视频演示(视频简介+链接) 移动Sensortile,绿色等闪烁,表示检测到方向变化 查看手机ST BLE Sensor app,环境数据,运动数据,哭声指示等 视频链接:http://training.eeworld.com.cn/video/26406 七、项目总结(项目文字总结+帖子分享链接汇总)  ST SensorTile.box传感器套件入门(1) 系统概述 http://bbs.eeworld.com.cn/thread-1120168-1-1.html ST SensorTile.box传感器套件入门(2) 入门模式体验  http://bbs.eeworld.com.cn/thread-1126625-1-1.html ST SensorTile.box传感器套件入门(3) 专家模式体验 http://bbs.eeworld.com.cn/thread-1130852-1-1.html ST SensorTile.box传感器套件入门(4) 编程模式体验 http://bbs.eeworld.com.cn/thread-1130950-1-1.html ST SensorTile.box传感器套件入门(5) 蓝牙连接 http://bbs.eeworld.com.cn/thread-1130968-1-1.html Sensortile.box非常的强大,不论是硬件设计与ST配套软件工具(ST Sensor App、Unicleo GUI、FP-SNS-STBOX1..)等,BabyCareAssistant1.0借助ST提供的原生工具包,非常方便地实现预定义功能。后续BabyCareAssistant2.0将通过编程模式来实现1.0的所有功能,进一步学习与使用Sensortile.box。 八、感谢 非常感谢ST公司与EEWORLD举办的sensor创新应用大赛,通过这次大赛,进一步感受到SensorTile.box及其ST产品的专业与强大,比如结构化的开发套件设计、规范的文档与代码等等,同时也非常感谢大赛负责人鼓励与定期督促。

  • 2020-07-05
  • 发表了主题帖: ST SensorTile.box传感器套件入门(3) 专家模式体验

    # 1 前言 SensorTile.box专家模式(Expert mode),可在无需编程情况下,直接使用ST BLE Sensor App中提供的多种传感器输入、表达式、函数等组合,设置与定义新的应用程序/算法,一种类似搭乐高积木式的设计方式。 # 2 专家模式功能说明 SensorTile.box专家模式采用的是一个典型的IPO(Input-Process-Output)模型。 1. 打开 ST BLE Sensor App,点击  CREAET A NEW APP -> EXPERT VIEW ->  NEW APP 1. 选择输入(Select Input Source),目前支持13种传感器输入方式与5种表达式输入(IF condition) 1. 选择函数功能(Choose a function),目前支持函数功能有:    - ARMA(自回归取平均,FIR和IIR滤波器)    - 四元数(Quaternions)    - 欧拉角(Euler Angles)    - 硬铁零偏补偿(Hard-Iron compensation)    - 均方根(方差)(RMS)    - 标准差(Std)    - 均值(Avg)    - 范数(norm)    - 最大值(Max)    - 最小值(Min)    - 阈值(大于)(Threshold)    - 逻辑操作(AND、OR、XOR、NOT)等 4. 选择输出方式,支持输出方式有    - 文件保存到SD卡    - 数据流到USB,可通过USB虚拟串口输出到PC    - 数据流到蓝牙,可通过BLE输出到手机App    - 保存为其他应用的输入    - 保存为条件执行的真假表达式,当条件为真时,LED(绿灯)点亮 ST Sensor App专家模式工作流 # 3 应用实例 - 方向变化检测(使用陀螺仪) ## 3.1 方向变化检测原理简述 通过陀螺仪(Gyroscope)检测SensorTile.box的旋转(科里奥利力——旋转物体在有径向运动时所受到的切向力) ## 3.2 体验与测试结果 1. LED闪烁    1. 移动SensorTile.box(不带旋转)或者非常缓慢的旋转设备,LED不会被打开    1. 旋转SensorTile.box,方向改变被检测到,则绿色LED闪烁 2. 事件计数器(Event Counter)通过BLE发送到手机ST Sensor app    1. 事件计数器(Event Counter)用于记录检测到旋转的次数    1. ST Sensor app的Plot界面,点击“开始记录”,事件计数器在Plot界面更新 方向变化检测app定义 旋转检测测试结果 # 4 参考 - SensorTileBox_2_专家模式介绍.pdf

  • 2020-07-04
  • 加入了学习《基于Sensortile.box的童姿提醒器》,观看 作品展示-童姿提醒器

  • 2020-07-03
  • 回复了主题帖: 【NUCLEO-WL55JC2测评2 】NUCLEO-WL55JC2开发板简介

    littleshrimp 发表于 2020-6-24 14:54 参考资料能上传下文件吗?
    官方说内测资料暂勿外传,后续会发布

  • 2020-07-02
  • 回复了主题帖: 【NUCLEO-WL55JC2测评4 】STM32WL sub-GHZ射频(LoRa\FSK..)

    有点奇怪,我本地预览是可以的,稍后我更新下。似乎论坛markdown直接带图片链接也不支持,只能本地先上传好图片这种方式吗?

  • 发表了主题帖: 【NUCLEO-WL55JC2测评4 】STM32WL sub-GHZ射频(LoRa\FSK..)

    本帖最后由 nich20xx 于 2020-7-5 06:31 编辑 # 1 前言 STM32WL的sub-GHZ射频模块可运行在150~960MHz ISM频段,支持LoRa、(G)FSK\(G)MSK的收发功能,支持(D)BPSK的发送功能。 > 注:LoRa版本只在STM32WLE**5**、STM32WL5**5**系列中支持 # 2 STM32WL sub-GHz Radio ## 2.1 STM32WL Radio系统框图 # 3  NUCLEO-WL55JC2 射频前端电路 NUCLEO-WL55JC2 射频硬件电路支持两种功率输出方式(LoRa):TX HP PA ( 高功率输出,最大22dBm)与TX LP PA( 缺省功率输出, 最大15Bm)。    - 使用1个单刀三掷(SP3T)的高频开关(BGS13S4N9)来实现TX HP PA、TX LP PA、RX 三条射频回路的切换。    - 使用2个单刀双掷(SP2T)的高频开关(NX3L1T3157GM)来实现DC供电与LDO供电方式的切换。 ## 3.1 射频发送电路 NUCLEO-WL55JC2 射频发送电路设计的非常灵活,可以用于评估4种功率输出组合,以满足不同IoT需求。    1. Power Management Config.       - 通过LDO与DC-DC的选择,以满足成本与射频整体功耗(发送与接收)的不同需求          - LDO具有更大的功耗,但是具有较低的BOM成本          - DC-DC具有更优的功耗,但是因为额外需要电感等器件,因此具有相对较高些的BOM成本    2. Power Outputs       - 通过TX LP PA与TX HP PA的选择,以满足输出功率(距离)与射频发送功耗的不同需求          - LP PA 最大输出14dBm,在14dBm范围内的应用,具有非常好的发送功耗优势          - LP HA 最大输出22dBm,具有更大的输出功率,更远的距离,但相对发送功耗也会较大 Power Management与Power Output 通过组合Power Management与Power Output,可以形成以下4种射频发送电路方案,用户可根据实际应用场景选择。 # 4 射频测试 ## 4.1 射频测试代码 1. NUCLEO-WL55JC2高频开关控制函数,可以用于控制射频前端回路,具有4种切换状态,关闭(睡眠)、RX、TX LP PA、TX HP PA ``` /**   * @brief  Configure Radio Switch.   * @param  Config: Specifies the Radio RF switch path to be set.   *         This parameter can be one of following parameters:   *           @arg RADIO_SWITCH_OFF   *           @arg RADIO_SWITCH_RX   *           @arg RADIO_SWITCH_RFO_LP   *           @arg RADIO_SWITCH_RFO_HP   * @retval BSP status   */ int32_t BSP_RADIO_ConfigRFSwitch(BSP_RADIO_Switch_TypeDef Config) {   switch (Config)   {     case RADIO_SWITCH_OFF:     {       /* Turn off switch */       HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET);       HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET);       HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET);       break;           }     case RADIO_SWITCH_RX:     {       /*Turns On in Rx Mode the RF Swicth */       HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);       HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET);       HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET);       break;     }     case RADIO_SWITCH_RFO_LP:     {       /*Turns On in Tx Low Power the RF Swicth */       HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);       HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET);       HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET);       break;     }     case RADIO_SWITCH_RFO_HP:     {       /*Turns On in Tx High Power the RF Swicth */       HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);       HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET);       HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET);       break;     }     default:       break;      }     return BSP_ERROR_NONE; } ``` 2. 简化的发射性能测试代码 ``` { // Radio initialization   RadioEvents.TxDone = OnTxDone;   RadioEvents.RxDone = OnRxDone;   RadioEvents.TxTimeout = OnTxTimeout;   RadioEvents.RxTimeout = OnRxTimeout;   RadioEvents.RxError = OnRxError;   Radio.Init(&RadioEvents);   Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,                     LORA_SPREADING_FACTOR, LORA_CODINGRATE,                     LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,                     true, 0, 0, LORA_IQ_INVERSION_ON, TX_TIMEOUT_VALUE);   Radio.SetChannel(RF_FREQUENCY);   Radio.TxCw();   while(1); } ``` ## 4.2 射频性能测试结果 - NUCLEO-WL55JC2 工作频段 433~510MHz - 输出功率理论设置为470.3MHz,14dBm    - 实测值为13.2dBm(未包含线损)    - 二次谐波为-44.3dBm # 5 参考 - RM0461 STM32WLEx advanced Arm-based 32-bit MCUs with sub-GHz radio solution Rev01 - STM32Cube_FW_WL_V0.4.0 - UM2592_Nucleo-73_WL55.pdf

  • 发表了主题帖: 【NUCLEO-WL55JC2测评3 】搭建NUCLEO-WL55JC2 MDK开发与测试环境

    本帖最后由 nich20xx 于 2020-7-3 22:50 编辑 # 1 前言 对NUCLEO-WL55JC2有了一个系统认识后, 开始跑NUCLEO-WL55JC2的示例代码。 由于目前非常好用的STM32CubeMX暂时不能自动生成C代码,因此本文主要描述了如何手动搭建MDK开发与测试环境,有助于理解与掌握基于STM32WL BSP的软件设计。 本文主要包括如下内容: 1. STM32CubeMX简介 2. 手动搭建STM32CubeMX MDK开发环境 3. NUCLEO-WL55JC2的LED点灯与串口打印 ## 1.1 STM32CubeMX简介 STM32CubeMX是ST为STM32系列芯片提供了一个强大的图形配置工具,通过STM32 CubeMX图形化向导,可以非常方便的实现相关系统时钟、外设、功能引脚等配置,然后能够生成C语言代码,并支持多种工具链,比如MDK、IAR For ARM、TrueStudio等。 截止到2020年6月份,当前对外版本CubeMX5.6.1还不支持STM32WL. ST提供了 SetupSTM32CubeMX-6.99.1-D37.exe内部版本,其增加了STM32WL与NUCLEO-WL55JCx支持,但是未提供“GENERATE CODE”,暂不能直接导出C代码与IDE开发环境。 # 2 搭建NUCLEO-WL55JC2 MDK开发环境 1. 安装 STM32WL评测资料包 STM32Cube_FW_WL_V0.4.0_Setup.exe 2. 在STM32Cube_FW_WL_V0.4.0文件夹下包含了NUCLEO-WL55JC2 IAR的示例工程(EWARM),可以直接使用,但未提供MDK实例工程。 3. 接下来基于STM32Cube_FW_WL_V0.4.0,先手动搭建MDK开发环境,然后运行在NUCLEO-WL55JC2开发板,实现LED闪烁与串口打印“Hello World”。 ## 2.2 手动搭建STM32CubeMX MDK开发环境 ### 2.2.1 安装 MDK STM32WL DFP 首先需要在MDK中安装STM32WL DFP  (Device Family Pack) 。 在 MDK --> Pack Installer --> Devices --> 输入stm32wl,点击STM32WL Series 。 或者 [https://www.keil.com/dd2/pack](https://www.keil.com/dd2/pack) 找到 STM32WL,点击下载,然后直接安装 ### 2.2.2 新建MDK工程 1. 新建MDK工程    1. 新建或者复制一个已有的MDK工程    1. 在工程中增加STM32Cube_FW_WL_V0.4.0中的相关源文件 >    - \Drivers\STM32WLxx_HAL_Driver\Src >    - \Drivers\CMSIS\Device\ST\STM32WLxx\Source\Templates\arm\startup_stm32wle5xx.s >    - \Drivers\BSP\STM32WLxx_Nucleo\stm32wlxx_nucleo.c >    - \app\stm32wlxx_it.c >    - \app\system_stm32wlxx.c >    - \app\stm32wlxx_hal_msp.c >    - \app\main.c 2. MDK工程配置    1. "Device" --> "STM32WLE5JCIx"       - (当前STM32WL DFP1.0.0只支持单核系列,NUCLEO-WL55JC2主芯片使用的是STM32WL55JC,目前在使用单核(M4)情况下,不影响使用)    2. 根据实际工程所在路径,在" C/C++ " -> " Include Paths"增加增加头文件路径说明       1. 不勾选"GNU extensions"。 3. 至此,基于MDK的helloworld工程就基本OK. # 3 NUCLEO-WL55JC2运行与调试 helloworld工程当前主要使用了NUCLEO-WL55JC2中LED与ST-LINK串口。 ## 3.1 LED与串口电路 ### 3.1.1 LED NUCLEO-WL55JC2板载三颗3单色LED指示灯。 |  | 引脚 | 功能描述 | | --- | --- | --- | | LED1 | PB15 | Blue,高电平点亮 | | LED2 | PB9 | Green,高电平点亮 | | LED3 | PB11 | Red,高电平点亮 | ### 3.1.2 STLINK-V3E虚拟串口接口 NUCLEO-WL55JC2可通过板载的STLINK-V3E连接到电脑USB接口,并通过虚拟串口功能,可直接与PC端串口调试助手等进行串口通信。 NUCLEO-WL55JC2缺省情况下,采用了LPUART1连接到STLINK-V3E。也可以通过跳冒选择切换到USART1。 | 功能引脚 | MCU引脚 | 功能描述 | | --- | --- | --- | | STLK_VCP_RX | T_VCP_TX PA2 | LPUART1 TXD | | STLK_VCP_TX | T_VCP_RX PA3 | LPUART1 RXD | ## 3.2 实例代码 新建main.c 在 stm32wlxx_nucleo.c 包含了 LED、串口、按键等接口定义,因此在main.c中可以直接调用对应接口即可。 1. 系统主频设置 >    - System Clock source      = HSI >    - SYSCLK(Hz)                    = 480000000 >    - HCLK(Hz)                       = 80000000 2. 同时在 stm32wlxx_nucleo.h使能串口log功能 ``` /* COM usage define */ #define USE_BSP_COM_FEATURE                 1U//0U /* COM log define */ #define USE_COM_LOG                         1U//0U ``` 3. main.c示例代码如下 ``` /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ COM_InitTypeDef uart_com1 = {     .BaudRate = 115200,     .WordLength = COM_WORDLENGTH_8B,     .StopBits = COM_STOPBITS_1,     .Parity = COM_PARITY_NONE,     .HwFlowCtl = COM_HWCONTROL_NONE, }; /* USER CODE END 0 */ int main(void) {     /* USER CODE BEGIN 1 */     /* USER CODE END 1 */     /* MCU Configuration--------------------------------------------------------*/     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */     HAL_Init();     /* USER CODE BEGIN Init */     /* USER CODE END Init */     /* Configure the system clock*/     SystemClock_Config();     /* Initialize all configured peripherals */     BSP_LED_Init(LED_BLUE);     BSP_LED_Init(LED_GREEN);     BSP_LED_Init(LED_RED);     BSP_COM_Init(COM1,&uart_com1);     BSP_COM_SelectLogPort(COM1);         /* USER CODE BEGIN 2 */     /* USER CODE END 2 */     /* Infinite loop */     /* USER CODE BEGIN WHILE */     while (1)     {         printf("Hello World:%d\r\n",HAL_GetTick());                  BSP_LED_On(LED1);         BSP_LED_On(LED2);         BSP_LED_On(LED3);         HAL_Delay(1000);         BSP_LED_Off(LED1);         BSP_LED_Off(LED2);         BSP_LED_Off(LED3);         HAL_Delay(1000);     }     /* USER CODE END WHILE */     /* USER CODE BEGIN 3 */     /* USER CODE END 3 */ } ``` ### 3.2.1 运行效果 通过板载ST-LINK V3E直接下载到NUCLEO-WL55JC2中运行,LED每2秒闪烁一次。 NUCLEO-WL55JC2运行LED与串口输出helloword # 4 参考 - STM32Cube_FW_WL_V0.4.0    - STM32WLxx_Nucleo_BSP_User_Manual.chm    - Projects\NUCLEO-WL55JC\Examples    - Projects\NUCLEO-WL55JC\Applications\LoRaWAN\PingPong    - Drivers\STM32WLxx_HAL_Driver - UM2592_Nucleo-73_WL55.pdf

  • 2020-06-17
  • 发表了主题帖: 【NUCLEO-WL55JC2测评2 】NUCLEO-WL55JC2开发板简介

    1 前言 NUCLEO-WL55JC2是ST公司为STM32WL系列量身打造的开发板(STM32WL Nucleo-73 boards)。可用于评估STM32WL55J的全方面性能。 NUCLEO-WL55JC2评测板由ST公司提供,特别感谢EEWORLD与ST举办的评测活动.   2 NUCLEO-WL55JC2简介 2.1 NUCLEO-WL55JC2产品简介 主控芯片采用STM32WL55JC 双核(dual-core)32位 Arm® Cortex®-M4/M0+ MCUs 封装采用 UFBGA73 集成 RF transceiver 工作频率基本覆盖Sub1GHz全频段 (150 MHz ~ 960 MHz)     LoRa (G)FSK、MSK与BPSK 256-Kbyte Flash memory 与64-Kbyte SRAM 板载3个用户LED 板载3个用户按键与1个复位按键 板载1个32.768 kHz LSE crystal oscillator 板载1个32 MHz HSE 高频晶振 对外硬件接口 USB with Micro-AB MIPI® debug connector Arduino™ Uno V3 扩展接口 ST morpho extension pin headers 可用于访问 STM32WL 所有 I/Os (通过跳冒)灵活可选的电源供电方式与功耗评估 ST-LINK USB VBUS 外部供电(external) 板载STLINK-V3E仿真器,并带有USB复合枚举功能,同时支持 mass storage Virtual COM port debug port 片上射频模块 射频前端匹配电路,同时支持2种功率输出 STM32CubeWL提供全面的软件库与示例代码 支持多种常用IDE工具 IAR™, Keil®, GCC based IDEs NUCLEO-WL55JC2 靓照 2.2 NUCLEO-WL55JC2硬件     NUCLEO-WL55JC2 开发板硬件框图 2.1 NUCLEO-WL55JCX开发板类型 ST公司为STM32WL当前根据RF频率提供了高频(865~928MHz)与低频(433~510 MHz)两种开发板,具体如下 开发板型号 主控芯片 说明 NUCLEO-WL55JC1 STM32WL55JCI6U 高频带版本,865~928MHz NUCLEO-WL55JC2 STM32WL55JCI6U 低频带版本,433~510 MHz NUCLEO-WL55JCX型号定义   3 NUCLEO-WL55JC2软件支持包 STM32CubeWL提供了NUCLEO-WL55JC2的软件支持包。包括STM32WL HAL驱动库、中间件(SubGHz_Ghy LoRa驱动、LoRaWAN协议栈、FreeRTOS等),示例工程(STM32WL各外设使用示例、LoRa\LoRaWAN使用示例等) 4 参考资料 STM32WL Nucleo-73 boards DataBrief.pdf UM2592_Nucleo-73_WL55.pdf STM32CubeWL_DataBrief.pdf STM32CubeWL_UserManual.pdf UM2643: Getting started with STM32CubeWL for STM32WLxx Series.

  • 发表了主题帖: 【NUCLEO-WL55JC2测评1】 STM32WL芯片概述

    本帖最后由 nich20xx 于 2020-6-17 06:36 编辑   1 前言 STM32WL系列是ST面向物联网,尤其可用于LPWAN领域,精心设计的支持Sub-1GHz LoRa等通信的SoC芯片,包含了很多特性功能: MCU IP,STM32WL受益于STM32WB上引入的优化功能,适用于多协议等不同场景  单核 Cortex-M4 双核 Cortex-M4 + Cortex-M0 Transceiver IP Sub-1GHz全球频段 150M~960MHz 同时支持LoRa、(G)FSK、MSK与BPSK射频调制方式 LoRa同时支持2种功率输出方式(内置PA最大15dBm与22dBm) 电源管理 STM32WL通过包括一个开关电源SMPS和一个LDO来优化电源管理,以缩短STM32WL从任何低功耗模式的唤醒时间 安全 内置硬件安全增强外设 AES256\PCROP\TRNG\PKA 存储 Flash \ RAM 最大支持 256KByte Flash与64Kbyte RAM 初步来看,未内置EEPROM 1.1 官方入口 STM32WL Series https://www.st.com/content/st_com/en/products/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus/stm32-wireless-mcus/stm32wl-series.html 2 STM32WL系统概述 2.1 STM32WL硬件资源 STM32WL硬件资源(单核) 功能项   特性参数 说明 MCU内核 Arm Cortex-M4     封装 UFBGA  5x5x0.6 73LP0.3 9*9   主频 48 MHz(Max)   供电电压 1.8~3.6V   工作电流 Stop1\0 ~516uA(range2) Stop1  ~4.3uA w/o RTC Stop2 ~0.92uA w/o RTC Standy 最低 0.03uA    工作温度 -40~85℃   存储资源 (FLASH & RAM) FLASH 64kB\128kB\256kB RAM 20kB\48kB\64kB  定时(外设) 16bit通用定时器 3个(TIM1\TIM16\TIM17) 32bit通用定时器 1个(TIM2) 16bit低功耗定时器 3个(LPTIM1\LPTIM2\LPTIM3) 低功耗RTC   模拟与数字信号处理(外设) 12bit ADC  1个 (12通道) 12bit DAC  1个 比较器(Comparator) 2个   有线连接(外设) IIC  3个 SPI 2个 (1个支持IIS) USART 2个 LPUART 1个   无线连接(外设) 调制方式 2GFSK MSK BPSK (仅发送) LoRa 输出功率 -16dBm~22dBm   安全(外设) AES AES128\AES256 真随机数发生器(TRNG) PCROP, RDP, WRP PKA   GPIO GPIO 43个(High Current)     2.2 STM32WL系统架构     STM32WLE5系统架构(单核系列)       STM32WL5系统架构(双核系列)     在此特别感谢ST与EEWORLD提供的NUCLEO-WL55JC2开发板 3 参考 stm32wl-series  https://www.st.com/content/st_com/en/products/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus/stm32-wireless-mcus/stm32wl-series.html  STM32的无线进击路丨世界上首款LoRa Soc单片机 http://www.stmcu.org.cn/module/forum/thread-624614-1-1.html    

  • 2020-06-09
  • 发表了主题帖: ST SensorTile.box传感器套件入门(2) 入门模式体验

    本帖最后由 nich20xx 于 2020-6-9 07:17 编辑   1 前言 SensorTile.box入门模式(Basic Mode)是用户在不需要任何编程的情况下,即可体验SensorTile.box。SensorTile.box开箱后,可直接连接智能手机,然后通过手机应用程序ST BLE Sensor体验SensorTile.box上的传感器功能。   2 入门模式功能说明 SensorTile.box入门模式预定义应用主要涵盖了如下传感器: 示例应用 传感器 说明 婴儿哭声检测(Baby Crying Detector) 模拟麦克风 MP23ABS1 通过模拟风来录制与提取声音信息 计步器(Pedometer) 低功耗6轴惯性测量单元LSM6DSOX 使用加速度数据记录步数 气压计(Barometer) 温度传感器STTS751 湿度传感器HTS221 压力传感器LPS22HH 同时采集3种环境传感器的数据 振动检测(Vibration Monitor) 低功耗6轴惯性测量单元LSM6DSOX 依赖于高频响加速度计数据的FFT变换 训练 录制典型/正常的数据到SD 比较 当数据为非典型/不正常时点亮LED灯 (这可以作为预警) 指南针与水平仪(Compass And Level) 低功耗6轴惯性测量单元LSM6DSOX LIS2MDL磁力计 对加速度、陀螺仪、磁力计进行融合,计算欧拉角(roll/pitch/yaw)与方位 传感器融合-四元数(Sensor Fusion-Quaternion) 低功耗6轴惯性测量单元LSM6DSOX LIS2MDL磁力计 对加速度、陀螺仪、磁力计进行融合,计算四元数   LIS3DHH和LIS2DW12 3轴加速度计     图2.1 ST BLE Sensor 手机App支持的传感器 3 功能体验   图3.1 ST BLE Sensor预定义应用 打开手机APP软件ST BLE Sensor,开启手机蓝牙功能,通过BLE连接SensorTile.box,在扫描到的蓝牙设备中,选择自己的SensroTile.box(MAC地址) 截止至2020.06,当前手机APP最新版本为4.6.3 与手机连接成功后,如果发生新的数据传输,SensorTile.box的蓝色灯以2s周期开始闪烁 选择预定义应用,点击“PLAY”,提示更新sensortile.box信息   图3.2 更新sensortile.box应用程序 点击“OK”,ST BLE Sensor通过BLE会更新SensorTile.box的应用程序,更新完成后,提示"App loader successfully"   图3.3 sensortile.box应用程序更新完成 然后重新连接SensorTile.box,即可运行选定的应用。如下为 指南针与水平仪 的运行情况:     图3.4 指南针与水平仪 实例 4 参考 SensorTileBox_1_初级入门模式介绍.pdf

  • 2020-06-08
  • 回复了主题帖: 【测评入选名单公布】ST NUCLEO-WL55JC2测评

    已确认个人信息,能按时完成测评

  • 2020-05-31
  • 发表了主题帖: RT-Thread应用实战-TI温湿度HDC1000软件包设计与制作

    本帖最后由 nich20xx 于 2020-5-31 17:16 编辑   1 概述 本文主要讲述了基于RT-Thread Sensor框架实现的温湿度传感器HDC1000软件包,同时详细记录了RT-Thread传感器软件包的制作过程。 本文的主要内容提要: 低功耗温湿度传感器HDC1000的基础知识 HDC1000的工作机制 HDC1000软件包功能设计 HDC1000软件包的功能简介 HDC1000软件包的使用与测试 HDC1000软件包制作与发布 制作软件包索引 软件包本地测试 PR推送 HDC1000软件包的代码仓库: https://github.com/Forest-Rain/hdc1000 2 HDC1000应用原理 2.1 HDC1000传感器工作原理 图2.1 HDC1000功能框图 HDC1000是TI公司开发的一款集成式湿度和温度传感器, 其能够以较低功耗提供出色的测量精度。HDC1000的传感元件位于器件底部,有助于 HDC1000 免受粉尘、灰尘以及其他环境污染物的影响,从而更加稳定可靠。 HDC1000通过IIC接口,作为IIC从设备与Host MCU进行数据交互。 HDC1000内置了加热元件(Heater), 软件可短暂地打开,用于消散设备长期暴露在高湿度环境中产生的冷凝和湿气, 从而增加湿度传感器的可靠性。此外,加热功能也可用于验证集成温度传感器的功能。
    注:推荐使用换代产品HDC2010代替HDC1000。HDC2010具有更好的特性功能,但是两者硬件接口与软件接口都不兼容。
    表2.1 HDC1000主要功能特性 特性参数 说明 工作温度范围 -40°C 至 125°C 温度精度   ±0.2°C 工作相对湿度 (RH)   0% 至 100%   相对湿度精度 ±3%   测量分辨率 温度:11, 14 湿度:8, 11, 14 封装 DSBGA(8凸点)  2.04mm x 1.59mm   休眠电流 200nA 平均电源电流(每秒测量 1 次 ) 仅 RH(11 位) 820nA   RH(11 位)+ 温度(11 位) 1.2µA   电源电压 3V 至 5V 用户接口   IIC 寄存器数量 8个(每个寄存器为16bit) 2.1.1 工作模式 HDC1000有两种工作模式:睡眠模式(Sleep Mode)与测量模式(Measurement Mode)。 睡眠模式 上电后默认处于睡眠模式。Host MCU通过IIC接口发送指令来唤醒传感器,并对传感器进行读写操作。在完成一次有效温度\湿度测量后,HDC1000自动回到睡眠模式。 测试模式 HDC1000测量模式只支持(手动)按需触发(Trigger on Demand)。( HDC2010支持自动定时采样模式) 2.1.2 典型应用场景 IoT低功耗应用,如 智能恒温器  智能家居助理 冷链运输 可穿戴设备 智能冰箱 烟雾和热量探测器 环境标签 ... 2.2 硬件设计 图2.2 HDC1000典型应用电路 HDC1000有2根地址线.因此一条IIC总线上,最多可以挂载4个HDC1000。 器件型号 ADR1 ADR0 地址描述(7-bit address) HDC1000 0 0 100 0000 0 1 100 0001 1 0 100 0010 1 1 100 0011   2.3 软件设计 获取HDC1000的温度与湿度数据主要是MCU通过IIC接口对指定寄存器读写来完成的,具体实现过程主要包括以下内容: IIC通信驱动 使用RT-Thread系统提供的模拟I2C驱动,来访问HDC1000传感器,可查看 env工具 --> menuconfig --> RT-Thread Components --> Device Drivers -->  采样转换完成判断。采样完成可以根据实际情况,有如下两种方式: HDC1000提供了一个DRDY/INT硬件引脚,用于指示温度\湿度采样转换完成,该引脚可以用于唤醒Host MCU。 若实际应用电路未使用该引脚,则可以采用了固定延时的方式来等待传感器转换完成,采样转换时间如下所示: 图2.3 温度与湿度采样转换时间 单次采样(按需触发),这里默认采用序列采样方式(即每次采样,先后执行一次温度与湿度采样) 图2.4 单次采样流程 2.3.1 IIC从机地址 由图2.2电路图(ADR0 = 0、ADR1 = 0)可知,当前HDC1000传感器的IIC从机地址为0x40。
    注:若使用的是STM32硬件IIC驱动,则传入HAL_I2C_Init()的从机地址是0x80(8位地址形式)
    /* according to hdc1000 spec */ // ADR0 = 0,ADR1 = 0 ==> hdc1000 slave address 0x40(7-bit address) #define HDC1000_DEVICE_IIC_BUS_ADDRESS 0x40 2.3.2 IIC时序 HDC1000主要IIC时序包括读写配置寄存器(Configuration Register(0x02))、触发采样(rigger Humidity/Temperature Measurement(0x00\0x01))、读取温度与温度(Read Humidity/Temperature Measurement)。 读取温度与湿度的IIC时序,如下所示: 图2.5 读取温度与湿度的IIC时序(序列采样方式) 读取温湿度值的IIC时序实例,如下所示 图2.6 读取温度与湿度IIC实例(序列采样方式) 特别注意: HDC1000温度与湿度寄存器位为16bit,高位先发(大端模式),因此读回的数值需要转换为小端模式。 对读回的寄存器数据的处理代码如下所示: if (rt_i2c_transfer((struct rt_i2c_bus_device *)dev->bus, msgs, 1) == 1) { res = RT_EOK; *temp_raw = (buffer[0] << 8) | buffer[1]; *humi_raw = (buffer[2] << 8) | buffer[3]; } else { res = -RT_ERROR; } 2.3.3 温湿度值结果转换 图2.7 温湿度结果转换计算式 按照图2.7公式,将获取到的温度\湿度寄存器值转换为实际的温度(℃)与湿度(%RH)。   3 HDC1000软件包功能设计 3.1 HDC1000软件包功能简介 HDC1000软件包支持对温湿度数据的快速采集。 功能项 \ 包含设备 温度计 湿度计 通讯接口     IIC √ √ 工作模式     轮询 √ √ 中断     电源模式     掉电     低功耗 √ √ 测量范围     自检 √ √ 多实例     3.2 HDC1000软件包功能实现 3.2.1 HDC1000软件包的依赖 RT-Thread 4.0.0+ Sensor 组件 IIC 驱动:HDC1000 设备使用 IIC 进行数据通讯,需要RT-Thread系统 IIC 驱动框架支持; 3.2.2 HDC1000软件包的主要实现文件
    注: Sconscript的编写可参照RT-Thread官方的Scons构建工具说明文档:https://www.rt-thread.org/document/site/programming-manual/scons/scons/
    3.3 HDC1000软件包使用 HDC1000软件包的使用可以使用Finsh/Msh命令窗口与应用程序调用两种方式。 3.3.1 Finsh/Msh命令窗口 可通过RT-Thread的CLI工具Finsh/msh 输入以下命令进行HDC1000软件包使用与测试: list_device,查看对应设备是否注册成功   sensor,查看sensor驱动框架当前支持的Finsh/msh命令
    注: rt_kprintf 不支持浮点数与特殊字符℃ 打印
    sensor info,查看sensor驱动框架当前挂载的传感设备的具体信息(测量范围等)。   4.sensor probe XXX,查看当前传感设备是否可用。 XXX参数为注册的 sensor 设备名,即调用rt_hw_hdc1000_init(const char *name, struct rt_sensor_config *cfg)时传入的*name参数 eg: 本例中,调用rt_hw_hdc1000_init("hdc1000", &cfg)注册设备 sensor驱动框架会为传入的 *name 自动添加一个前缀 如加速度计类型的传感器会自动添加 acce_ 的前缀。 由于系统默认的设备名最长为 7 个字符,因此如果传入的名称超过3个字符的话会被裁掉。 图 sensor驱动框架自动添加前缀字符表   通过msh输入sensor probe temp_hdc1000,可看到如下返回内容: sensor read  YYY,读取传感器值。YYY为读取次数. 通过 sensor probe humi_hdc1000切换到湿度传感器设备,然后通过sensor read 5读取。 输入hdc1000_selftest,这是hdc1000软件包提供的一个快速自测试程序。 3.3.2 应用程序调用 在应用程序中,正常注册设备后(rt_hw_hdc1000_init("hdc1000", &cfg)), 通过设备(rt_device)框架提供的API(rt_device_find\rt_device_open\rt_device_read等)来访问传感器设备。 详细可查看 sensor_ti_hdc1000_example.c 示例代码 int rt_hw_hdc1000_port(void) { struct rt_sensor_config cfg; rt_int8_t result; cfg.intf.dev_name = "i2c1"; cfg.intf.user_data = (void *)HDC1000_SLAVE_ADDR_DEFAULT; cfg.irq_pin.pin = RT_PIN_NONE; result = rt_hw_hdc1000_init("hdc1000", &cfg); return result; } INIT_APP_EXPORT(rt_hw_hdc1000_port); void application_get_sensor_val(void) { struct rt_sensor_data sensor_data; rt_size_t res; rt_device_t dev = RT_NULL; dev = rt_device_find("temp_hdc1000"); if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK) { LOG_E("open device failed!"); return; } res = rt_device_read(dev, 0, &sensor_data, 1); if (res != 1) { LOG_E("read data failed!size is %d", res); } else { LOG_I("temp:%3d.%dC, timestamp:%5d", sensor_data.data.temp / 10, sensor_data.data.temp % 10, sensor_data.timestamp); LOG_I("humi:%3d.%dC, timestamp:%5d", sensor_data.data.humi / 10, sensor_data.data.humi % 10, sensor_data.timestamp); } rt_device_close(dev); }  
    注1: 关闭设备接口(rt_device_open)和打开设备接口(rt_device_close)需配对使用,打开一次设备对应要关闭一次设备,这样设备才会被完全关闭,否则设备仍处于未关闭状态。 注2: sensor驱动框架中,fetch_data接口中,温度值与湿度值扩大了10倍,具体可查看Sensor驱动框架的不同传感类型的单位。
    4  RT-Thread HDC1000软件包索引制作与发布 完成HDC1000软件包主体功能后,接下来进行RT-Thread软件包索引的制作与发布。 RT-Thread采用了类似高级语言(比如python)的包管理方式,创新地将软件包引入到开源RTOS,这是一种富有活力的社区管理形式。
    注:软件包的制作可以参考RT-Thread官方文档的《软件包开发指南》https://www.rt-thread.org/document/site/development-guide/package/package/
    基于RT-Thread的HDC1000软件包的制作主要涉及2大环节: HDC1000软件包源码文件 (本文第3章节) HDC1000软件包索引(包信息) 4.1 建立git代码仓库 4.1.1 使用工具 git 分布式版本管理工具 在windows下,Git 工具提供了Git GUI或者Git Bash两种操作方式 git服务器 这里选择目前使用最为广泛的github 4.1.2 创建git本地仓库 创建本地仓库 若使用Git Bash,则打开Git Bash命令行窗口,输入cd /d xxx 切换到指定文件夹(比如3章节的软件包代码文件夹)(/d为windows切换盘符作用),然后执行git init; 若使用Git GUI,则在指定文件夹,鼠标右键->在弹出窗口选择“Git GUI Here”->弹出新窗口 ->"Create New Repository" 配置git仓库的用户信息。
    git config user.name "自己github用户名" git config user.name "自己github注册邮箱"
    配置好后,可通过 git config --list查看是否生效 对于不需要加入版本管理的文件,可设置过滤文件.gitignore。
    build                           # 过滤bulid整个文件夹内容 Debug                         # 过滤Debug整个文件夹内容 documentation/html    # 过滤documentation/html文件夹所有内容 *~                               # 过滤以~结尾的所有文件 *.o                               # 过滤以.o结尾的所有文件 *.uvguix*                      # 过滤包含.uvguix的所有文件
    至此,就可以在本地进行代码文件的版本管理。 4.1.3 创建开发者的git远程仓库 建立软件包的仓库(Repository),开发者自己可在github、gitee等远程仓库平台(git服务器)创建,并上传软件包代码。 如下为在github创建的hdc1000代码仓库 点击“Create repository”,,就可以得到一个远程仓库的地址:git@github.com:Forest-Rain/hdc1000.git。 配置Github中的SSH秘钥 本地生成rsa key 通过Git Bash命令窗口切换到本地项目文件夹,Bash窗口输入 ssh-keygen -t rsa,接下来按照提示进行。 登录github网站的"account settings",依次点击"Setting -> SSH and GPG Keys"->"New SSH key",将本地的rsa key(id_rsa.pub里的字符串)填写进去, 建立git远程仓库与本地仓库的关联。
    git remote add [远程仓库的别名] [远程仓库地址] 注: 设置 origin为[远程仓库地址]的别名,后续可以直接使用origin来访问该远程仓库,[远程仓库的别名]可以任意自定义
    如: 在github网页端上创建好一个hdc1000仓库后,在本地Git Bash输入如下命令
    git remote add origin git@github.com:Forest-Rain/hdc1000.git
          4. 关联建立完成,可通过git remote -v,通过是否建立成功 至此,就可以将本地仓库同步到远程仓库。
    git add .  git commit "V1.0 更新说明信息"
    4.2 创建HDC1000软件包索引 4.2.1 使用工具(RT-Thread Env) RT-Thread 的 Env 工具为我们提供了自动生成软件包索引(文件)的向导功能。 4.2.2 生成软件包索引步骤 在Env输入pkgs --wizard,进入向导功能 按照提示填写软件包的相关信息( Package 名、版本号、类别、作者、licence、Git 仓库等信息) 图4.1 HDC1000软件包索引 执行完第2步,在你打开ConEmu的当前文件路径下,会自动生成一个名为 hdc1000的文件夹,里面包含两个文件: Kconfig package.json 4.3 修改HDC1000软件包索引 对“4.1”中生成的软件包索引文件进一步修改完善。     4.4 本地测试软件包索引 拷贝软件包索引文件hdc1000到env工具包的对应分类目录下,这里是 \packages\peripherals\sensors目录 修改 \packages\peripherals\sensors同级目录中的Kconfig文件,手动添加HDC1000软件包源信息   正确完成上述步骤后,在env -> menucofig -> RT-Thread online packages -> peripheral libraries and drivers -> sensor drivers,可以看到HDC1000软件包 测试软件包下载是否OK 然后测试软件包功能编译是否OK,功能是否OK等   4. 本地测试完成后,通过git push提交或更新软件包源代码到开发者自己的github仓库(如本文的https://github.com/Forest-Rain/packages) 4.5 提交软件包索引 若之前未使用过RT-Thread软件包索引仓库(https://github.com/RT-Thread/packages),先fork该仓库到开发者自己github仓库,然后将新fork的仓库git clone到本地。 添加hdc1000软件包与Kconfig到packages指定的分类目录下,然后git push提交 登录开发者自己fork的packages仓库github网页(如本文https://github.com/Forest-Rain/packages),找到自己提交的 Pull Request 提示,填写必要描述信息,便可提交PR到在RT-Thread官方的软件包索引仓库( https://github.com/RT-Thread/packages)。 等待RT-Thread官方PR审查与合并代码后,其他用户便可通过本地env工具,执行 pkgs --update 拉取新提交的软件包索引,并自动同步env工具menuconfig中显示的内容。 5 参考 TI HDC1000官方资料入口 http://www.ti.com.cn/product/cn/HDC1000 TI HDC2010官方资料入口 http://www.ti.com.cn/product/cn/HDC2010/technicaldocuments 传感器驱动框架介绍 https://www.rt-thread.org/document/site/development-guide/sensor/sensor_driver/ RT-Thread 支持的传感器列表 https://www.rt-thread.org/document/site/programming-manual/device/sensor/sensor_list/ 传感器驱动开发指南 https://www.rt-thread.org/document/site/development-guide/sensor/sensor_driver_development/ 软件包开发指南 https://www.rt-thread.org/document/site/development-guide/package/package/ RT-Thread官方的软件包索引仓库 https://github.com/RT-Thread/packages RT-Thread官方的软件包代码仓库 https://github.com/RT-Thread-packages

  • 发表了主题帖: STM32应用经验 STM32F107与STM32F407硬件兼容设计注意事项

    本帖最后由 nich20xx 于 2020-5-31 05:33 编辑 1 前言 STM32F407xx跟STM32F10XXX全系列维持了一个比较相近的兼容方式,所有的功能引脚是pin-to-pin兼容,但是两个系列有不同的电源模块,因此电源引脚不兼容,需要额外进行这部分引脚的兼容设计。 详细可见STM32F407xx系列数据手册Product Specifications   2 兼容方案   引脚 STM32F107VCT6 STM32F407   19 VSSA VDD 不兼容,需要额外设计 20 VREF- VSS 可兼容 49 VSS_1 VCAP_1 不兼容,需要额外设计 99 VSS_3 VSS 完全兼容 100 VDD_3 VDD 完全兼容   2.1 STM32F107VCT6引脚分布   2.2 STM32F407VCT6引脚分布

  • 2020-05-30
  • 发表了主题帖: 基于MSP430FR6972平台移植TencentOS tiny

    本帖最后由 nich20xx 于 2020-5-31 06:04 编辑 基于MSP430FR6972平台移植TencentOS tiny 1 前言 TencentOS tiny是面向物联网的RTOS,具有小的系统开销;MSP430是面向混合信号处理的16位单片机,具有超低功耗,当两者相遇,会擦出什么样的火花,让我们拭目以待。 1.1 主要内容提要 在移植RTOS时,必须先根据处理器的结构与特点来确定任务栈的堆栈结构等。因此本文先重点介绍了MSP430 CPU架构等基础知识,然后说明如何移植TencentOS tiny到MSP430FR6972芯片平台,并实现第一个串口应用。主要包括如下内容: MSP430基础知识 MSP430芯片简介 MSP430总体架构 MSP430 CPU架构 MSP430(X) CPU汇编指令集 MSP430存储空间 MSP430中断响应 TencentOS tiny移植到MSP430X MCU架构 基于MSP430(X)的port_s汇编文件 TencentOS tiny移植到MSP430X MCU架构 搭建TencentOS tiny与MSP430FR6972的软硬件开发环境 运行第一个串口应用程序
    完整的移植工程文件,可查看 https://github.com/Forest-Rain/TencentOS-tiny
    2 MSP430基础知识 2.1 MSP430芯片简介     MSP430 单片机是美国德州仪器 TI ( Texas Instruments )公司从1996年开始推向世界的一款16位超低功耗混合信号处理器 MSP ( Mixed Signal Processor )。 MSP430 集成了许多的数字、模拟电路,形成了非常丰富的外设功能,MSP430 具有强大的处理能力和运行速度快,功耗超低,应用方便等优点,广泛应用在便携式仪器仪表、监测、医疗器械以及汽车电子等领域。 MSP430最富盛名的标签之一莫过于其优异的超低功耗特性,全球目前拥有最低功耗的微控制器,拥有 5种主低功耗模式——即使处于极低功耗模式的情况下,外设仍可以快速唤醒CPU,这个过程最多只需要6us,同时低功耗应用编程非常的方便与灵活。 目前MSP430产品主要包括F1系列、F2系列、G2系列、I2系列、F4系列、F5系列、F6系列、FR系列、低电压系列与RF Soc CC430F系列等 MSP430FR系列是MSP新一代16位MCU,采用的存储介质是FRAM(铁电存储器),而不是FLASH。FRAM 是全新的非易失性存储器,其完美结合了 SRAM 的速度、灵活性和耐用性与闪存的稳定性和可靠性,具有1015次擦写次数,超短的读写时间,写一个字节只需125ns,写完64KB仅需4ms的时间,总功耗更低。 2.1.1 MSP430FR6972芯片简介
    MSP430FR6972芯片的典型特点: 嵌入式微控制器 高达 16MHz 时钟频率的 16 位 RISC 架构 3.6V 至 1.8V 的宽电源电压范围(最低电源电压受限于 SVS 电平,请参阅 SVS 规格) 经优化的超低功耗模式 工作模式:大约 100µA/MHz 待机(具有低功率低频内部时钟源 (VLO) 的 LPM3):0.4µA(典型值) 实时时钟 (RTC) (LPM3.5):0.35µA(典型值) (1) 关断电流 (LPM4.5):0.04µA(典型值) 超低功耗铁电 RAM (FRAM) 高达 64KB 的非易失性存储器 超低功耗写入 125ns 每个字的快速写入(4ms 内写入 64KB) 统一标准存储器 = 单个空间内的程序、数据和存储 1015 写入周期持久性 抗辐射和非磁性 灵活时钟系统 具有 10 个可选厂家调整频率的定频数控振荡器 (DCO) 低功率低频内部时钟源 (VLO) 32kHz 晶振 (LFXT) 高频晶振 (HFXT) 宽工作电压 1.8~3.6V .... 更多的信息,详见http://www.ti.com.cn/product/cn/MSP430FR6972
      图2.1 MSP430FR6972硬件资源 2.1 MSP430单片机总体架构 MSP430是16位单片机,其总体架构如下图所示。 图2.2 MSP430F697x构架框图 (1)灵活的片上时钟系统  除了片内集成一个晶体振荡器DCO外,还可外接 1~2 个晶体振荡器。不同的内部功能模块可根据需要使用不同的晶体振荡器,在不需要时可以通过设置寄存器将其关闭,以降低功耗。 (2)丰富的外设功能模块 集成了大量的外设功能模块,包括电源管理PMM、多通道ADC、DAC、电压比较器、段式液晶驱动器、串行接口(UART、SPI)、硬件乘法器、看门狗定时器、多个16位定时器(可进行捕获、比较、PWM输出)、DMA、FLASH控制器(In System Programmable)、AES256、CRC16\32、MPU等等 (3)方便的片上调试接口 集成了JTAG 接口,因此在仿真调试程序时,通过一个廉价的 TAG接口转换器就可以完成以往用昂贵的仿真器才能完成的功能,如设置断点、单步执行程序、读写寄存器等 集成了SBW接口,可以使用BSL 方式向CPU内装载程序,方便后续固件升级。         2.1.1 CPU架构 MSP430采用16位CPU架构,提供了16个高度灵活、可完全寻址的单周期操作的CPU寄存器(R0~R15),减少了指令执行时间,寄存器到寄存器操作的执行时间是一个CPU周期。外围模块通过地址总线、数据总线和控制总线与CPU相连。 MSP430 CPU架构使用精简指令集,仅有27条核心指令、24条模拟指令与7种寻址方式。所有的操作,除了程序流程指令,都是通过源操作数的7种寻址模式与目的操作数的4种寻址模式的组合来对寄存器操作。 目前MSP430 CPU架构有两种类型,分别是MSP430 CPU(上一代)与MSP430X CPU(新一代)。 图2.3 MSP430 CPU架构分类 小于 64K 的空间可以用 16 位地址去访问,大于 64K 的范围要用 20 位地址去访问。 大于 64K 的型号使用扩展型 MSP430X CPU,20 位地址线,最大寻址空间 1M。 比如MSP430F5XX 系列及 MSP430F261X 系列、MSP430FR系列等等 MSP430X CPU向后兼容MSP430 CPU,两种CPU的数据总线的宽度都是16位,但是MSP430X CPU的地址总线扩展为20位。同时MSP430X CPU的数据逻辑单元(ALU)也扩展为支持20位计算。MSP430X CPU虽然地址总线扩展,但是其中断向量表里存储的中断服务函数的起始地址还是16位,即中断服务函数依旧还是在地址空间的低64KB的范围。 图2.4 MSP430 CPU与MSP430 CPUX架构框图 MSP430(X) CPU架构共有16个CPU寄存器,其中R0~R3为特殊功能寄存器,R4~R15为通用工作寄存器,如下表所示 表2.1 MSP430(X) CPU架构的16个CPU寄存器 CPU寄存器 功能描述 R0 程序计数器PC,指示要执行的指令的存放地址 R1 堆栈指针,用SP表示 R2 CPU的状态寄存器\常数发生器(SR\CG1 Status) R3 常数发生器(CG2 Status) R4~R15 通用工作寄存器。通用工作寄存器是MSP430内核活动的主要场所,可以执行算术逻辑运算,也可以作为临时的暂存单元,可以字操作,也可以字节操作     MSP430X CPU的寄存器除 SR寄存器(R2)外,其他都是 20-bit。 图2.5 MSP430X CPU寄存器 2.1.2 MSP430存储空间 MSP430存储空间采用RISC架构(冯-诺依曼架构),ROM与RAM在统一地址空间,使用一组数据与地址总线。(比如STM32单片机也是RISC架构) 图2.6 MSP430FR69x2\MSP430FR68x2存储空间 2.1.2.1 MSP430X Data model MSP430存储空间的组织方式分为大模式与小模式: 在小模式时,总的寻址空间为64KBtyte; 在大模式时,总的寻址空间为1MByte. IAR 编译器默认支持的指针变量最大为 0xFFFF,如果超过 0xFFFF,则需要在“Project--Option”内进行设置:
    Project-->Option-->General-->Target-->Data model 选择 Large
    2.1.3 MSP430中断响应 (1)中断响应过程  中断触发时,中断发生对应的标志置1。 如果CPU处于活动状态,则完成当前指令;若CPU处于低功耗状态,则退出低功耗状态; 将指向下一条指令的PC压栈。 将状态寄存器SR压栈。 若有多个中断请求,选择最高优先级的中断进行服务。 单源中断的中断标志位会被自动清零 注意P1,P2属于多源中断,多源中断标志位不会自动清零,需软件清零。 状态寄存器SR被清零,将会终止任何低功耗状态,并且全局中断使能被关闭(SR.GIE)。 注意MSP430响应了中断后会关闭全局中断使能,不会响应任何其他的中断,包括优先级高的中断,即默认状态下没有中断嵌套,若需要中断嵌套,可使用_EINT()打开全局中断. 中断向量被装载到PC,(MSP430X PC入栈,会自动将PC.19:16与SR寄存器组合),然后开始执行中断服务函数 图2.7 MSP430X中断响应,PC入栈 图2.7 MSP430(X)中断处理 (2)中断返回过程 中断服务函数会由RETI这条指令返回,SR被弹出,CPU恢复到中断前的状态,PC也被弹出,继续执行指令。 从堆栈中恢复状态寄存器SR值 从堆栈中恢复PC值 若响应中断前,CPU处于低功耗模式,则仍然恢复低功耗模式; 若响应中断前,CPU不处于低功耗模式,则从此地址继续执行程序。 2.1.4 MSP430X汇编指令 2.1.4.1 寻址方式 MSP430汇编指令包含7种寻址方式,如下图所示: 图2.8 7种寻址方式 这7种寻址方式均可以用于源操作数,而寄存器寻址、索引寻址、符号寻址与绝对寻址只能用于目的操作数。 2.1.4.2 汇编指令集 MSP430汇编指令由操作码与操作数组成。 操作码是一条汇编指令中不可缺省的部分 在汇编语言中用助记符表示,不区分大小写。 .后缀,给出操作数的类型,.B为字节类型,.W为字类型,.a为MSP430X扩展指令(地址字指针)。缺省后缀默认是字类型。 表2.2 MSP430汇编指令的基本构成   汇编指令 说明   操作码 操作数<src,dst>   示例1 ADD.W R5,R6 寄存器方式,R5+R6 --> R6 示例2 PUSH.W R6 SP-2 --> SP,R6 --> @SP 示例3 RETI   中断返回   MSP430汇编指令集共有27条内核指令,如下图所示 图2.9 MSP430 27条核心指令集 MSP430X CPU指令集与上一代 16 位地址总线的 MSP430 CPU指令集在使用中存在一些区别: 当操作数或数据长度超过 16 位时,要使用 MSP430X指令,其它情况下完全与MSP430指令兼容。 扩展指令如 MOVX.(W/B/A),RRAX.(W/B/A),PUSHX,POPX,SWPBX 等 所有的MSP430X汇编程序不能再用BR、CALL 、RET等,要使用扩展指令 BRA,CALLA 、RETA等。 MSP430X CPU指令集与MSP430 CPU指令集完全兼容,同时具有更高的代码密度 MSP430X ISR的消耗由11个周期降至8个
    注:MSP430汇编文件后缀为.s43
    3 MSP430FR6972平台移植TencentOS tiny内核 TencentOS tiny移植到MSP430平台,主要涉及的内容有汇编文件port_s.s43、任务栈初始化等。 3.1 汇编文件port_s.s43 TencentOS tiny移到MSP430FR6972主要涉及的汇编函数,如下表所示: 表3-1 port_s.s43汇编文件 序号 汇编函数 功能描述 1 port_sched_start 启动滴答定时器与RTOS调度 2 port_context_switch 上下文切换 3 port_irq_context_switch 中断上下文切换 4 port_int_disable 关总中断 5 port_int_enable 开总中断 6 port_cpsr_save 保存状态寄存器 7 port_cpsr_restore 恢复状态寄存器 8 port_systick_isr 滴答定时器中断服务 3.1.1 启动滴答定时器与RTOS调度 ;/* ;* Start off the scheduler by initialising the RTOS tick timer, then restoring ;* the context of the first task. ;*/ port_sched_start: /* Interrupts are turned off here, to ensure a tick does not occur before or during the call to port_sched_start(). The stacks of the created tasks contain a status word with interrupts switched on so interrupts will automatically get re-enabled when the first task starts to run. */ dint nop ;/* Setup the hardware to generate the tick. Interrupts are disabled ;when this function is called. */ calla #port_setup_systick ;mov_x &k_next_task,&k_curr_task ;/* Restore the context of the first task that is going to run. */ PORT_RESTORE_CONTEXT 3.1.2 上下文切换 port_context_switch: ;/* The sr needs saving before it is modified. */ push.w sr ;/* Now the SR is stacked interrupts can be disabled. */ dint nop PORT_SAVE_CONTEXT ;k_next_task -> k_curr_task mov_x &k_next_task,&k_curr_task PORT_RESTORE_CONTEXT reti 3.1.3 开启与关闭总中断 port_int_disable: dint nop reta port_int_enable: nop eint reta 3.1.4 保存与恢复状态寄存器 port_cpsr_save: mov.w SR,R12 dint nop reta port_cpsr_restore: nop mov.w R12,SR nop reta 3.1.5 系统滴答定时器中断服务 port_systick_isr: ; /* The sr is not saved in PORT_SAVE_CONTEXT() because port_context_switch() needs ; to save it manually before it gets modified (interrupts get disabled). ; Entering through this interrupt means the SR is already on the stack, but ; this keeps the stack frames identical. */ push.w sr PORT_SAVE_CONTEXT calla #systick_handler cmp.w #0x0,irq_context_switch_flag mov.w #0x0, &irq_context_switch_flag jeq skip_context_switch ;k_next_task -> k_curr_task mov_x &k_next_task,&k_curr_task skip_context_switch: PORT_RESTORE_CONTEXT reti 3.2 任务栈初始化 单核CPU要实现多任务的条件是每个任务互相独立,也就是说每个任务拥有"自己的CPU"、堆栈与数据存储区、程序代码等。 任务(私有)栈作用是保存局部变量、函数参数等,它是一个线性空间,因此通常是申请一个静态数组,然后把栈顶指针SP指向栈的数组的首元素(递增栈)或者最后一个元素(递减栈)。MSP430堆栈指针是向下生长。 当任务被创建后,还没有任务上下文内容,因此需要先初始化每个任务的任务栈,这样才能确保在系统启动的时候,将第一个任务的正确上下文弹入到硬件寄存器里。 __KERNEL__ k_stack_t *cpu_task_stk_init(void *entry, void *arg, void *exit, k_stack_t *stk_base, size_t stk_size) { cpu_data_t *sp; uint16_t *pus_top_of_stack; uint32_t *pul_top_of_stack; #define PORT_BYTE_ALIGNMENT_MASK ( 0x0001 ) /* The stack type changes depending on the data model. */ /* The last byte of task stack */ sp = (cpu_data_t *)&( stk_base[ stk_size - ( uint32_t ) 1 ] ); sp = ( cpu_data_t * ) ( ( ( cpu_data_t ) sp ) & ( ~( ( cpu_data_t ) PORT_BYTE_ALIGNMENT_MASK ) ) ); /* cpu_data_t is either 16 bits or 32 bits depending on the data model. Some stacked items do not change size depending on the data model so have to be explicitly cast to the correct size so this function will work whichever data model is being used. */ if( sizeof( cpu_data_t ) == sizeof( uint16_t ) ) { /* Make room for a 20 bit value stored as a 32 bit value. */ pus_top_of_stack = ( uint16_t * ) sp; pus_top_of_stack--; pul_top_of_stack = ( uint32_t * ) pus_top_of_stack; } else { pul_top_of_stack = ( uint32_t * ) sp; } /* PC - Interrupt return pointer */ *pul_top_of_stack = ( uint32_t ) entry; pus_top_of_stack = ( uint16_t * ) pul_top_of_stack; pus_top_of_stack--; /* R2 - SR.GIE - bit8,golbal interrupt enable */ *pus_top_of_stack = 0x08; /* SR size is 16-bits */ pus_top_of_stack -= ( sizeof( cpu_data_t ) / 2 ); /* From here on the size of stacked items depends on the memory model. */ sp = ( cpu_data_t * ) pus_top_of_stack; #if 0 // enable for debug *sp = ( cpu_data_t ) 0xffff; sp--; *sp = ( cpu_data_t ) 0xeeee; sp--; *sp = ( cpu_data_t ) 0xdddd; sp--; *sp = ( cpu_data_t ) arg; sp--; *sp = ( cpu_data_t ) 0xbbbb; sp--; *sp = ( cpu_data_t ) 0xaaaa; sp--; *sp = ( cpu_data_t ) 0x9999; sp--; *sp = ( cpu_data_t ) 0x8888; sp--; *sp = ( cpu_data_t ) 0x5555; sp--; *sp = ( cpu_data_t ) 0x6666; sp--; *sp = ( cpu_data_t ) 0x5555; sp--; *sp = ( cpu_data_t ) 0x4444; #else sp -= 3; *sp = ( cpu_data_t ) arg; sp -= 8;// R11-R4 #endif return (k_stack_t *)sp; } 一个任务栈的初始化过程,如下图示例: 图3.1 MSP430任务栈初始化(enable for debug) 4 搭建MSP430FR与TencentOS tiny的软硬件开发环境 4.1 软硬件开发环境 软件平台:IAR版本6.50.1及其以上版本(注:低版本可能不支持MSP430FR系列) 硬件平台:MSP430FR6972 EVM 4.2 新建应用工程 在IAR中,新建一个C应用工程。 图4.1 新建C工程
    PS: .eww是工程空间文件后缀 .ewp是工程的后缀名
    选择主芯片型号,本文使用的是MSP430FR6972。
    Options -> General Options -> Target -> Device -> MSP430FRxx Family -> MSP430FR6 -> MSP430FR6972
    图4.2 选择主芯片型号 4.2.1 新建board \ TI_MSP430FR6972_EVM 在board文件夹下,新建以下内容,并加入工程中
    TI_MSP430FR6972_EVM\BSP\Src\main TI_MSP430FR6972_EVM\IAR\hello_world\TencentOS-tiny.eww TI_MSP430FR6972_EVM\IAR\hello_world\TencentOS-tiny.ewp TI_MSP430FR6972_EVM\TOS_CONFIG\tos_config.h
    4.2.2 新建platform \ MSP430FR5xx_6xx驱动库 在platform文件夹下,添加以下内容,并加入工程
    \platform\vendor_bsp\TI\MSP430FR5xx_6xx
    注:MSP430FR5xx_6xx来自TI的 MSP430Ware\MSP430 Driver Library 4.2.3 添加TOS内核文件 4.2.3.1 添加TOS kernel 添加 tos/kernel 文件内容到工程中,如下图所示 图4.3 TOS内核文件 4.2.3.2 新建arch \ msp430 在arch文件夹下, 新建以下内容,并加入工程中
    arch/msp430/MSP430X/icc430/port_c.c arch/msp430/MSP430X/icc430/port_s.s43 arch/msp430/MSP430X/icc430/data_model.h arch/msp430/MSP430X/icc430/port.h arch/msp430/MSP430X/icc430/port_config.h arch/msp430/common/tos_cpu.c arch/msp430/common/include/tos_cpu.h arch/msp430/common/include/tos_cpu_def.h arch/msp430/common/include/tos_cpu_types.h arch/msp430/common/include/tos_fault.h
    4.2.4 添加必要头文件路径 在IAR工程的Options -> C/C++ Complier -> Preprocessor,添加系统所需头文件的所在路径:
    $PROJ_DIR$\..\..\..\..\platform\vendor_bsp\TI\MSP430FR5xx_6xx $PROJ_DIR$\..\..\..\..\kernel\core\include $PROJ_DIR$\..\..\..\..\kernel\pm\include $PROJ_DIR$\..\..\..\..\arch\msp430\common\include $PROJ_DIR$\..\..\..\..\arch\msp430\msp430x\icc430 $PROJ_DIR$\..\..\TOS_CONFIG
    4.2.5 其他重要特性 4.2.5.1 MSP430FR __persistent 对于MSP430FR系列,基于FRAM的优秀特性,在系统SRAM不够的情况,可以直接扩展FRAM作为RAM使用。 在IAR中,使用__persistent 可以将变量\数组等强制放在FRAM的地址上去,这样可以达到扩展RAM的目的。注意使用__persistent修饰的变量将具有非易失性的特性。 另外也可以通过修改.xls来实现系统RAM的扩展,使用非常方便与灵活。 4.2.5.2 Data Model 根据实际使用芯片来选择,比如MSP430FR6972空间为64K,因此可以选择Small,也可以选择Large。 可在Options -> General Options ->Target -> Data Model选择。 图4.4 Data Model 4.2.5.3 查找最高优先级任务 由于MSP430是16位数据总线,因此对于32位变量,需要执行强制类型转换,否则由于高16位没有正确加载到CPU寄存器中,导致数据出错。 图4.5  32位变量强制类型转换 4.2.5.4 增加icc430编译器支持 在tos_compiler.h增加编译器__ICC430__支持 图4.6 新增ICC430编译 4.2.5.5 Warning[Pe301]  Warning[Ta027] IAR编译中,会出现如下警告,当前通过如下方式消除 Warning[Pe301]: typedef name has already been declared (with same type) Warning[Ta027]: Converting a code pointer to a smaller pointer type resulted in truncation 图4.7 消除编译警告 4.3 第一个串口应用 完成上述过程后,基本实现了TencentOS tiny与MSP430FR6972软硬件环境的搭建,接下来创建一个串口应用示例。 该串口应用示例中,创建了2个任务,并周期性反转LED,输出串行信息。task1每2S运行一次,task2每1s运行一次。 /**************************************************************************************** TencentOS tiny Blink the LED Demo - Software Toggle P1.0 and P9.7 Description; Toggle P1.0 and P9.7 inside of a software loop. ACLK = 32768Hz, MCLK = SMCLK = default DCO = 8MHz MSP430FR6972 ----------------- /|\| XIN|- | | | 32768 --|RST XOUT|- | | | P1.0|-->LED1 | P9.7|-->LED2 | | | P3.4(TXD)|--> PC | P3.5(RXD)|<-- Built with IAR6.50.1 *****************************************************************************************/ #include <msp430.h> #include <driverlib.h> #include <stdint.h> #include "tos.h" #define TASK1_STK_SIZE 320 // more than 300 for stb printf #define TASK2_STK_SIZE 320 // more than 300 for stb printf #define TASK1_PRIO 3 #define TASK2_PRIO 3 k_task_t task1; k_task_t task2; __persistent k_stack_t task1_stack[TASK1_STK_SIZE]; __persistent k_stack_t task2_stack[TASK2_STK_SIZE]; /** * @brief task1_entry * @details task1 process * @param void *arg * @return None */ void task1_entry(void *arg) { int count = 1; while (1) { printf("###This is task1, %d\r\n", count++); GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0); tos_task_delay(tos_millisec2tick(2000)); } } /** * @brief task2_entry * @details task2 process * @param void *arg * @return None */ void task2_entry(void *arg) { int count = 1; while (1) { printf("***This is task2, %d\r\n", count++); GPIO_toggleOutputOnPin(GPIO_PORT_P9,GPIO_PIN7); tos_task_delay(tos_millisec2tick(1000)); } } int main(void) { k_err_t err; board_init(); printf("Welcome to TencentOS tiny\r\n"); tos_knl_init(); err = tos_task_create(&task1, "task1", task1_entry, K_NULL, TASK1_PRIO, task1_stack, sizeof(task1_stack),0); err = tos_task_create(&task2, "task2", task2_entry, K_NULL, TASK2_PRIO, task2_stack, sizeof(task2_stack),0); if( err == K_ERR_NONE ) { err = tos_knl_start(); } else { printf("TencentOS tiny fail to creat tasks \r\n"); while(1); } } 实际运行日志如下图所示: 图4.8 串口示例运行日志 5 参考 TI MSP430FR6972官方资料 http://www.ti.com.cn/product/cn/MSP430FR6972 MSP430的库文件 MSP430Ware for MSP Microcontrollers http://www.ti.com/tool/MSPWARE MSP430X:扩展存储器无止境.pdf https://wenku.baidu.com/view/91fa12ed19e8b8f67c1cb986.html MSP430汇编指令集 https://wenku.baidu.com/view/dcc805450912a21615792922.html FreeRTOSv10.2.1\FreeRTOS\Demo\MSP430X_MSP430FR5969_LaunchPad_IAR_CCS https://www.freertos.org/ TencentOS tiny 内核移植参考指南(IAR版) https://github.com/Tencent/TencentOS-tiny/blob/master/doc/TencentOS%20tiny%20porting%20guide%20iar.md

最近访客

< 1/2 >

统计信息

已有510人来访过

  • 芯币:72
  • 好友:--
  • 主题:19
  • 回复:23
  • 课时:1
  • 资源:2

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言