该系列博客调试过程搜寻大量网上经验,本人只是当作笔记在此记录,如有侵犯,请联系我,下架该文章,且本人能力有限,对代码理解难免出现纰漏以及错误的地方,敬请留言指正.
参考[1] 野火stm32 固件库例程
硬件平台: 蓝桥杯嵌入式开发板-stm32F103RBT6
开发环境: keilv5.27
注意事项:
[1]keil 在不断更新的过程中,将一些较老板卡的硬件数据压缩在器件支持包中.对于stm32F103RBT6在使用较高等级keil软件(5.24之后)时,需要安装器件支持包:MDKCM520.EXE,对于更高规格的R系列(实时控制领域)则需要安装:MDK Version 5 For ARM7 ARM9 Cortex-R V5.20.EXE芯片包.
[2]原本蓝桥杯大赛上的应用环境为keil4,在使用keil5作为开发环境建立工程时需要进行适当配置
知识点:
[1]在库文件中,针对每个外设,ST的工程师为了使得操作难度降低,通过使用stm32f10x.h 文件完成对寄存器的首次封装(其中通过使用数据结构类型-struct结构体内存分配的特点,),后编写的stm32f10x_gpio.c/.h文件中包含对外设的一些初始化/配置接口,再次封装.
[2]做到精确延时: 在不选用RTOS的情况下,可以使用cortex m3内核中自带外设 SysTick-系统滴答定时器
该外设属于内部外设,其中断优先级不由NVIC初始化,
例程目录
例程1 闪烁流水灯
例程2 按键中断
例程3 串口数据传输
例程1 闪烁流水灯
功能说明: 通过系统滴答定时器完成LED灯精确时间闪烁
工程文件树:
仅在HARDWARE文件组下根据不同用途,编写对应的BSP(各有一个源文件 bsp_xxx.c 用来书写函数的主体 和头文件bsp_xxx.h 进行函数声明 宏的定义 外部变量的引用 调用其他文件)
为此:
[1]对于LED灯,需要对GPIO进行配置
头文件:
头文件中包含了对引脚的宏定义,并通过带参数的宏完成分支语句,注意:宏只能对一行的内容进行简单替换,在此通过续行符"\"连接内容. else 语句之后没有添加分号 为了在宏替换之后使用原先的分号,避免重复产生报错.
源文件:仅包含LED的GPIO的初始化函数 主要对GPIO初始化结构体成员进行配置 [1]引脚号 [2]引脚的工作方式 [3]输出速率
由于该扩展板的八路LED的引脚受控于74LS573芯片的LE,引脚,故须对LE引脚进行配置
通过电路图查阅
八路LED灯:LED1…8------>GPIOC-8…15
LE引脚: LE---->GPIOD-2
LE引脚在高电平时允许输出端及时受控于输入端,在低电平时进行引脚电平的锁存.
[2]系统滴答定时器
源文件:
调用了在core_cm3.h中定义的SysTick时钟初始化函数SysTick_Config()函数,对SysTick外设内部寄存器通过传入参数(累加计数时钟)进行配置,SystemCoreClock:在system_stm32f10x.h文件中声明的能够被外部文件引用的变量
定义static静态变量Decrement_count 保证该变量的作用域(仅在bsp_systick.c文件中使用)和生命周期.
由于Decrementing()函数并没有在bsp_systick.h文件中声明,故通过包含头文件的方式无法在其他C文件调用该函数,但在stm32f10x_it.c文件中需要执行SysTick中断函数(void SysTick_Handler(void)首先在启动文件中startup_stm32f10x_md.s中 进行weak类型声明和在中断向量表中 进行优先级的分配
) 完成时钟计数的递减操作,通过引用外部函数 extern void Decrementing(void)使函数能被正常调用
主函数
在主函数中对灯