在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才能运行.
我正在尝试从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.
我最近一直在尝试STM32-DISCOVERY,但我不确定什么是真正开始使用该板的应用程序的最佳方法.
我想在stm32的显示屏上显示RTC的时间.我一直在寻找很多教程,但我似乎找不到任何教程.
你们有没有想过开始这个的最佳方法是什么?我已经为STM32安装了库.
提前致谢.
我使用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) 我有固件升级的要求.我打算使用USB DFU类.但在我的情况下,固件升级命令将来自PC应用程序.所以我需要切换到系统内存中的bootloader.最初我正在运行应用程序,因此它从用户闪存启动,即我为用户闪存配置了Boot0和Boot 1引脚.由于DFU引导加载程序存在于系统闪存中,现在需要更改Boot0和Boot1引脚设置.有没有像启动0和启动1设置保持用户闪存相同的方式,在应用程序中我们跳转到系统内存?
我在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重置.
我正在编程STM32L051R8并有下一个问题.我大部分时间都在尝试使用待机模式,有时通过RTC唤醒,这是一个自动唤醒.如果我在没有睡觉的情况下工作 - 一切正常,我每次都会得到一个RTC中断,但是当我使用待机时 - 不要.
如果我使用待机,我的第一个周期很好:
但是第二个和下一个周期在进入待机状态后立即唤醒(3).
我需要一个在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) 我有自己的执行_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"?
以下是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)