我正在使用IAR编译器在STM32L152RB Discovery板上实现实时时钟.我在HSI上实现了时钟配置,并使用PLL将其乘以4. Code - >
/* Enable HSI Clock */
RCC_HSICmd(ENABLE);
/*!< Wait till HSI is ready */
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_4,RCC_PLLDiv_2);
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* Set HSI as sys clock*/
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
Run Code Online (Sandbox Code Playgroud)
问题是在配置实时时钟时我必须将辅助时钟LSE设置为RTC时钟源,在我的情况下,我的源时钟是HSI.根据我所知,其余的步骤包括启用PWR控制器,启用rtc域访问,rtc时钟源,rtc_init(),然后设置时间和gettime.这是我试过的代码 - >
/* Enable RTC clocks and rtc related functions */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_RTCAccessCmd(ENABLE);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //This part I think is wrong
RCC_RTCCLKCmd(ENABLE);
RTC_InitTypeStructure.RTC_HourFormat=RTC_HourFormat_12;
RTC_InitTypeStructure.RTC_AsynchPrediv=0x7F;
RTC_InitTypeStructure.RTC_SynchPrediv=0xFF;
RTC_Init(&RTC_InitTypeStructure);
/* End RTC Clock */
RTC_TimeTypeTime.RTC_Hours=18;
RTC_TimeTypeTime.RTC_Minutes=11;
RTC_TimeTypeTime.RTC_Seconds=4;
RTC_TimeTypeTime.RTC_H12=RTC_H12_PM;
RTC_SetTime(RTC_Format_BIN, &RTC_TimeTypeTime);
while(1){
f_SleepMs(10);
RTC_GetTime(RTC_Format_BIN, &RTC_TimeTypeTime);
RELEASE_MSG("\r%d:%d:%d",RTC_TimeTypeTime.RTC_Hours,RTC_TimeTypeTime.RTC_Minutes,RTC_TimeTypeTime.RTC_Seconds);
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是 …
在STM32F2上使用两个以115200波特率运行的USART,一个用于与无线电模块通信,另一个用于从PC进行串行通信.时钟速度为120MHz.
当同时从两个USART接收数据溢出时,可能会在一个USART或另一个USART上发生错误.快速回退包络计算应该有足够的时间来处理两者,因为中断只是简单地将字节复制到循环缓冲区.
在理论和测量中,将字节推送到缓冲区的中断代码应该/确实以2-4μS的顺序运行,在115200波特处我们有大约70us处理每个字符.
为什么我们在一个或另一个USART上看到偶尔的ORE?
更新 - 其他信息:
鉴于上述所有70us在我们清除中断的时间内至少是10倍 - 所以我不确定它是如此容易解释.我是否应该断定我必须考虑其他一些因素?
MDK-ARM是版本4.70
指纹中断由RTOS使用,因此无法计时其他ISR每个字节需要2-3μS才能运行.
我正在开发一个需要至少500 kB内存的项目.我有一个SDK,用这个代码定义堆栈和堆,它工作正常.
Stack_Size EQU 0x00004000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00200000
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
Run Code Online (Sandbox Code Playgroud)
但是,我正在尝试将相机和LCD屏幕功能集成到此SDK中,当我这样做时,至少会调出LCD屏幕的堆栈和堆的最高值如下所示.任何高于此值且LCD屏幕保持黑色且应用程序似乎不运行.
Stack_Size EQU 0x00004000
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00002B50
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
Run Code Online (Sandbox Code Playgroud)
我需要在第二个代码示例中使用堆栈和堆的大小来匹配第一个代码示例中的大小,这样我就不会因为没有可用内存而陷入硬故障异常循环.为什么增加堆大小会使我的项目变得更糟?这意味着当我增加堆大小时,它甚至不会出现? …
我已经找到了大量的例子,但没有提到如何从STM32MXCube"正确"地做到这一点.
如何从STM32CubeMX创建用于USB CDC虚拟COM端口通信的骨架代码(如果可能的话,STM32F4发现)?
所以我尝试将硬件NSS信号与HAL库一起使用,但我找不到任何使NSS引脚具有低电平或高电平的功能.我也试图在HAL文档中找到答案,但也没有任何信息.Internet中的所有示例仅包含NSS软件.如何使用硬件NSS?
我想尝试将一些Arduino库移植到stm32.在Arduino中,millis()返回自引导以来的毫秒数.在stm32中是否有等效的功能?我正在使用stm32f0 MCU.
我试图在stm32f0上模拟EEPROM.STM提供了一份应用说明.
在样本中main.c,
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f0xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f0xx.c file
*/
/* Unlock the Flash Program Erase controller */
FLASH_Unlock();
/* EEPROM Init */
EE_Init();
/* --- Store successively many values of the three variables in the EEPROM ---*/ …Run Code Online (Sandbox Code Playgroud) 这是我上一个问题的后续,需要为 USB 外围设备编写驱动程序吗?
我正在使用 STM32 微控制器(裸机/无操作系统)设计 USB 外围设备。该设备偶尔会连接到 Windows PC,并在每个方向传输几 KB 的数据。将有一个定制的 PC 应用程序来控制数据传输,使用专有协议(即 USB 有效负载)。
PC 将始终是主机(启动器)——它将发送命令,设备将发出响应,在单个命令或响应中的任一方向最多有几百字节的数据。我想我会想使用 USB 批量传输模式。
据我了解,一种选择是我可以使用 USB 通信设备类 (CDC)。在设备端,我可以使用来自 ST 的示例代码用于 USB CDC,例如来自STM32Cube。在 PC 端,设备将显示为虚拟 COM 端口 (VCP)。然后在软件中,我基本上有一个原始的双向流,在此之上我必须定义我的消息格式、命令等。
我在思考这到底是什么以及如何使用它时遇到了麻烦。
WinUSB 与 USB 设备类的关系是什么?它似乎充当“通用”USB 类,但我找不到任何说明它的文档。
WinUSB 是否提供任何内置的消息分隔符?例如,WinUsb_WritePipe是否将缓冲区的内容作为原子单元发送到设备?或者我只是获得像 VCP/UART 这样的原始流?
如何在设备上实现 WinUSB?有可用的示例代码吗?(最好是 STM32。)
我正在使用STM32F072 探索板为自定义 USB 设备开发固件和 PC 测试应用程序。该设备包括 Microsoft Windows 兼容 ID (WCID),以便在 PC 上自动安装WinUSB 驱动程序。
该设备在其他 Windows 10 主机上被正确枚举,但在我的 Windows 10 开发 PC 上没有。我的开发 PC 之前曾尝试枚举具有相同 VID/PID 组合但具有不同描述符/元数据的设备。如果我将 PID 更改为其他数字(我的开发 PC 的新数字),它确实会正确枚举。
由于 Windows 从以前的枚举中缓存 USB 描述符等的方式,在固件开发过程中,每次我进行其他更改后,我都会增加固件中的设备产品 ID (PID),以确保 Windows 不会缓存来自描述符的先前迭代,并弄乱了本来可以工作的东西。
现在,我已将该设备作为 WinUSB 设备在 Windows 7、8 和 10 PC 上成功枚举,并且已建立通信。但是,当我将固件改回使用我开始使用的 VID/PID,然后将设备连接到我的开发 …
我即将开始一个基于经典STM32L4的产品的新项目.我在ARM开发方面有很好的经验,但在STM32中则没有.我想知道STM32提供的STM32 HAL和低级驱动程序的质量和性能是什么(在STM32Cube包中).我想收集有关该主题的开发人员经验和反馈.基本上我想知道你是否对这段代码感到满意,或者相反如果你遇到一些问题,如果有些人因为某些原因开发了自己的驱动程序等等......谢谢!