根据MDK-RAM建立工程的步骤建立STM32F10_LED新工程。
时钟信号 (Clock):时钟信号是提供给同步内存做讯号同步之用,同步记忆体的存取动作必需与时钟信号同步(只有时钟信号到来且存储命令同时到来时 才会发生存取动作)。同步是时钟控制系统中的主要制约条件,同步是指在有效信号沿发生时刻,希望写入单元的数据也有效。数据有效则是指数据量比较稳定(不发生改变),并且只有当输入发生变化时数值才会发生变化。由于组合电路无法实现反馈,所以只要输入量不发生变化,输出最后最终会是一个稳定有效的量。
将时钟信号总结为:同步记忆体只有在时钟信号和存取操作同时到来才会发生存取动作,而且一旦操作发生后会稳定保持存取操作过后的状态。直到新的时钟信号和新的操作来改变上一次得到的稳定状态。
系统时钟SYSCLK是供STM32中绝大部分部件工作的时钟源。SYSCLK可由PLL、HSI或者HSE提供输出,并且它通过AHB分频器分频后送给各模块使用。其中AHB分频器输出的时钟送给5大模块使用:
Hclk为优秀的高性能总线(AHB bus peripherals)供给时钟信号(AHB为advanced high-performance bus)。Fclk(free running clock)为供给CPU内核的时钟信号,我们所说的cpu主频为XXXXMHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期。Pclk为优秀的高性能外设总线(APBbus peripherals)供给时钟信号(其中APB为advanced peripherals bus)。
编写一个流水灯程序的流程为:
时钟初始化是指配置“系统时钟SYSCLK频率”、“HCLK,PCLK时钟的分频值”。
如果工程中只添加了“启动文件”,添加到工程中的“启动文件”会调用”SystemInit()”及”main()”两个函数。那么我们就需要自己编码实现一个“系统文件”中”SystemInit()”功能的函数,且函数名需要为”SystemInit()”(不修改启动文件的话)。”SystemInit()”函数完成一些系统初始化的操作,其中就包含“时钟的初始化”,它被编写在“系统文件” ” system_stm32f10x.c“中。如果用户要自定义实现,按照功能根据参考手册配置时钟相关寄存器即可实现这些功能。
如果工程中连“启动文件”都没有添加,那么我们就需要自己编码实现“启动文件”和“系统文件”的功能。
如果在工程中添加了“启动文件”和“系统文件”,那么我们只要使能各模块时钟后就可以使用对应的时钟了。
//LED Init void LedInit(void) { //使能PORTE时钟 RCC->APB2ENR = 1 << 6;
//PORTE0~7清0 /设置PORTE[0…2]为输出、最大为10MHZ、通用推免模式 //PORTE[0..7]清0后将PORTE[0…2]拉高,不让灯亮 GPIOE->CRL &= 0x00000000; GPIOE->CRL |= 0x000001 | 0x00000010 | 0x00000100; GPIOE->BSRR &= 0x00000000;// GPIOE->ODR &= 0x00000000; GPIOE->BSRR |= 1 | (1 << 1) | (1 <<2);//GPIOE->ODR |= 1 | (1 << 1)| (1 << 2); } |
//LED blink void LedBlink(void) { //PORTE[0..2]拉低,led[1..3]亮 GPIOE->BSRR |= (1 << 16) | (1 << 17) | (1<< 18); //GPIOE->ODR &= 0 | (0 << 1) | (0 << 2); Delay(0x3FFFFF);
////PORTE[0..2]灭 GPIOE->BSRR |= 1 | (1 << 1) | (1 << 2); //GPIOE->ODR |= 1 | (1 << 1) | (1 << 2); Delay(0x3FFFFF); } |
使Led亮和灭的语句可以被替换为注释的语句,其中Delay()延迟函数为:
//Delay void Delay(__IO uint32_t nCount) { while(nCount--) { } } |
#include <stm32f10x.h> #include <stdio.h>
//函数声明 void Delay(__IO uint32_t nCount); void LedBlink(void); void LedInit(void);
int main(void) { LedInit(); while(1){ LedBlink(); } } |
<stm32f10x.h>为stm32f10xxx系列芯片的头文件,其中定义了时钟、寄存器指针等类型。
以上程序在吕师兄以STM32F103VC为微控芯片之上的板子的运行结果如下:
Figure2:闪烁的led灯
Practical Note Over.