一只香榴莲

  • 2024-02-21
  • 加入了学习《直播回放: FollowMe 4 W5500-EVB-Pico 使用入门》,观看 W5500-EVB-Pico 使用入门

  • 2024-02-02
  • 回复了主题帖: 领取审核名单(第五批): 辞旧,年底清仓,100+板卡来袭,有缘来领

    个人信息无误,已知晓需自己支付邮费

  • 2024-01-25
  • 回复了主题帖: 辞旧:年底清仓,100+板卡来袭,有缘来领

    申请STM32F042 Nucleo-32根据板卡器件紧凑的特点可以制作一个小型多功能桌面时钟

  • 2024-01-19
  • 回复了主题帖: 【入围名单】ST NUCLEO-C031C6

    个人信息无误,确认可以完成评测计划。

  • 2024-01-12
  • 发表了主题帖: 【测评 芯海传感器信号调理CDS8712开发板】启动和编程

      CDS871x内嵌片上FLASH,包括60KB应用程序内存(APROM)和4KB在系统编程 (ISP) 空间(LDROM),可以通过ISP更新。当芯片焊到PCB板子上以后,ISP(In System Programming) 功能使用户能更新应用程序内存。芯片上电以后,CPU从APROM还是LDROM取代码运行,取决于用户配置区Config0中启动选项(CBS)的设置。 FLASH存储器控制器由从机接口,ISP控制逻辑,烧写器接口和FLASH宏接口时序控制逻辑组成。 FLASH存储器控制器框图如下所示(以下是CPU读取指令的地址编码及寻找范围)。 Flash存储器控制器框图   CDS8712为8KB。   CDS871x提供在应用中编程(IAP)功能,运行代码可以在APROM,LDROM和SRAM之间切换而不用复位芯片。用户通过设定CONFIG0中的芯片启动选项 (CBS[1:0]),可以使能IAP功能。 我这里使用的下载方式是厂家提供的MDK下载方式接线采用SWD五线(RESET也可以不连接)接线方式; SWD是ARM公司提出的另一种调试接口,相对于JTAG接口,使用更少的信号和接口,与JTAG的20个引脚相比,SWD只需要4个(或者5个)引脚,较少的引脚与简便的接线使得SWD模式也备受欢迎,并且这几年SWD下载速度也有了显著的提高,在一些较小的PCB上可以使用它,所用面积小,并且较为简便,数据不易丢失 SWD引脚: Vref:目标表参考电压信号,用于检测目标板是否供电,直接与目标板VDD相连,并不向外提供输出电压; GND: 公共地信号; SWDIO:串行数据输入信号,作为仿真信号的双向数据信号线,建议上拉; SWCLK:串行时钟输入,作为仿真信号的时钟信号线,建议下拉; 可选择引脚: SWO:串行数据输出,CPU调试接口可通过SWO输出一些调试信息,可选引脚。 RESET:仿真器输出至目标CPU的系统复位信号;使得仿真器能够在连接器件前对器件进行复位,是可选引脚 这里下载使用了一个ST-LINK V2下载器如下图: 引脚图如下 与开发板预留下载端口依次相连这里复位口(RST)可以不连接也可以下载成功 程序下载首先下载CDS871x的PACK选择芯片为CDS8712首先Use使用ST-Link Debugger 接着点击Settings,进入Cortex-M Target Driver Setup界面,Debug Adapter选择ST-LINK/V2,Target Com选择SW,Clock默认参数就好 进入Flash Download页面可以看到下载位置为APROM Flash(00000000H-0000EFFFH),和CONFIG Flash(00300000H-003001FFH); 接着下载器连接电脑设备管理器出现STM32 STLink证明连接成功 接着点击魔法棒就可以下载了以下为下载成功页面 我在下载后电脑并未和开发板建立串口(com)连接,我总结可能是因为下载器不能正确转接com(因为这个是临时买的说明书没有明确说明这个问题),或者串口程序代码问题,我切换其他例程切换GPIO口高低电平,接上一个蜂鸣器,下载程序后按下复位按钮可以哒哒鸣响说明程序下载正常,针对这个问题我还在排查原因。

  • 2024-01-09
  • 回复了主题帖: 【测评 芯海传感器信号调理CDS8712开发板】开箱、初识开发板

    wangerxian 发表于 2023-12-29 22:28 这个芯片要搭配什么传感器用的? 主要应用于工业过程控制的传感器,主要对传感信号进行补偿校准

  • 2023-12-29
  • 发表了主题帖: 【测评 芯海传感器信号调理CDS8712开发板】开箱、初识开发板

    很高兴论坛可以给我这次机会能有机会对国产信号调节芯片CDS8712进行测评。 我们先来看一下板卡的正反面,板卡设计十分简易只有一个芯片一个复位按键和若干引出排针,工程师还给多增加了四个接地口和四个VDD口也是很贴心了。 拿到板卡后首先让我感到惊喜的是控制芯片的大小CDS8712的封装大小非常小巧,其采用的是QFN24封装(4.0mm*4.0mm*0.75mm),能将这么多的功能集成到这么小的芯片上属实是国产芯片的进步,但是CDS8712所适用信号调理、波形整形、电容测量相关方面的应用这会使得CDS8712工作过程发热较高,根据材料的物理属性发热会影响测量的精准性,不知道工程师对这个问题的解决如何,这里我们看板卡背面在芯片地盘下打了九个过孔在设计时在保证电平稳定精确的同时多开过孔也是有加强散热的作用。 接下来我们看其内核采用的是ARMCortexM0内核,最高24MHz工作频率支持串行调试接口 (SWD)这也使得下载程序时我们不必将芯片取下, 对于电源输出采用VS_CAP输出,支持2.0V、2.2V、2.6V、2.8V多档配置也使得芯片的应用范围变的更广了内部配置温度传感器能让开发使用者实时监测芯片内部温度变化,支持6路外部差分输入通道,或12路外部单端输入通道,可以进行多种补偿校正,存储采用4K字节FLASH,包括60K字节程序空间(APROM),数据FLASH大小可配置(与程序FLASH共享),4K字节启动程序空间(LDROM),16K字节SRAM,最高工作频率24MHz。包含1个I2C模块,1个 UART模块,3个定时器模块,2个看门狗模块等,可以同时处理多输入信号支持以下四种操作模式很好的考虑到了开发者的使用。 还可以配置系统工作条件进入睡眠模式可以很好的进行节能设计。功能已经很强大了,期待对其进一步的探索。

  • 2023-12-08
  • 回复了主题帖: 测评入围名单: 芯海传感器信号调理CDS8712开发板

    个人信息无误,确认可以完成测评计划

  • 2023-11-02
  • 发表了主题帖: 【测评STM32L452Nucleo-64】串口实验

    串口作为 MCU 的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。STM32 的串口资源相当丰富的,功能也相当强劲。 这里要配置串口2,所以首先要使能串口2然后设置相应通信模式。 打开 Pinout&Configuration 选项卡界面,左侧依次进入 Connectivity->USART2 配置栏。USART2配置栏有2个选项。第一个选项 Mode 用来设置串口2的模式或者关闭串口2。 第二个选项 Hardware Flow Control(RS232)用来开启/关闭串口2的硬件流控制,该选项只有在 Mode 选项值为 Asynchronous(异步通信)模式的前提下才有效。这里要开启串口2的异步模式,并且不使用硬件流控制,所以这里直接选择 Mode 值为 Asynchronous 即可。配置好的 USART2界面如下图 : 配置好串口2为异步通信模式后,在硬件上会使用到 PA2 和 PA3 作为串口2的发送接收引脚。在 STM32CubeMX中,当选择好外设的工作模式之后,软件会自动配置 GPIO口的相关模式和参数。   接下来需要配置 USART2外设相关的参数,包括波特率,停止位等。首先,再次进入 Connectivity->USART2 配置栏,进入Configuration选项卡,会发现 USART2 Configuration 界面里有5个配置选项卡。 NVIC 选项卡用来使能 USART2中断。这里勾上 Enabled 选项。 DMA Setting 是在使用 USART2 DMA 的情况才需要配置,这里不配置。 GPIO Setting 是查看和配置 USART2参数之后,如果使用到串口中断,那么还需要设置中断优先级分组。 Parameter Settings 选项卡用来配置 USART2的初始化参数,包括波特率停止位等等。 这里将 USART2配置为:波特率 115200,8 位字节模式,无奇偶校验位,发送/接收均开 启。 User Constats 是用来配置用户常量。 接下来是配置 NVIC 相关参数。左侧依次点击 System Core->NVIC 按钮,然后在弹出的 NVIC Configuration 界面设置中断优先级分组级别。 系统初始化设置为分组 4,那么就是 4 位抢占优先级和 4 位响应优先级。所以这里的参数选择“4 bits for pre-emption priority”,也就是 4 位抢占优先级。 首先,在 usart.h 文件中加入如下定义: #include "stdio.h" #define USART_REC_LEN 200 //定义最大接收字节数 200 #define EN_USART2_RX 1 //使能(1)/禁止(0)串口2接收 extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大 USART_REC_LEN 个字节末字节为换行符 extern u16 USART_RX_STA; //接收状态标记 #define RXBUFFERSIZE 1 //缓存大小 extern u8 aRxBuffer[RXBUFFERSIZE];//HAL 库 USART 接收 Buffer 除此之外,还要在 usart.c 文件中加入部分代码,定义初始化串口句柄的缓存相关参数和回调函数 HAL_UART_RxCpltCallback,代码如下: #if EN_USART2_RX //如果使能了接收 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记 u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART2)//如果是串口2 { if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1)) USART_RX_STA=0;//接收数据错误,重新开始接收 } } } HAL_UART_Receive_IT(&huart2, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 } } #endif 最后在主程序中填写被测代码 int main(void) { u8 len; u16 times=0; HAL_Init(); SystemClock_Config(); delay_init(); MX_GPIO_Init(); MX_USART2_UART_Init(); while (1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("\r\n 您发送的消息为:\r\n"); HAL_UART_Transmit(&huart2,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据 while(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC)!=SET); //等待发送结束 printf("\r\n\r\n");//插入换行 USART_RX_STA=0; }else { times++; if(times%1000==0) { printf("\r\n 串口实验\r\n"); } if(times%200==0)printf("请输入数据,以回车键结束\r\n"); if(times%30==0); delay_ms(10); } } } 果演示如下  

  • 2023-11-01
  • 发表了主题帖: 【测评STM32L452Nucleo-64】制作一个简易的音乐播放器

      在上一篇的测评中成功的驱动了蜂鸣器,在这一篇中我们进一步结合OLED屏幕和蜂鸣器制作一个简易音乐盒子。   当单片机用于演奏歌曲时,只需搞清楚两个概念即可,也就是“音符(音调)”和“节拍”。音调表示一个音符该唱的频率,节拍表示一个音符该唱多长的时间。我们创建两个数组分别控制这两个变量并且交替修改就能得到我们想要的输出音乐效果。   我们可以在网上搜索到音符与频率对照表如下图:     这里我们定义一个UC16的数组用来存放我们的频率信息: // 低7 1 2 3 4 5 6 7 高1 高2 高3 高4 高5 不发音 uc16 tone[] = {247,262,294,330,349,392,440,294,523,587,659,698,784,1000};//音频数据表 另外一个部分就是控制音长的部分,也是我们常说的节拍部分,节拍的修改是通过延长或缩短频率的时间所实现的。 接着我们需要添加一个修改输出频率与就是控制音调的函数: void Sound(u16 frq) { u32 time; if(frq != 1000) { // time = 500000/((u32)frq); time = 100000/((u32)frq); //BEEP (0); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET);//打开蜂鸣器--根据自己的硬件情况调整,通常就是控制蜂鸣器的gpio引脚置1 delay_us(time); //BEEP(1); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET);//关闭蜂鸣器--根据自己的硬件情况调整,通常就是控制蜂鸣器的gpio引脚置0 delay_us(time); }else delay_us(1000); }   我们将想要编写的音乐写到另一个存放音频和节拍信息的函数中通过调用void Sound(u16 frq)函数并进行延时就可以输出音乐了 void play_music(void) { // 低 1 2 3 4 5 6 7 中1 2 3 4 5 6 7 高1 2 3 4 5 6 7 // uc16 tone[] = {262,294,330,349,392,440,494,523,587,659,698,784,880,998,1046,1175,1318,1397,1568,1760,1967};//音频数据表 // // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // // // u8 music[]={9,11,14,12,11,20,//音调 // 9,11,12,14,11,20, // 14,16,15,14,15,14,19,14,18,20, // 9,11,12,11,12,14,8,11,12,20, // 9,7,8,20, // 8,8,9,11,11,14,8,9,11,20}; // u8 time[] ={2,2,2,2,6,4,//时间 // 2,2,2,2,6,4, // 6,2,4,4,2,2,2,2,6,4, // 6,2,4,2,2,4,2,2,6,4, // 2,2,4,6,4, // 4,2,2,4,4,4,2,2,6,4}; // uc16 tone[] = {247,262,294,330,349,392,440,494,523,587,659,698,784,1000};//音频数据表 uc16 tone[] = {262,294,330,349,392,440,494,523,587,659,698,784,880,998,1046,1175,1318,1397,1568,1760,1967}; // u8 music1[]={13,1,2,3,4,5,6,7,8}; u8 time1[] = {4,4,4,4,4,4,4,4,4}; // u8 music[]={13,1,2,3,4,5,6,7,8};//测试基础音 // u8 time[] ={4,4,4,4,4,4,4,4,4}; u32 yanshi; u16 i,e; yanshi = 2;//10; 4; 2 for(i=0;i<sizeof(music1)/sizeof(music1[0]);i++){ for(e=0;e<((u16)time1[i])*tone[music1[i]]/yanshi;e++){ Sound((u32)tone[music1[i]]); } } 在介绍使用蜂鸣器播放音乐的程序时所使用的频率都是理论值,根据不同电路蜂鸣器的差异可以在理论的音频数据上下修改值不断尝试使得输出音乐更好听。 在这里我结合蜂鸣器音乐输出和oled屏幕功能制作了一个简易播放生日歌的程序: [localvideo]2d2a788e28218d911b636685bf281e7e[/localvideo]  

  • 2023-10-30
  • 发表了主题帖: 【测评STM32L452Nucleo-64】低功耗的使用和代码撰写

    Stm32低功耗模式分为四种分别是运行模式、睡眠模式、停止模式、待机模式 其中运行模式就是我们平时正常工作时所使用的模式,就不做过多赘述。 睡眠模式进入方式使内核寄存器SLEEPDEEP=0,调用WFI(中断方式)或者WFE(事件方式)进入睡眠模式,SLEEPONEXIT=0,立即睡眠,SLEEPONEXIT=1,退出时睡眠,唤醒时无延迟,没有关闭外设,唤醒后执行中断模式,RAM并没有断电。   停止模式进入方式是内核寄存器SLEEPDEEP=1,PWR_CR寄存器PDDS=0,调用WFI或者WFE进入停止模式,其中; PWR_CR寄存器LPDS=0,调压器正常 PWR_CR寄存器LPDS=1,低功耗模式 PWR_CR寄存器FPDS=0,Flash正常 PWR_CR寄存器FPDS=0,Flash掉电 睡眠时会关闭内核时钟、关闭外设时钟、但是保留运行数据,再次唤醒时会有延时首先需要唤醒外部时钟,flash恢复时间,唤醒执行完中断函数后会继续进行睡眠模式。   待机模式进入方式是内核寄存器SLEEPDEEP=1,PWR_CR寄存器PDDS=1,PWR_CR寄存器WUF=0,调用WFI或者WFE进入停止模式;使用WKUP上升沿、RTC闹钟、看门狗唤醒, 睡眠是会关闭内核、关闭外设、内存数据丢失,开启时相当于重新开机执行while函数。 在HAL函数库电源函数部分中中对各函数已经进行了定义 其中睡眠模式函数如下: /** * [url=home.php?mod=space&uid=159083]@brief[/url] Enter Sleep or Low-power Sleep mode. * @note In Sleep/Low-power Sleep mode, all I/O pins keep the same state as in Run mode. * @param Regulator: Specifies the regulator state in Sleep/Low-power Sleep mode. * This parameter can be one of the following values: * [url=home.php?mod=space&uid=1238002]@arg[/url] [url=home.php?mod=space&uid=1064992]@ref[/url] PWR_MAINREGULATOR_ON Sleep mode (regulator in main mode) * @arg @ref PWR_LOWPOWERREGULATOR_ON Low-power Sleep mode (regulator in low-power mode) * @note Low-power Sleep mode is entered from Low-power Run mode. Therefore, if not yet * in Low-power Run mode before calling HAL_PWR_EnterSLEEPMode() with Regulator set * to PWR_LOWPOWERREGULATOR_ON, the user can optionally configure the * Flash in power-down monde in setting the SLEEP_PD bit in FLASH_ACR register. * Additionally, the clock frequency must be reduced below 2 MHz. * Setting SLEEP_PD in FLASH_ACR then appropriately reducing the clock frequency must * be done before calling HAL_PWR_EnterSLEEPMode() API. * @note When exiting Low-power Sleep mode, the MCU is in Low-power Run mode. To move in * Run mode, the user must resort to HAL_PWREx_DisableLowPowerRunMode() API. * @param SLEEPEntry: Specifies if Sleep mode is entered with WFI or WFE instruction. * This parameter can be one of the following values: * @arg @ref PWR_SLEEPENTRY_WFI enter Sleep or Low-power Sleep mode with WFI instruction * @arg @ref PWR_SLEEPENTRY_WFE enter Sleep or Low-power Sleep mode with WFE instruction * @note When WFI entry is used, tick interrupt have to be disabled if not desired as * the interrupt wake up source. * @retval None */ void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) { /* Check the parameters */ assert_param(IS_PWR_REGULATOR(Regulator)); assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); /* Set Regulator parameter */ if (Regulator == PWR_MAINREGULATOR_ON) { /* If in low-power run mode at this point, exit it */ if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_REGLPF)) { if (HAL_PWREx_DisableLowPowerRunMode() != HAL_OK) { return ; } } /* Regulator now in main mode. */ } else { /* If in run mode, first move to low-power run mode. The system clock frequency must be below 2 MHz at this point. */ if (HAL_IS_BIT_SET(PWR->SR2, PWR_SR2_REGLPF) == RESET) { HAL_PWREx_EnableLowPowerRunMode(); } } /* Clear SLEEPDEEP bit of Cortex System Control Register */ CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); /* Select SLEEP mode entry -------------------------------------------------*/ if(SLEEPEntry == PWR_SLEEPENTRY_WFI) { /* Request Wait For Interrupt */ __WFI(); } else { /* Request Wait For Event */ __SEV(); __WFE(); __WFE(); } } 函数库对于各变量的定义都有严格的说明 在main函数中调用如下 //睡眠模式 printf("aaaa\r\n");//a可以打印完全 HAL_SuspendTick (); HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);//进入睡眠模式 printf ("aaa\r\n");//b也可以被打印 停止模式定义函数如下: /** * @brief Enter Stop mode * @note This API is named HAL_PWR_EnterSTOPMode to ensure compatibility with legacy code running * on devices where only "Stop mode" is mentioned with main or low power regulator ON. * @note In Stop mode, all I/O pins keep the same state as in Run mode. * @note All clocks in the VCORE domain are stopped; the PLL, the MSI, * the HSI and the HSE oscillators are disabled. Some peripherals with the wakeup capability * (I2Cx, USARTx and LPUART) can switch on the HSI to receive a frame, and switch off the HSI * after receiving the frame if it is not a wakeup frame. In this case, the HSI clock is propagated * only to the peripheral requesting it. * SRAM1, SRAM2 and register contents are preserved. * The BOR is available. * The voltage regulator can be configured either in normal (Stop 0) or low-power mode (Stop 1). * @note When exiting Stop 0 or Stop 1 mode by issuing an interrupt or a wakeup event, * the HSI RC oscillator is selected as system clock if STOPWUCK bit in RCC_CFGR register * is set; the MSI oscillator is selected if STOPWUCK is cleared. * @note When the voltage regulator operates in low power mode (Stop 1), an additional * startup delay is incurred when waking up. * By keeping the internal regulator ON during Stop mode (Stop 0), the consumption * is higher although the startup time is reduced. * @param Regulator: Specifies the regulator state in Stop mode. * This parameter can be one of the following values: * @arg @ref PWR_MAINREGULATOR_ON Stop 0 mode (main regulator ON) * @arg @ref PWR_LOWPOWERREGULATOR_ON Stop 1 mode (low power regulator ON) * @param STOPEntry: Specifies Stop 0 or Stop 1 mode is entered with WFI or WFE instruction. * This parameter can be one of the following values: * @arg @ref PWR_STOPENTRY_WFI Enter Stop 0 or Stop 1 mode with WFI instruction. * @arg @ref PWR_STOPENTRY_WFE Enter Stop 0 or Stop 1 mode with WFE instruction. * @retval None */ void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) { /* Check the parameters */ assert_param(IS_PWR_REGULATOR(Regulator)); if(Regulator == PWR_LOWPOWERREGULATOR_ON) { HAL_PWREx_EnterSTOP1Mode(STOPEntry); } else { HAL_PWREx_EnterSTOP0Mode(STOPEntry); } } 在主函数中调用如下; //停止模式对于唤醒时外部时钟设置 __HAL_RCC_HSE_CONFIG (RCC_HSE_ON ); __HAL_RCC_PLL_ENABLE (); __HAL_RCC_SYSCLK_CONFIG (RCC_SYSCLKSOURCE_PLLCLK ); printf("aaaa\r\n");//不一定能打印完全可以增加延迟 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI ); printf ("aaa\r\n");//恢复时打印完全 其中分为两个部分写在while外是在唤醒停止模式时外部时钟的定义,在while里是进入和唤醒停止模式 待机模式函数如下: /** * @brief Enter Standby mode. * @note In Standby mode, the PLL, the HSI, the MSI and the HSE oscillators are switched * off. The voltage regulator is disabled, except when SRAM2 content is preserved * in which case the regulator is in low-power mode. * SRAM1 and register contents are lost except for registers in the Backup domain and * Standby circuitry. SRAM2 content can be preserved if the bit RRS is set in PWR_CR3 register. * To enable this feature, the user can resort to HAL_PWREx_EnableSRAM2ContentRetention() API * to set RRS bit. * The BOR is available. * @note The I/Os can be configured either with a pull-up or pull-down or can be kept in analog state. * HAL_PWREx_EnableGPIOPullUp() and HAL_PWREx_EnableGPIOPullDown() respectively enable Pull Up and * Pull Down state, HAL_PWREx_DisableGPIOPullUp() and HAL_PWREx_DisableGPIOPullDown() disable the * same. * These states are effective in Standby mode only if APC bit is set through * HAL_PWREx_EnablePullUpPullDownConfig() API. * @retval None */ void HAL_PWR_EnterSTANDBYMode(void) { /* Set Stand-by mode */ MODIFY_REG(PWR->CR1, PWR_CR1_LPMS, PWR_CR1_LPMS_STANDBY); /* Set SLEEPDEEP bit of Cortex System Control Register */ SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); /* This option is used to ensure that store operations are completed */ #if defined ( __CC_ARM) __force_stores(); #endif /* Request Wait For Interrupt */ __WFI(); } 在while中使用待机模式代码如下 printf("aaaa\r\n"); HAL_PWR_EnableWakeUpPin (PWR_WAKEUP_PIN1_LOW); __HAL_PWR_CLEAR_FLAG (PWR_FLAG_WU ); HAL_PWR_EnterSTANDBYMode(); printf("aaaa\r\n");//唤醒不执行  

  • 发表了主题帖: 【测评STM32L452Nucleo-64】有源无源蜂鸣器的使用

      本篇测评给大家测试一下蜂鸣器的使用,在进行蜂鸣器的测试时我也是犯了一些很基本的错误致使卡了很久之后才发现问题进行解决   首先蜂鸣器分为两种,分别是有源蜂鸣器和无源蜂鸣器如下图; 有源蜂鸣器 无源蜂鸣器     蜂鸣器模块一般由一个上拉电阻一个负责放大的三极管和蜂鸣器组成,这里使用的蜂鸣器模块供电为5V,要确保通过蜂鸣器的电流足够大否则也不能驱动蜂鸣器。   有源蜂鸣器和无源蜂鸣器的主要区别是在蜂鸣器中是否有振荡电路,蜂鸣器的发声是依靠频率不断变化从而使发声的震动片不断震动从而产生声响。有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2K-5K的方波去驱动它。所以在编写代码时使用无源蜂鸣器会更加复杂需要自己编写一个频率代码。 首先我们使用有源蜂鸣器进行演示, 首先是cube的配置这里我们使用的是 PA9口 选择GPIO output level: High GPIO mode: Output Push Pull GPIO Pull-up/Pull-down: Pull-up Maximum output speed: High 配置好以后就可以生成工程文件了 #include "beep.h" void BEEP_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET); /*Configure GPIO pin : PD2 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //BEEP(0); /* 关闭蜂鸣器 */ } 在主程序中编写一个测试代码: while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ BEEP_TOGGLE(); delay_ms(1000); /* USER CODE BEGIN 3 */ /* USER CODE END 3 */ } 每秒对输出取反,蜂鸣器输出也是响一秒钟停止一秒钟 在这里的时候我因为把有源无源蜂鸣器搞混了,一开始安装了一个无源蜂鸣器,从而发出的声音是哒哒哒的,因为板卡是没有外部晶振,且与其他型号比L系列的时钟树多了一个MSI时钟配置,所以我一度认为是时钟树配置问题,折腾了好长时间才发现弄错了蜂鸣器; 但是这里也体现出了一个问题我们正常给无源蜂鸣器发声的波段应该是如下图: 在实验中写的频率交换太慢没有达到蜂鸣器的发声条件我们只要加快频率就可以使无源蜂鸣器发声。

  • 2023-09-24
  • 发表了主题帖: 【测评STM32L452Nucleo-64】使用RTC结合OLED制作一个简易时钟

    1.CubeMX配置 MCU内部的振荡器断电后会停止运行,所以RTC时钟使用外部晶振。 首先第一步要先开启外部低速振荡器LSE。 在左侧项目栏依次点击System Core->RCC,进入RCC配置界面,选择低速时钟Low Speed Clock(LSE)的工作模式为Crystal/Ceramic Resonator(使用晶振/陶瓷振荡器)即可。 配置好的RCC配置选项如下图所示: 打开LSE之后,右边的引脚图中,相应的PC14和PC15引脚会由灰色变为绿色,表示 该引脚已经被用于外部晶振输入。如图所示: 第二步,点击Clock Configuration 选项卡进入时钟系统配置栏,RTC时钟源选择LSE 如图所示: 第三步,依次点击左边项目栏的Timers->RTC,0进入RTC配置栏,使能RTC时钟源和 日历功能。配置如图所示: 最后点击RTC配置页下面的Parameter Settings选项卡,显示共有3个需要配置的 RTC 时钟项目。第一个配置项目Counter Settings的配置栏下面的3个选项配置如下: ◆hour format:小时制,这里选择24小时制。 ◆asynchronous predivider value:异步预分频器值,用来设置 RTC 时钟分频系数, 输入127。 ◆synchronous predivider value:同步预分频器值,输入255。 这里要注意,RTC时钟频率=RTC时钟源/ ((Asynchronous Predivider value + 1) * (Synchronous Predivider value + 1)) 时钟源是外部晶振时钟32.768KHz,Asynchronous Predivider value 和 Synchronous Predivider value 分别设置为 127 和 255,得到如下结果: 32.768KHz / ((127+1)*(255+1)) = 1Hz,也就是 1 秒。 第二个配置项目Claendar Time的配置栏下面有6个选项,用来配置RTC时钟的时分 秒,配置如下: ◆data format:数据格式,选择二进制数据格式。 ◆Hours:时。这里设置为上午10小时. ◆Minutes:分。设置为30分。 ◆Second:秒。设置为0秒。 ◆Day light saving:夏令时。设置为Daylightsaving None。 ◆Store opreation:存储操作。选择storeoperation reset 存储操作重置。第三个配置项目Calendar Date的配置栏下面有四个选项,用来配置RTC日历的星期和年月日。 经过上面的配置就可以生成工程源码。 2.编写用户程序 生成工程源码后,可以看到rtc.c文件中有三个初始化相关的函数,主要看其中的RTC 初始化函数。其中,需要在配置完RTC初始化参数后,加入配置时钟检查函数 HAL_RTCEx_BKUPRead 和初始化标志函数HAL_RTCEx_BKUPWrite,代码如下: void MX_RTC_Init(void) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN Check_RTC_BKUP */ if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0)!=0X5050) { /* USER CODE END Check_RTC_BKUP */ sTime.Hours = 9; 62 sTime.Minutes = 40; sTime.Seconds = 0; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_FEBRUARY; sDate.Date = 4; sDate.Year = 22; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN RTC_Init 2 */ HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0X5050); } /* USER CODE END RTC_Init 2 */ } 该函数用来初始化 RTC时钟,完成初始化后,用户可以在rtc.c文件中加入时钟自定义函数和日历自定义函数。代码如下: //RTC 时间设置 //hour,min,sec:小时,分钟,秒钟 //ampm:@RTC_AM_PM_Definitions:RTC_HOURFORMAT12_AM/RTC_HOURFORMAT12_ PM //返回值:SUCEE(1),成功 // ERROR(0),进入初始化模式失败 HAL_StatusTypeDef RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm) { RTC_TimeTypeDef RTC_TimeStructure; RTC_TimeStructure.Hours=hour; 63 RTC_TimeStructure.Minutes=min; RTC_TimeStructure.Seconds=sec; RTC_TimeStructure.TimeFormat=ampm; RTC_TimeStructure.DayLightSaving=RTC_DAYLIGHTSAVING_NONE; RTC_TimeStructure.StoreOperation=RTC_STOREOPERATION_RESET; return HAL_RTC_SetTime(&hrtc,&RTC_TimeStructure,RTC_FORMAT_BIN); } //RTC 日期设置 //year,month,date:年(0~99),月(1~12),日(0~31) //week:星期(1~7,0,非法!) //返回值:SUCEE(1),成功 // ERROR(0),进入初始化模式失败 HAL_StatusTypeDef RTC_Set_Date(u8 year,u8 month,u8 date,u8 week) { RTC_DateTypeDef RTC_DateStructure; RTC_DateStructure.Date=date; RTC_DateStructure.Month=month; RTC_DateStructure.WeekDay=week; RTC_DateStructure.Year=year; return HAL_RTC_SetDate(&hrtc,&RTC_DateStructure,RTC_FORMAT_BIN); } 这两个函数可以用来在主函数中重新定义时间和日历。 3.小程序的制作 其中OLED的配置我在上一篇帖子中已经详细介绍过,最后配置如下图 主函数代码如下: int main(void) { /* USER CODE BEGIN 1 */ RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; /* 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(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); MX_I2C2_Init(); MX_RTC_Init(); /* USER CODE BEGIN 2 */ OLED_Init(); OLED_ShowString(24,4,"20",16); OLED_ShowString(56,4,"-",16); OLED_ShowString(80,4,"-",16); OLED_ShowString(48,36,":",24); OLED_ShowString(84,36,":",24); OLED_Refresh_Gram(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN); OLED_ShowNum(24,36,RTC_TimeStruct.Hours,2,24); OLED_ShowNum(60,36,RTC_TimeStruct.Minutes,2,24); OLED_ShowNum(96,44,RTC_TimeStruct.Seconds,2,16); OLED_ShowNum(40,4,RTC_DateStruct.Year,2,16); OLED_ShowNum(64,4,RTC_DateStruct.Month,2,16); OLED_ShowNum(88,4,RTC_DateStruct.Date,2,16); OLED_Refresh_Gram(); //} } /* USER CODE BEGIN 3 */ /* USER CODE END 3 */ } 演示视频如下: [localvideo]a7583dd2d56db67dd6a0a269a18e432b[/localvideo]   这里我们要注意的一点的是我们在使用OLED显示时间时有时候会发现时间跳动并不准确,一会儿快一会儿慢,检查发现时钟配置都很正常,这通常是因为时序问题的原因,OLED使用的是I2C总线串行发送数据流,这就使得使用OLED每次刷新所需要的数据量是比较大需要更多的时间,如果经常进行刷新的话会影响内部时钟频率,虽然我们使用RTC时使用的是专门的外部晶振,但是也会产生时间已经改变屏幕还没来得及刷新,解决方法也很简单我们把需要改变的值进行循环刷新,把不需要改变的部分放在循环结构外边让刷新量变小其视觉刷新效果就会改善。

  • 2023-09-23
  • 回复了主题帖: 【测评STM32L452Nucleo-64】以点亮led、oled为例进行模块测试

    freebsder 发表于 2023-9-19 17:19 OLED_ShowString 是谁提供的库啊? 这个是我用的oled.c里的一个函数我常用的是这三个文件可以参考一下  

  • 2023-09-18
  • 发表了主题帖: 【测评STM32L452Nucleo-64】以点亮led、oled为例进行模块测试

      一、点亮一个led灯 软件编程常以输出”Hello World”作为学习的开始,在嵌入式的开发中我们也常使用点亮一个流水灯的方式开始学习,但是基于板载的资源比较少,Nucleo开发板上只有一个绿色的led灯,我们这里以点亮这个led灯为例进行第一个程序的开发。首先Cube的配置见下图,就是初始化配置未作修改。   在while(1)中输入代码 HAL_GPIO_TogglePin(GPIOA,LD4_Pin); HAL_Delay(1000); 绿色led灯将每一秒进行闪烁编译通过后下载即可演示视频如下 [localvideo]2e1323fc98d55adb9501f200dab6f592[/localvideo]   二、oled模块测试 oled是编程常用的直观的显示模块这里我们分布介绍一下在STM32L452RE上使用I2C进行oled配置,首先Cube的配置见下图 生成底层后我们还需要引入oled.c,oled.h,oledfont.h三个文件,经常进行开发的小伙伴对他们一定很熟悉这里就不做过多赘述,我使用的是四引脚的oled屏幕将GND接地VCC接3.3V,这里配置的是I2C2通道所以SCL接PB10,SDA接PB11,接好后编写了一段测试代码进行测试 int main(void) { /* USER CODE BEGIN 1 */ u8 t=0; /* 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(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); MX_I2C2_Init(); /* USER CODE BEGIN 2 */ OLED_Init(); OLED_ShowString(0,0,"STM32L452",24); OLED_ShowString(0,24, "0.96' OLED TEST",16); OLED_ShowString(0,40,"ATOM 2023/9/17",12); OLED_ShowString(0,52,"ASCII:",12); OLED_ShowString(64,52,"CODE:",12); OLED_Refresh_Gram(); t=' '; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ OLED_ShowChar(36,52,t,12); OLED_ShowNum(94,52,t,3,12); OLED_Refresh_Gram(); t++; if(t>'~')t=' '; HAL_Delay(500); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 测试结果如下 这里需要补充说明的是使用I2C不同通道对输出引脚有所改变,STM32L452RE可配置四个I2C其中I2C1对应PA9、PA10,I2C2对应PB10、PB11、I2C3对应PC0、PC1 、I2C3对应PB6、PB7。配置好后在找到对应的引脚,在板上引脚标注不全具体可参考下图。  

  • 2023-09-10
  • 发表了主题帖: 【测评STM32L452Nucleo-64】开箱与开发准备工作

        首先感谢EEWORLD和ST的测评机会。一直在关注EEWORLD,很高兴能参与这次STM32的测评活动,经过了几天的等待我收到了这次测评的开发板STM32L452Nucleo-64。 一、开箱   打开包裹后开发板的包装还是经典的Nucleo系列包装,在包装纸上有一些介绍芯片内核、开发系统、上电程序和接口的一些介绍; 图 1 开发板正面图 图 2开发板背面图 二、开发板介绍   芯片采用LQFP64封装有三个LED灯其中一个绿色一个红色一个双色灯,红色灯为电源指示灯当开发板供电时红灯恒亮,晶振频率为32.768 kHz,可以使用ST-LINK USB VBUS或外部电源向开发板供电,支持多种集成开发环境(ide),包括IAR嵌入式工作台®,MDK-ARM和STM32CubeIDE。通过一根USB-mini转USB连接线可以直接连接电脑进行供电和程序下载,芯片采用ARM® Cortex®-M4 series 微控制器IC 32位单核80MHz 256KB(256K x 8) 闪存48-UFQFPN,芯片结构图见图3。 图 3 STM32L452xx框图 三、第一次上电   首先检查板上跳线帽,JP5连接U5V,JP6打开,然后就可以进行上电运行了,我们可以看到板中所带的原始程序,通过点击USER可以使LD2变频闪烁。 图 4 原始程序运行图 四、L系列STM32芯片特点   我们使用STM32系列单片机时最常用的基本上是F系列的芯片L系列的芯片与其相比最大的特点就是可以低功耗运行,适合在一些电池供电,穿戴设备,偏远地区长期无人值守设备上使用。 五、程序开发准备   作为STM32系列芯片可以使用STM32CubeMX先进行架构配置,生成框架文件后再在Keil uVision5上进行编译。我们通过搜索STM32452RET6可以看到其中图5芯片选择框中第二行就是我们所要用的Nucleo开发板所用芯片。 图 5 STM32CubeMX芯片选择界面   选择后在上方有一些芯片的资料,进入配置界面后我们可以看到根据开发板已经有一些配置的GPIO。 图 6 配置界面   我们将生成文件改为MDK-ARM就可以生成Keil uVision5的程序文件了 图 7 生成文件   如果你之前并没有使用Keil uVision5开发过STM32L5系列还需下载驱动程序在。https://www.keil.arm.com/devices/中寻找需要的安装包下载安装即可。

  • 2023-08-28
  • 回复了主题帖: 【测评入选名单公布】ST多款开发板返场测评

    个人信息无误,确认可以完成测评

  • 2023-07-25
  • 加入了学习《发帖插入视频1》,观看 JS控制led

最近访客

< 1/2 >

统计信息

已有39人来访过

  • 芯积分:166
  • 好友:--
  • 主题:9
  • 回复:7

留言

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


现在还没有留言