我正在使用ARM Cortex M3芯片(STM32F2),ST提供"标准外设库".它有一些有用的.c和.h文件.它还有.s文件.
在C项目的上下文中这些.s文件的目的是什么?如何获取编译器/链接器/?把它们考虑进去?
我正在研究STM32F4 CPU上的一个项目,产生信号.
我在STM32上有CPU时钟(没有预分频器)的通用定时器,在溢出时触发中断,然后用GPIO产生周期信号.
我需要在非常精确的时间触发GPIO(基本上低至一个CPU周期精度).通过设置优先级等,我已设法将此抖动减少到+ -5个周期,但这种抖动存在,具体取决于CPU的工作情况.
我需要补偿这几个周期的抖动.只要我在精确的时间切换GPIO,添加几个周期的延迟就不是问题.
我的想法是读取计数器的当前值,并有一个FIXED_NUMBER-CURRENT_VALUE时间的活动循环,确保我将在精确的时间退出循环.
然而,在C中做一个简单的循环 - 一个FOR循环,或一个while(counter-> value <TARGET)不起作用,因为它ADDS抖动而不是减少它.
我做错了什么/天真吗?我应该在集会中这样做吗?怎么会与C不同(我检查了用GCC反汇编来检查循环没有被优化掉,也不是我打了内存?)
(我确保空的,非优化的但不打击内存循环体)
编辑:在AVR上看到这个例子(我知道的更稳定)请参见示例http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索"jitter")
edit2:我在汇编中尝试了一个简单的循环,例如(r0是我的计数器,等待的循环次数,在寄存器中)
loop : SUBS r0,#1 ; tried with 2 also
BGE loop
Run Code Online (Sandbox Code Playgroud)
而且,如果没有它,抖动会更好.
总结起来,我已经知道我应该拖延多少.我只需要一种方法让代码分支在一个案例中可靠地消耗N个循环而在另一个案例中可以消耗M. 不幸的是,单独的分支似乎不起作用,因为管道填充似乎不需要可靠的循环次数,并且条件表达式也不会因为它们总是采用相同数量的循环(有时无效).
从RAM而不是闪存运行会提高一致性吗?(NB stm32f4有一个flash预取..)
STM32提供从用户闪存,系统内存和嵌入式SRAM启动的选项.在固件方面"从用户Flash启动"是否意味着执行自定义引导加载程序?
我使用 SWD 在 stm32 芯片中加载固件和调试。它使用 3 个引脚:SWCLK(TCK)、SWDIO(TMS)和GND。
我可以使用其他未在 SWD 接口中使用的 JTAG 引脚:( TDI, TDO, TRST) 用于自己的目的,同时保留在芯片中刷新固件的可能性吗?
我试着为stm32f334做一些例子(只是led闪烁).当我想使用.data部分约束时(通过使用初始化的全局变量),我遇到了链接器的问题我遇到了问题.全局变量的值不正确!
这是我的代码:
startup.s:
.global _start
.thumb_func
_start:
.word 0x20003000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
bl main
b hang
.thumb_func
hang: b .
Run Code Online (Sandbox Code Playgroud)
blink.c:
#define RCCBASE 0x40021000
#define GPIOBBASE 0x48000400
static int wymuszenie_bss;
int wymuszenie_data = GPIOBBASE;
int main ( void )
{
unsigned int* ptr;
wymuszenie_bss = 0x40021000;
ptr = (unsigned …Run Code Online (Sandbox Code Playgroud) stm32 ×5
arm ×2
bare-metal ×1
bootloader ×1
c ×1
cortex-m ×1
counter ×1
embedded ×1
gnu-arm ×1
interrupt ×1
jtag ×1
low-latency ×1