我正在尝试从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.
长话短说.我希望学习如何创建一个好的链接器脚本,这样我就可以更改平台/架构/供应商,我不会再知道该做什么而再次停留在零点.我并不关心任务的难度,而是关心它.
我已经开始了一个项目,就是为STM的32位Cortex-M3芯片编程和开发创建基础或骨架.在jsiei97的帮助下,从STM32F103RB开始(我还有TI Stellaris LM3S828,但这是另一个问题),无需经过许可的IDE.由于我是学生,而且大多数学生都买不起这样的东西.
我知道有ODev,Eclipse插件和什么不是,并且已经阅读了各种博客,wiki,docs/man页面,大多数项目为您提供了一个链接器脚本,几乎无法解释为什么以及在哪里定义了事物.
我已经为STM32编译了一个arm-none-eabi工具链,但我挂起的是链接器脚本.CodeSourcery也需要一个.我有一个基本的概念,如何在阅读gnu手册页后创建它们和它们的语法,但我根本没有线索从哪个开始添加除了显而易见的.text,.bss和.data之外的各种额外部分.
我创建了一个基本版本,但是我得到链接错误,要求分区定义,这就是我遇到的问题.我知道如何定义它们,但知道我正在做的事情是否接近正确就是问题所在.
我最近一直在尝试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)