- 2024-03-24
-
发表了主题帖:
【EFM32 Zero Gecko Starter Kit】-4-ADC采集温度信息
本帖来记录一下ADC模块的使用。目的是读取一个模拟温度传感器,这个传感器的接口直接通过ADC读取接口。
温度传感器型号是Adafruit TMP235:
温度计算范围:
Temp °C = 100*(reading in V) - 50
计划选用PD6,目前暂未被使用。
从数据手册来看:
、
还在在Simplicity Studio里面,找到SoftwareComponent的ADC组件,点击Install。
在main里面编写核心代码:
#define adcFreq 13000000
volatile uint32_t sample;
volatile uint32_t millivolts;
volatile char Temperature[20];
/**************************************************************************//**
* @brief Initialize ADC function
*****************************************************************************/
void initADC (void)
{
// Enable ADC0 clock
CMU_ClockEnable(cmuClock_ADC0, true);
// Declare init structs
ADC_Init_TypeDef init = ADC_INIT_DEFAULT;
ADC_InitSingle_TypeDef initSingle = ADC_INITSINGLE_DEFAULT;
// Modify init structs and initialize
init.prescale = ADC_PrescaleCalc(adcFreq, 0); // Init to max ADC clock for Series 0
init.timebase = ADC_TimebaseCalc(0);
initSingle.diff = false; // single ended
initSingle.reference = adcRef2V5; // internal 2.5V reference
initSingle.resolution = adcRes12Bit; // 12-bit resolution
// Select ADC input. See README for corresponding EXP header pin.
initSingle.input = adcSingleInputCh6;
ADC_Init(ADC0, &init);
ADC_InitSingle(ADC0, &initSingle);
// Enable ADC Single Conversion Complete interrupt
ADC_IntEnable(ADC0, ADC_IEN_SINGLE);
// Enable ADC interrupts
NVIC_ClearPendingIRQ(ADC0_IRQn);
NVIC_EnableIRQ(ADC0_IRQn);
}
/**************************************************************************//**
* @brief ADC Handler
*****************************************************************************/
void ADC0_IRQHandler(void)
{
// Clear the interrupt flag
ADC_IntClear(ADC0, ADC_IFC_SINGLE);
// Get ADC result
sample = ADC_DataSingleGet(ADC0);
// Calculate input voltage in mV
millivolts = (sample * 2500) / 4096;
// Start next ADC conversion
ADC_Start(ADC0, adcStartSingle);
}
/**************************************************************************//**
* @brief Main function
*****************************************************************************/
int main(void)
{
CHIP_Init();
initADC();
// Start first conversion
ADC_Start(ADC0, adcStartSingle);
sprintf(Temperature, "%10.3f", (100*Temperature - 50));
GLIB_drawStringOnLine(&glibContext,
Temperature,
currentLine++,
GLIB_ALIGN_LEFT,
5,
5,
true);
DMD_updateDisplay();
// Infinite loop
while(1);
}
需要注意的是采用通道是CH6,因为选择的是PD6.
至此程序编写已经完成,还有一个需要注意的地方:
测试结果:
待完善。
-
发表了主题帖:
【EFM32 Zero Gecko Starter Kit】-3-液晶屏幕驱动
本帖最后由 __lwl 于 2024-3-24 16:00 编辑
开发板带了一个夏普的1.28英寸的LCD-TFT单色屏,分辨率是128*128。由于不需要背光,所以功耗低。
这块开发板有个特别的地方是板子的控制器(Board Controller)跟EF32Zero主控共享一个屏幕,因此通过GPIO PA8可以决定是谁来使用LCD.
板子与屏幕的硬线连接图:
回到Simplicity Studio 里面,切换到PinTool配置工具里面:
保存后,软件会自动生成代码:
#ifndef SL_MEMLCD_CONFIG_H
#define SL_MEMLCD_CONFIG_H
// <<< sl:start pin_tool >>>
// <usart signal=TX,CLK> SL_MEMLCD_SPI
// $[USART_SL_MEMLCD_SPI]
#define SL_MEMLCD_SPI_PERIPHERAL USART1
#define SL_MEMLCD_SPI_PERIPHERAL_NO 1
// USART1 TX on PD7
#define SL_MEMLCD_SPI_TX_PORT gpioPortD
#define SL_MEMLCD_SPI_TX_PIN 7
#define SL_MEMLCD_SPI_ROUTE_LOC 3
// USART1 CLK on PC15
#define SL_MEMLCD_SPI_CLK_PORT gpioPortC
#define SL_MEMLCD_SPI_CLK_PIN 15
// [USART_SL_MEMLCD_SPI]$
// <gpio> SL_MEMLCD_SPI_CS
// $[GPIO_SL_MEMLCD_SPI_CS]
#define SL_MEMLCD_SPI_CS_PORT gpioPortE
#define SL_MEMLCD_SPI_CS_PIN 11
// [GPIO_SL_MEMLCD_SPI_CS]$
// <gpio optional=true> SL_MEMLCD_EXTCOMIN
// $[GPIO_SL_MEMLCD_EXTCOMIN]
#define SL_MEMLCD_EXTCOMIN_PORT gpioPortE
#define SL_MEMLCD_EXTCOMIN_PIN 10
// [GPIO_SL_MEMLCD_EXTCOMIN]$
// <<< sl:end pin_tool >>>
#endif
之后,会在初始化LCD的时候调用 sli_memlcd_spi_init(&spi_handle, device->spi_freq, usartClockMode0)来初始化屏幕:
sl_status_t sl_memlcd_configure(struct sl_memlcd_t *device)
{
CMU_ClockEnable(cmuClock_GPIO, true);
/* Initialize the SPI bus. */
#if defined(SL_MEMLCD_USE_EUSART)
sli_memlcd_spi_init(&spi_handle, device->spi_freq, eusartClockMode0);
#elif defined(SL_MEMLCD_USE_USART)
sli_memlcd_spi_init(&spi_handle, device->spi_freq, usartClockMode0);
#endif
此外,液晶屏幕可以用Silicon Labs官方推荐的GLIB driver for Memory LCD来驱动。安装驱动也非常简单,直观。
之后进入GLIB配置界面:
下面是液晶屏初始化代码:
void memlcd_app_init(void)
{
uint32_t status;
/* Enable the memory lcd */
status = sl_board_enable_display();
EFM_ASSERT(status == SL_STATUS_OK);
/* Initialize the DMD support for memory lcd display */
status = DMD_init(0);
EFM_ASSERT(status == DMD_OK);
/* Initialize the glib context */
status = GLIB_contextInit(&glibContext);
EFM_ASSERT(status == GLIB_OK);
glibContext.backgroundColor = White;
glibContext.foregroundColor = Black;
/* Fill lcd with background color */
GLIB_clear(&glibContext);
/* Use Narrow font */
GLIB_setFont(&glibContext, (GLIB_Font_t *) &GLIB_FontNarrow6x8);
/* Draw text on the memory lcd display*/
GLIB_drawStringOnLine(&glibContext,
"MEMLCD App",
currentLine++,
GLIB_ALIGN_LEFT,
5,
5,
true);
GLIB_drawStringOnLine(&glibContext,
" Press BTN0 to clear",
currentLine++,
GLIB_ALIGN_LEFT,
5,
5,
true);
GLIB_drawStringOnLine(&glibContext,
" Press BTN1 to print",
currentLine++,
GLIB_ALIGN_LEFT,
5,
5,
true);
DMD_updateDisplay();
}
/***************************************************************************//**
* Ticking function.
******************************************************************************/
void memlcd_app_process_action(void)
{
return;
}
总结:
整个配置下来,发现使用Simplicity Studio来配置外设是非常快捷并且高效的一个开发方式。前提是花时间熟悉一下IDE内部的按钮功能。
-
发表了主题帖:
【EFM32 Zero Gecko Starter Kit】-2-搭建开发环境
本帖最后由 __lwl 于 2024-3-24 15:46 编辑
目前SiliconLabs芯片推荐的开发IDE是Simplicity Studio V5,下载安装过程比较漫长。
、
安装好之后板子通过USB-B - USB A连接至电脑后,可以看到IDE正确识别开发板。
接着新建一个空白工程:
Simplicity studio V5提供了“Software Component”的功能,这里面把常见的硬件外设包括片上的或者板级的外设进行了模块化。
比如通过搜索LED,然后右上角点击Install,即可进入LED配置界面,比如分配GPIO引脚等。
接下来熟悉一下按键输入触发中断,首先配置按键输入引脚,以及工作模式:
从原理图可以看出,按键0连接到PC8,按键1连接到PC9。接下来回到Simplicity Studio V5。
点击保存后,自动生成代码:
#include "sl_simple_button.h"
#include "sl_simple_button_btn0_config.h"
#include "sl_simple_button_btn1_config.h"
sl_simple_button_context_t simple_btn0_context = {
.state = 0,
.history = 0,
.port = SL_SIMPLE_BUTTON_BTN0_PORT,
.pin = SL_SIMPLE_BUTTON_BTN0_PIN,
.mode = SL_SIMPLE_BUTTON_BTN0_MODE,
};
const sl_button_t sl_button_btn0 = {
.context = &simple_btn0_context,
.init = sl_simple_button_init,
.get_state = sl_simple_button_get_state,
.poll = sl_simple_button_poll_step,
.enable = sl_simple_button_enable,
.disable = sl_simple_button_disable,
};
sl_simple_button_context_t simple_btn1_context = {
.state = 0,
.history = 0,
.port = SL_SIMPLE_BUTTON_BTN1_PORT,
.pin = SL_SIMPLE_BUTTON_BTN1_PIN,
.mode = SL_SIMPLE_BUTTON_BTN1_MODE,
};
const sl_button_t sl_button_btn1 = {
.context = &simple_btn1_context,
.init = sl_simple_button_init,
.get_state = sl_simple_button_get_state,
.poll = sl_simple_button_poll_step,
.enable = sl_simple_button_enable,
.disable = sl_simple_button_disable,
};
// the table of buttons and button count are generated as a
// convenience for the application
const sl_button_t *sl_simple_button_array[] = {
&sl_button_btn0,
&sl_button_btn1
};
const uint8_t simple_button_count = 2;
void sl_simple_button_init_instances(void)
{
sl_button_init(&sl_button_btn0);
sl_button_init(&sl_button_btn1);
}
void sl_simple_button_poll_instances(void)
{
sl_button_poll_step(&sl_button_btn0);
sl_button_poll_step(&sl_button_btn1);
}
对于按键中断处理与液晶显示:
/***************************************************************************//**
* Callback on button change.
*
* This function overrides a weak implementation defined in the simple_button
* module. It is triggered when the user activates one of the buttons.
*
******************************************************************************/
void sl_button_on_change(const sl_button_t *handle)
{
if (sl_button_get_state(handle) == SL_SIMPLE_BUTTON_PRESSED) {
if (&BUTTON_INSTANCE_0 == handle) {
currentLine = 0;
GLIB_clear(&glibContext);
} else if (&BUTTON_INSTANCE_1 == handle) {
GLIB_drawStringOnLine(&glibContext,
"BtnPressed!",
currentLine++,
GLIB_ALIGN_LEFT,
5,
5,
true);
}
DMD_updateDisplay();
}
}
实物测试:
待完善。
-
发表了主题帖:
【EFM32 Zero Gecko Starter Kit】-1-资料分享
感谢论坛提供的小壁虎开发板体验机会,本次来开个箱,分享一些入门资料。
Silicon Labs 的 EFM32ZG-STK3200开发板的主控芯片是EFM32 Zero Gecko 32 位 Cortex-M0+微控制器,是24MHz Cortex-M0+ 微控制器,带 32KB 闪存、4KB RAM
高级能量监控 V2
实时能量和功率分析
用于 RTC 模式的备份电容器
用于主机/设备/OTG 的USB 接口
低能量传感器接口 (LESENSE) 演示就绪
轻型,LC(电感性)和接触式传感器
SEGGER J-Link 调试器
免费评估编译器版本
受简单 Studio 支持
EFM32 Gecko 微控制器主要被用于针对能量敏感应用,包括智能计量、气体/能量/水测量、远程感应、楼宇自动化、安全系统、便携式健康/健身俱乐部设备和智能附件。
强大的 ARM Cortex-M 32 位处理器内核
节能模式中短的唤醒时间
特别适合与能量采集系统一起使用
供电可以选择板载调试器供电或者3V CR2032电池供电或者外接电源,这可以通过板子左下方的拨动开关来选择。
上电照片:
板载调试器是J-Link,插入电脑后可以看到显示J-Link driver。
打开Segger工具可以看到其型号:
板子的右上角也提供了20-Pin标准ARM JTAG调试接口,这个只有在调试模式为DEBUG IN的时候才能有效。
这个开关需要在Simplicity studio里面打开Simplicity Commander工具进行设置。
相关收集的资料:
- 2024-01-17
-
回复了主题帖:
领取审核名单(第五批): 辞旧,年底清仓,100+板卡来袭,有缘来领
个人信息无误,已知晓需自己支付邮费。目前在外地培训,地址信息已经更新。
能否和“测评入围名单(第一周):年终回炉,FPGA、AI、高性能MCU、书籍等42个测品”的板子一起寄来呢,谢谢管管。
补充内容 (2024-1-21 08:53):
地址已更新,辛苦管管。
- 2024-01-16
-
回复了主题帖:
测评入围名单(最后一批):年终回炉,FPGA、AI、高性能MCU、书籍等42个测品
个人信息无误,确认可以完成评测计划。请管管尽快寄送,谢谢~~~
- 2024-01-09
-
回复了主题帖:
辞旧:年底清仓,100+板卡来袭,有缘来领
我今年刚自学c语言,嵌入式编程还是小菜鸟,工作需要逛逛论坛。
这些板子看着都好难,我觉得申请一下开发板名称:STM32F042Nucleo还是比较适合我的。
板子非常小巧,开发环境和开发资料ST也提供的比较多。
板载资源:
STM32F042K6T6微控制器,基于ARM Cortex-M0处理器,最高支持48MHz主频
支持Arduino nano接口,微控制器所有IO口引脚通过排针引出
ST-LINK/V2-1调试器,支持对外部微控制器调试
3个LED:一个USB通讯LED、一个电源LED、一个用户LED;一个机械按键:复位
USB接口的4个不同功能:虚拟串口、容量存储、调试接口、编程接口
3种不同供电方式:microUSB接口供电、IO引脚用电、通过Arduino nano接口供电
支持Keil、IAR、embed在线IDE的设计工具
我主要的学习目标是:跟着韦东山老师的RTOS视频来手把手一步步的学习怎么调度,怎么上下文切换,因为这个主控是arm的m0,所以跟教学视频也比较多匹配。
接下来我会继续学习外设接口,比如adc,dac,采集电表箱的温湿度;
接着扩展esp8266/esp32模块,把采集到的数据上传到控制中心,方便数据集中管理,分析。