标签: stm32

两个USART中断溢出错误

在STM32F2上使用两个以115200波特率运行的USART,一个用于与无线电模块通信,另一个用于从PC进行串行通信.时钟速度为120MHz.

当同时从两个USART接收数据溢出时,可能会在一个USART或另一个USART上发生错误.快速回退包络计算应该有足够的时间来处理两者,因为中断只是简单地将字节复制到循环缓冲区.

在理论和测量中,将字节推送到缓冲区的中断代码应该/确实以2-4μS的顺序运行,在115200波特处我们有大约70us处理每个字符.

为什么我们在一个或另一个USART上看到偶尔的ORE?

更新 - 其他信息:

  1. 我们的代码中没有其他ISR此时正在触发.
  2. 我们正在运行Keil RTX,其中systick中断配置为每隔10mS触发一次.
  3. 我们目前没有禁用任何中断.
  4. 根据本书(Cortex-M处理器系列的设计者指南),中断延迟大约为12个周期(并非真正致命)

鉴于上述所有70us在我们清除中断的时间内至少是10倍 - 所以我不确定它是如此容易解释.我是否应该断定我必须考虑其他一些因素?

MDK-ARM是版本4.70

指纹中断由RTOS使用,因此无法计时其他ISR每个字节需要2-3μS才能运行.

embedded serial-port interrupt stm32

8
推荐指数
1
解决办法
7218
查看次数

如何从Cortex-M3(STM32)上的RAM执行函数?

我正在尝试从Cortex-M3处理器(STM32)上的RAM执行一个函数.该功能擦除并重写内部闪存,所以我肯定需要在RAM中,但我该怎么做?

我试过的是:使用memcpy将函数复制到RAM中的字节数组(检查它是否正确对齐),将函数指针设置为指向字节数组然后调用函数(指针).

这可能适用于10条指令(我可以跟随调试器的执行),但随后我收到一个buss错误,处理器重置.第二次通过循环时发生总线错误,因此代码应该没问题(因为它在第一次传递时起作用).我认为更快的RAM访问会以某种方式破坏总线时序......

无论如何有一个正确的方法来做到这一点?分散文件如何将函数自动放入RAM中(我正在使用Keil uVision for Cortex-M3)?

编辑:更多信息:工具链:RealView MDK-ARM V 4.10编译器:Armcc v4.0.0.728汇编程序:Armasm v4.0.0.728链接器:ArmLink v4.0.0.728处理器:STM32F103ZE

发生复位时,IMPRECISERR位在总线故障寄存器中置1.

c ram stm32 keil

7
推荐指数
1
解决办法
2万
查看次数

如何在stm32-discovery上显示时间

我最近一直在尝试STM32-DISCOVERY,但我不确定什么是真正开始使用该板的应用程序的最佳方法.

我想在stm32的显示屏上显示RTC的时间.我一直在寻找很多教程,但我似乎找不到任何教程.

你们有没有想过开始这个的最佳方法是什么?我已经为STM32安装了库.

提前致谢.

c microcontroller stm32 discovery

7
推荐指数
1
解决办法
1万
查看次数

STM32 DMA传输错误

我使用STM32F407VTG6控制器并尝试使用DMA从SPI接收数据.然后我想在DMA完全传输中断上处理数据.但是当发生完全传输中断时,我看到TEIF(传输错误中断标志)已设置.此DMA无法启动.这是我的代码的一部分:

