__lwl

  • 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模块,把采集到的数据上传到控制中心,方便数据集中管理,分析。  

最近访客

< 1/1 >

统计信息

已有11人来访过

  • 芯积分:91
  • 好友:--
  • 主题:4
  • 回复:3

留言

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


现在还没有留言