main函数之前的执行
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
其中IMPORT:表明后面要调用的函数是一个外部文件的函数
LDR:加载指令
BLX:从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容的保存到寄存器R14中
BX:跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。
在不考虑开发使用的外设初始化情况下,STM32的main函数中必须做以下几件事:
- 1、设置内部Flash的预缓冲区
- 2、设置系统中断组别
- 3、设置内核滴答定时器
- 4、设置系统时钟、总线时钟和外设时钟
- 5、设置Flash的等待周期
3_STM32F10xx Cortex-M3编程手册【重要】.pdf是10.0_Cortex-M3权威指南(英文原版)【重要】.pdf的节选说明。
一种环形缓冲区的实现
- 数据结构
typedef struct {
uint8_t *fifo;
uint16_t pw;
uint16_t pr;
uint16_t buf_size;
}RingBuffer, *ptRingBuffer;
-
判满逻辑
- (pw+1)%buf_size 等于pr则认为环形缓冲区为满
-
判空逻辑
- pr等于pw则认为环形缓冲区为空
一种按键消抖方式
采用外部中断跟滴答定时器计时相结合的方式。
- 按键引脚配置为上升沿、下降沿进中断,在该中断中更新电平采样时间。
- 在滴答定时器中断中,如果采样时间到,则采集一次引脚电平,如果电平为按下电平,则记录按键被按下的时间t1,如果电平为释放时电平,则记录按键被释放的时间t2。如果t1和t2都不为0,则表示完成一次按键动作采集,将按键值和按键被按下的时间t2-t1记录到环形缓冲区中。