1.移植ST官方软件包
__main
● 为什么要有一个main函数?
○ 从stm32f103的启动代码分析: ■ 这段汇编代码表达的意思是,当启动文件的代码执行到这一段的时候,会首先调用外部函数SystemInit , 然后再去调用__main 。 这个【__main】是C库中的函数,C库手册对其的解释是:
■ 在第三条,跳转到【_rt_entry】 , 这个函数也是C库中的,它的解释是:
● main函数之前都做了什么动作:( 也就是说处理器从上电启动开始 )
○ 第一步是注册中断向量表,第二部是调用SystemInit这个函数,第三步是调用【__main】函数
○ 而在【__main】函数中又对RO/RW/ZI段做了初始化,之后跳转到C库函数__rt_entry
○ 在__rt_entry函数中初始化堆栈、rt库初始化之后再调用了main函数
SystemInit
● 调用__main函数之前的另一个函数SystemInit是在官方软件包中的"system_stm32f1xx.c"里面定义实现的.
2. HAL 库的初始化
HAL_Init
● 对于ST处理器,且使用ST的HAL库的情况下,我们在main函数中必须要做的一件事情是初始化HAL库,即调用HAL_Init函数,这个函数中,做的事情是:
○ 1、使能内部Flash的预缓冲区;
○ 2、设置内核的中断组别;
○ 3、配置内核的滴答定时器;
○ 4、初始化处理器的系统时钟、总线时钟和外设时钟
■ 不初始化配置这些时钟的话,那么默认情况下ST处理器都是使用的内部时钟 ( 即CPU时钟是内部高速时钟HSI的值,低速时钟是LSI )
○ 5、设置 Flash 的等待周期
中断
● 《STM32F10xx Cortex-M3编程手册》则是根据《Cortex-M3权威指南》的内容进行了节选和说明,用以适用STM32F10系列的处理器
● 《STM32F10xx Cortex-M3编程手册》2.3.6章和4.4.5章
○ ST 将cortex-m3内核支持的128级中断裁剪成了只支持最高15级的中断
内核滴答定时器
● 内核的滴答定时器是一个24位的向下计数器,当它从预设值计数到0时,如果使能了中断,就会触发中断,然后再下一个时钟周期重载预设值,然后继续向下计数。
● 可以通过编程修改这个滴答定时器的计数频率
○ HAL_Init中默认是设置位1kHz,且其中断优先级数值位15,即是一个最低中断等级的中断,这意味着这个定时器的中断极易被别的外设中断打断。