static void DmaInit()
{
 DMA_InitTypeDef dma;

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

 // DMA for Rx
 dma.DMA_Channel = DMA_Channel_3;
 dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
 dma.DMA_Memory0BaseAddr = 0; // will be set later
 dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
 dma.DMA_BufferSize = 1; // will be set later
 dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
 dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
 dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
 dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
 dma.DMA_Mode = DMA_Mode_Normal;
 dma.DMA_Priority = DMA_Priority_High;
 dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
 dma.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
 dma.DMA_MemoryBurst = DMA_MemoryBurst_Single;
 dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
 DMA_DeInit(DMA2_Stream2);
 DMA_Init(DMA2_Stream2, &dma);

 // Enable DMA Interrupt on complete transfer
 NVIC_EnableIRQ(DMA2_Stream2_IRQn);
 DMA_ITConfig(DMA2_Stream2, …
Run Code Online (Sandbox Code Playgroud)

c spi stm32 dma

7
推荐指数
1
解决办法
1万
查看次数

通过应用程序跳转到STM32中的Bootloader,即在用户闪存的引导模式下使用Boot 0和Boot 1 Pins

我有固件升级的要求.我打算使用USB DFU类.但在我的情况下,固件升级命令将来自PC应用程序.所以我需要切换到系统内存中的bootloader.最初我正在运行应用程序,因此它从用户闪存启动,即我为用户闪存配置了Boot0和Boot 1引脚.由于DFU引导加载程序存在于系统闪存中,现在需要更改Boot0和Boot1引脚设置.有没有像启动0和启动1设置保持用户闪存相同的方式,在应用程序中我们跳转到系统内存?

c usb stm32 dfu

7
推荐指数
3
解决办法
4万
查看次数

在调试期间禁用STM32 IWDG

我在STM32F4微控制器上有一个ChibiOS 3.x程序,我使用IWDG看门狗来重置MCU,如下所示:

int main() {
    iwdgInit();
    iwdgStart(&IWDGD, &wd_cfg);
    while(true) {
        // ... do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我现在连接我的调试器,并且在任何时候停止程序(手动或通过断点),微控制器将在看门狗配置定义的超时后重置(因此在我的调试过程中会导致问题)

如何禁用此行为,即如何在核心因调试器而停止时禁用IWDG?

我已经尝试完全禁用它,但是,我需要让它保持运行以捕获不需要的IWDG重置.

c watchdog stm32 chibios

7
推荐指数
2
解决办法
1万
查看次数

STM32通过RTC从待机状态唤醒

我正在编程STM32L051R8并有下一个问题.我大部分时间都在尝试使用待机模式,有时通过RTC唤醒,这是一个自动唤醒.如果我在没有睡觉的情况下工作 - 一切正常,我每次都会得到一个RTC中断,但是当我使用待机时 - 不要.

如果我使用待机,我的第一个周期很好:

  1. 重启
  2. 设置RTC
  3. 进入待机状态
  4. 等待中断
  5. 醒来

但是第二个和下一个周期在进入待机状态后立即唤醒(3).

microcontroller timer stm32 wakeup real-time-clock

7
推荐指数
1
解决办法
8351
查看次数

STM32,位置无关代码 - 不在GOT中的函数指针?

我需要一个在STM32F401上工作的位置无关代码(PIC).但是我对指向例如struct中使用的函数的指针有问题.

简短的例子:

struct process {
  struct process *next;
  const char *name;
  PT_THREAD((* thread)(struct pt *, process_event_t, process_data_t));
  struct pt pt;
  unsigned char state, needspoll;
};

process etimer_process...

static void call_process(struct process *p, process_event_t ev, process_data_t data) {
  int ret;
  ret = p->thread(&p->pt, ev, data);
}
Run Code Online (Sandbox Code Playgroud)

反汇编后:

Disassembly of section .data:
   ...
 20000768 <etimer_process>:
 20000768:  00000000    andeq   r0, r0, r0
 2000076c:  0803b134    stmdaeq r3, {r2, r4, r5, r8, ip, sp, pc}
 20000770:  08027435    stmdaeq r2, {r0, r2, r4, r5, sl, ip, …
Run Code Online (Sandbox Code Playgroud)

gcc arm stm32 position-independent-code

7
推荐指数
1
解决办法
790
查看次数

fwrite是否刷新'\n'上的缓冲区?

我有自己的执行_open(),_close(),_write(),_read().

我的代码:

FILE *f = fopen("0:test", "wb");  // calls _open()
fwrite("hello ", 6, 1, f);
fwrite("world\r\n\0", 8, 1, f); // calls _write(3, "hello world\r\n", 13)
fflush(f);                      // calls _write(3, "\0", 1)
fclose(f);                      // calls _close(3)
Run Code Online (Sandbox Code Playgroud)

BUFSIZE 是1024

编译器:arm-none-eabi-gcc/版本:5.4.1

即使我有旗帜,为什么要fwrite()解释?'\n'"wb"

是否fopen()解释文件名"0:test"

c stdio stm32 newlib

7
推荐指数
1
解决办法
301
查看次数

STM32微控制器上哪些变量类型/大小是原子的?

以下是STM32微控制器上的数据类型:http : //www.keil.com/support/man/docs/armcc/armcc_chr1359125009502.htm

这些微控制器使用32位ARM核心处理器。

哪些数据类型具有自动原子读取和原子写入访问权限?

我很确定所有32位数据类型都可以(因为处理器是32位),而所有64位数据类型都不能(因为要读或写一个64位字至少需要2个处理器操作),但是bool(1个字节)和uint16_t/ int16_t(2个字节)呢?

上下文:我正在STM32上的多个线程(在FreeRTOS中称为单核,但有多个线程或称为“任务”)之间共享变量,并且需要知道是否需要通过使用中断关闭中断来强制进行原子访问互斥锁等

更新:

参考此示例代码:

volatile bool shared_bool;
volatile uint8_t shared u8;
volatile uint16_t shared_u16;
volatile uint32_t shared_u32;
volatile uint64_t shared_u64;
volatile float shared_f; // 32-bits
volatile double shared_d; // 64-bits

// Task (thread) 1
while (1)
{
    // Write to the values in this thread.
    // What I write to each variable will vary. Since other threads
    // are reading these values, I need to …
Run Code Online (Sandbox Code Playgroud)

c arm atomic stm32 freertos

7
推荐指数
1
解决办法
2317
查看次数