【经验】Silicon Labs EFR32FG14无线SOC芯片使用外设驱动代码实现串口收发数据功能的方法
本文以Simplicity Studio v5软件里面的wmbus_meter例程为例,介绍如何使用“SILICON LABS(芯科科技) EFM32/EFR32芯片外设驱动参考代码”来实现串口收发数据的功能。
1、下载“Silicon Labs(芯科科技) EFM32/EFR32芯片外设驱动参考代码”,本文以中断的方式来实现串口数据收发功能,打开如下路径中的main_s1_pg1_efr.c文件:Silicon Labs(芯科科技) EFM32/EFR32芯片外设驱动参考代码\peripheral_examples-master\series1\usart\async_interrupt\src。由于EFR32FG14无线SOC芯片属于序列1的芯片,所以要使用外设驱动代码中的series1的串口驱动代码。
2、在Simplicity Studio v5软件的工程文件中,右键点击工程名,点击New,再点击Source File,
在New Source File窗口中输入文件名user_usart.c,点击Finish。
以同样的方法点击Header File创建头文件user_usart.h。
3、移植如下代码到user_usart.h文件中,本文将串口缓存区BUFFER_SIZE设为80个字节,可以根据需求修改BUFFER_SIZE的大小。
#ifndef USER_USART_H_
#define USER_USART_H_
#define BUFFER_SIZE 80
extern uint32_t rx_data_ready;
extern char rx_buffer[BUFFER_SIZE];
extern char tx_buffer[BUFFER_SIZE];
void USER_UsartInit(void);
void USER_UsartTest(void);
#endif /* USER_USART_H_ */
4、移植如下代码到user_usart.c文件中。
#include "em_cmu.h"
#include "em_gpio.h"
#include "em_usart.h"
#include "user_usart.h"
uint32_t rx_data_ready = 0;
char rx_buffer[BUFFER_SIZE];
char tx_buffer[BUFFER_SIZE];
/**************************************************************************//**
* @brief USART0 RX interrupt service routine
*****************************************************************************/
void USART0_RX_IRQHandler(void)
{
static uint32_t i = 0;
uint32_t flags;
flags = USART_IntGet(USART0);
USART_IntClear(USART0, flags);
/* Store incoming data into rx_buffer, set rx_data_ready when a full
* line has been received
*/
rx_buffer[i++] = USART_Rx(USART0);;
if (rx_buffer[i - 1] == '\r' || rx_buffer[i - 1] == '\f')
{
rx_data_ready = 1;
rx_buffer[i - 1] = '\0'; // Overwrite CR or LF character
i = 0;
}
if ( i >= BUFFER_SIZE - 2 )
{
rx_data_ready = 1;
rx_buffer[i] = '\0'; // Do not overwrite last character
i = 0;
}
}
/**************************************************************************//**
* @brief USART0 TX interrupt service routine
*****************************************************************************/
void USART0_TX_IRQHandler(void)
{
static uint32_t i = 0;
uint32_t flags;
flags = USART_IntGet(USART0);
USART_IntClear(USART0, flags);
if (flags & USART_IF_TXC)
{
if (i < BUFFER_SIZE && tx_buffer[i] != '\0')
{
USART_Tx(USART0, tx_buffer[i++]);; // Transmit byte
}
else
{
i = 0; // No more data to send
}
}
}
/******************************************************************************
* @brief Usart Init function
*****************************************************************************/
void USER_UsartInit(void)
{
USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;
char welcome_string[] = "Silicon Labs UART Code example!\r\f";
uint32_t i;
// Enable oscillator to GPIO and USART0 modules
CMU_ClockEnable(cmuClock_GPIO, true);
CMU_ClockEnable(cmuClock_USART0, true);
// set pin modes for USART TX and RX pins
GPIO_PinModeSet(gpioPortB, 15, gpioModeInput, 0); //RX: PB15
GPIO_PinModeSet(gpioPortB, 14, gpioModePushPull, 1); //TX: PB14
// Initialize USART asynchronous mode and route pins
USART_InitAsync(USART0, &init);
//PB15->RX: Location 9, PB14->TX: Location 9
USART0->ROUTELOC0 = USART_ROUTELOC0_RXLOC_LOC9 | USART_ROUTELOC0_TXLOC_LOC9;
USART0->ROUTEPEN |= USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN;
//Initializae USART Interrupts
USART_IntEnable(USART0, USART_IEN_RXDATAV);
USART_IntEnable(USART0, USART_IEN_TXC);
//Enabling USART Interrupts
NVIC_EnableIRQ(USART0_RX_IRQn);
NVIC_EnableIRQ(USART0_TX_IRQn);
// Print welcome message
for (i = 0 ; welcome_string[i] != 0; i++)
{
tx_buffer[i] = welcome_string[i];
}
USART_IntSet(USART0, USART_IFS_TXC);
}
/******************************************************************************
* @brief Usart Init function
*****************************************************************************/
void USER_UsartTest(void)
{
uint32_t i;
/* When notified by the RX handler, copy data from the RX buffer to the
* TX buffer, and start the TX handler */
if (rx_data_ready)
{
USART_IntDisable(USART0, USART_IEN_RXDATAV);
USART_IntDisable(USART0, USART_IEN_TXC);
for (i = 0; rx_buffer[i] != 0 && i < BUFFER_SIZE-3; i++)
{
tx_buffer[i] = rx_buffer[i];
}
tx_buffer[i++] = '\r';
tx_buffer[i++] = '\f';
tx_buffer[i] = '\0';
rx_data_ready = 0;
USART_IntEnable(USART0, USART_IEN_RXDATAV);
USART_IntEnable(USART0, USART_IEN_TXC);
USART_IntSet(USART0, USART_IFS_TXC);
}
}
5、根据实际使用的串口引脚修改USER_UsartInit()函数,本文使用了PB15作为串口的RX引脚,PB14作为串口的TX引脚。如果实际应用中使用的串口引脚跟本文不一样,需要修改GPIO_PinModeSet()里面的引脚参数;同时还得修改USART0->ROUTELOC0的LOCATION参数,EFR3FG14的USART0外设可以通过不同引脚来实现,所以需要使用LOCATION来确实由哪个引脚来实现;从EFR32FG14的数据手册可以查询到:PB15作为USART0的RX引脚时LOCATION参数为9,PB14作为USART0的TX引脚时LOCATION参数也是9。如果使用其他引脚,则将RX和TX的LOCATION参数都改为相应的编号。
6、在mian.c文件中包含头文件:#include "user_usart.h"。
7、在mian()函数中增加串口初始化代码“USER_UsartInit(); ”,在while()循环中增加串口测试代码“USER_UsartTest();”。
8、执行以上步骤之后,整个串口驱动代码已经移植完成了,不过有以下三个地方会影响到串口测试,需要注意一下。
第一点就是如果工程使用了休眠功能,则在EFR32FG14休眠的时候会影响到串口数据收发功能。由于wmbus_meter例程默认使能了休眠功能,为了方便测试,本文在wmbus_meter.slcp的SOFTWARE COMPONENTS中,搜索sleep,点击Flex-RAIL Power Manager Sleep,并点击Uninstall,将休眠功能关闭。
第二点需要检查SOFTWARE COMPONENTS中是否已经安装了USART外设,如果没有安装USART外设,编译程序会报没有定义USART_RX和USART_TX错误。
第三点就是如果设计EFR32FG14模块的时候没有使用EFR32FG14芯片内部的DCDC转换器来供电,则需要将SOFTWARE COMPONENTS里面Device Init: DC-DC的Enable DC/DC converter取消勾选,不然EFR32FG14模块可能会出现断电后重新上电就不能正常工作的情况。
9、编译程序并把固件烧录到EFR32FG14模块中,在模块上电时,串口会打印“Silicon Labs UART Code example!”,给EFR32FG14的串口发送“hello”加回车时,EFR32FG14会回复“hello”。至此,EFR32FG14增加串口收发数据功能完成。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由潮汕小菜提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。
相关推荐
【经验】使用Si4463或者Si4438无线收发芯片来解析其他无线设备通信速率的方法
本文使用EFR32FG23无线SoC芯片来模拟老产品,通过按键来触发EFR32FG23芯片发送无线数据包,然后使用Si4438芯片来捉取波形,并介绍使用Si4438无线收发芯片来解析其他无线设备通信速率的方法。
【经验】Simplicity Studio v5软件导出和导入工程文件的方法介绍
在调试Silicon Labs的无线SoC芯片程序的时候,有时需要在Simplicity Studio v5软件导出工程文件或导入工程文件。本文以EFR32FG14无线SoC芯片的simple_trx工程为例,介绍如何导出和导入工程文件的方法。
【经验】Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法
本文主要介绍如何使用Simplicity Studio v5软件创建ZigBee Z3Gateway Host工程的方法,以Silicon Labs的无线SoC芯片EFR32MG21为例。
【视频】SiWx917新一代超低功耗Wi-Fi 6+蓝牙BLE 5.4无线SoC芯片,实现超乎想象性能和体验的双重突破
SILICON LABS - WI-FI 6+蓝牙BLE 5.4无线SOC芯片,WI-FI 6 SOC,SIWG917M110LGT,SIWG917M100MGT,SIWG917M111MGT,SIWG917M141XGT,SIWN917M100LGT,SIWG917M121XGT,SIWG917M111XGT,SIWT917M100XGT,资产追踪,暖通空调,智慧楼宇,宠物追踪器,智慧城市,智能门锁,HVAC,智能家居,运动手表,智慧医院,IPC,运动相机,智能电表,低功耗定位
【经验】使用频谱仪测试无线模块EFR32FG23的发射功率和频偏的方法
本文使用Silicon Labs无线SoC芯片EFR32FG23的BRD4265B无线模块作为测试对象,介绍如何使用Simplicity Studio 5软件配置railtest工程,并使用频谱仪测试EFR32FG23模块的发射功率和频偏的方法。
SiWx917 Wi-Fi 6蓝牙低功耗无线SoC,助力智能手表功耗和安全性能提升
SiWx917是Silicon Labs推出的一款支持Wi-Fi 6、蓝牙LE 5.4 和低功耗特性的无线SoC(系统级芯片),专为物联网(IoT)和可穿戴设备设计。这款芯片不仅拥有强大的计算能力和先进的无线连接功能,还具有低功耗和小尺寸的优势,为智能手表市场带来了全新的技术突破。
【经验】使用Simplicity Commander工具读写EFR32无线SoC芯片EUI和install code方法
本文以Silicon Labs EFR32FG23 Sub-G无线SoC芯片为例,介绍如何读写EFR32无线SoC芯片的EUI和install code的方法。
【经验】基于Silicon Labs无线SoC芯片MG24开发套件的Matter入门指导文章汇总
本文主要介绍基于Silicon Labs MG24开发套件的Matter入门指导文章汇总。
如何用EFR32FG23无线SoC芯片读取平均RSSI?
本文以Silicon Labs的EFR32FG23无线SoC芯片的rail_soc_simple_trx工程为例,介绍EFR32FG23芯片读取某个信道的平均RSSI的方法。
【经验】配置迈斯威志WizPro200EFM烧录器实现脱机烧录无线SoC芯片EFR32MG21固件的方法
Silicon Labs的EFR32MG21无线SoC芯片,主要用于ZigBee和Matter设备。本文主要介绍如何配置迈斯威志WizPro200EFM烧录器,实现脱机烧录EFR32MG21无线SoC芯片固件的方法。
【经验】使用串口来升级EFR32FG23无线SoC芯片固件的方法
本文主要介绍如何使用BootLoader——NCP UART XMODEM工程实现使用串口升级Silicon Labs EFR32FG23无线SoC芯片固件的方法。
EFR32FG23无线SoC芯片读取数据包实时RSSI值的方法
本文以Silicon Labs的EFR32FG23无线SoC芯片的rail_soc_simple_trx工程为例,介绍EFR32FG23芯片读取数据包的实时RSSI值的方法。
EFR32无线通信模块AN002——BootLoader(standalone)
Silicon Labs的EFR32系列无线SoC芯片提供了Gecko Bootloader支持设备更新应用程序,Gecko Bootloader分两种模式,一种模式称为standalone bootloader,另一种模式称为application bootloader。本文指导大家配置Standalone Bootloader工程,并对应用程序更新。
【经验】如何使用RAILTEST程序测试无线SoC芯片EFR32MG的蓝牙性能?
使用过Silicon Labs无线SoC芯片EFR32MG的Zigbee功能的工程师多数已经习惯使用Railtest软件对Zigbee性能做测试,而在Railtest软件下也可以对BLE性能做测试。本文将介绍具体的设置步骤与注意事项。
【经验】无线SoC芯片EFR32MG21程序中MFG_SECURITY_CONFIG参数的设置与功能
在无线SoC芯片EFR32MG21的ZigBee默认Z3Light程序运行时我们可以通过keys print这个CLI命令打印NWK key与TC Link Key等密钥参数,打印的效果如下,那我们是否可以隐藏这些密钥无法打印呢?
电子商城
品牌:SILICON LABS
品类:Flex Gecko Proprietary Protocol SoC
价格:¥23.4136
现货: 598
品牌:SILICON LABS
品类:Wireless Gecko SoC
价格:¥8.1764
现货: 101,004
品牌:SILICON LABS
品类:Mighty Gecko Multi-Protocol Wireless SoC
价格:¥27.0929
现货: 90,767
现货市场
品牌:SILICON LABS
品类:Switch Hall Effect Magnetic Position Sensor
价格:¥2.2924
现货:126,000
服务
朗能泛亚提供是德(Keysight),罗德(R&S)等品牌的测试测量仪器维修服务,包括网络分析仪、无线通讯综测仪、信号发生器、频谱分析仪、信号分析仪、电源等仪器维修,支持一台仪器即可维修。
提交需求>
Ignion可支持多协议、宽频段的物联网天线方案设计,协议:Wi-Fi、Bluetooth、UWB、Lora、Zigbee、2G、3G、4G、5G、CBRS、GNSS、GSM、LTE-M、NB-IoT等,频段范围:400MHz~10600MHz。
最小起订量: 2500 提交需求>
登录 | 立即注册
提交评论