与时钟的相关的函数基本都在 stm32f10x_RCC 文件中;
assert_param()用于检测传递给函数的参数是否是有效的参数
与端口相关的函数基本都在 stm2f10x_GPIO 文件中
STM32单片机的时钟源有五个:
HSE | 外部高速时钟(High Speed External),由以下两种时钟源产生:HSE外部晶体/陶瓷谐振器;HSE用户外部时钟。为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠近振荡器引脚。负载电容值必须根据所选择的振荡器来调整,精度比较高。 | |
HSI | 内部高速时钟(High Speed Internal),HSI时钟信号由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。 | |
LSE | 外部低速时钟(Low Speed External),LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。LSE晶体通过在备份域控制寄存器(RCC_BDCR)里的LSEON位启动和关闭。在备份域控制寄存器(RCC_BDCR)里的LSERDY指示LSE晶体振荡是否稳定。在启动阶段,直到这个位被硬件置’1’后, LSE时钟信号才被释放出来。如果在时钟中断寄存器里被允许,可产生中断申请。 | |
LSI | 内部低速时钟(Low Speed Internal),LSI RC担当一个低功耗时钟源的角色,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。 LSI时钟频率大约40kHz(在30kHz和60kHz之间)。进一步信息请参考数据手册中有关电气特性部分。LSI RC可以通过控制/状态寄存器(RCC_CSR)里的LSION位来启动或关闭。在控制/状态寄存器(RCC_CSR)里的LSIRDY位指示低速内部振荡器是否稳定。在启动阶段,直到这个位被硬件设置为’1’后,此时钟才被释放。如果在时钟中断寄存器(RCC_CIR)里被允许,将产生LSI中断申请。 | |
PLL | 锁相回路或锁相环(Phase Locked Loop),内部PLL可以用来倍频HSI RC的输出时钟或HSE晶体输出时钟。PLL的设置(选择HIS振荡器除2或HSE振荡器为PLL的输入时钟,和选择倍频因子)必须在其被激活前完成。一旦PLL被激活,这些参数就不能被改动。如果PLL中断在时钟中断寄存器里被允许,当PLL准备就绪时,可产生中断申请。如果需要在应用中使用USB接口,PLL必须被设置为输出48或72MHZ时钟,用于提供48MHz的USBCLK时钟。 |
在时钟树中倍频是“f*2”;分频是“f/2”。
STM32的时钟树
(摘自正点原子《STM32F1开发指南(精英版)-寄存器版本_V1.3.pdf》)
软件仿真是程序在电脑上运行,并不需要连接实际的单片机。软件仿真需要配置下面
需要配置相应的时钟(这里的8.0指的是晶振)
仿真中各个按键的含义;
按键 | 作用 | ||
复位 | 其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。 | ||
执行到断点处 | 该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。 | ||
停止运行 | 此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。 | ||
执行过去 | 在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。 | ||
执行出去 | 该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。 | ||
执行到光标处 | 该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。 | ||
汇编窗口 | 通过该按钮,就可以查看汇编代码,这对分析程序很有用。 | ||
堆栈局部变量窗口 | 通过该按钮, 显示 Call Stack+Locals 窗口,显示当前函数的局部变量及其值,方便查看。 | ||
观察窗口 | MDK5 提供 2 个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口, 输入你所想要观察的变量/表达式,即可查看其值, 是很常用的一个调试窗口。 | ||
内存查看窗口 | MDK5 提供 4 个内存查看窗口(下拉选择), 该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口。 | ||
串口打印窗口 | MDK5 提供 4 个串口打印窗口(下拉选择), 该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。 | ||
逻辑分析窗口 | 该图标下面有 3 个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(Logic Analyzer),点击即可调出该窗口, 通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。 | ||
系统查看窗口 | 该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。 | ||
Debug 工具条上的其他几个按钮用的比较少, 我们这里就不介绍了。 |
要对下图中的数据进行修改则需要进入到
然后就可以进行调试了
可以用来观察PC13是输出高电平还是低电平
在运行程序之后,对应的GPIOC的ODR寄存器会发生变化
同样地也可以在Keil中采用类似示波器一样的功能去观察其对应引脚的波形
不过需要配置一下,点击左上角的”Setup“进行如下配置
其结果类似于示波器,可以通过该方法来看引脚的输出是低电平还是高电平。
硬件仿真是实实在在与单片机连接的,程序在单片机中运行。可以使用示波器、逻辑分析仪。硬件仿真需要配置下面
修改为:
硬件仿真的配置过程与软件仿真的相似,不过是"D"变成"T"。
点击”Settings“,选择时钟为72MHz
逻辑分析仪的配置与软件仿真一样
然后会发现逻辑分析仪没有什么图像,这是由于在硬件仿真的时候不支持逻辑分析仪,感觉海创电子的分享。
阻塞延时其实就是使用for循环来达到延时的效果,但是在延时的时间中单片机是不能进行其他任何操作的,只能等到延时程序执行完
登录后复制
void delay(unsigned int i){ unsigned int j; for(j=0;j<i;j++){ //不写或者再套一个空的for循环 }}1.2.3.4.5.6.
非阻塞延时的框架
登录后复制
int main(void){ while(1){ //子程序 Task_A_Processing(); Task_B_Processing(); Task_C_Processing(); ... }}void Task_A_Processing(){ //等时间一到执行相应的任务,常结合switch语句}//而且一般和定时器中断函数搭配使用1.2.3.4.5.6.7.8.9.10.11.12.13.
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删