//以下是core_m3.h中的SysTick_Config函数。
/**
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register 重装载值寄存器LOAD*
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts /
SysTick->VAL = 0; / Load the SysTick Counter Value /
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; / Enable SysTick IRQ and SysTick Timer /
return (0); / Function successful */
}
//以下是msic.c中的SysTick_CLKSourceConfig函数。对时钟频率进行配置的。AHB 或者AHB/8
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
//以下是中断配置代码。
#include “stm32f10x.h”
// 函数声明
void RCC_Configuration(void);
void GPIO_Configuration(void);
void SYSTICK_Configuration(void);
int main(void)
{
RCC_Configuration(); //RCC初始化
GPIO_Configuration(); //GPIO配置
SYSTICK_Configuration(); //systick初始化配置
while (1);
return 0;
}
void RCC_Configuration(void)
{
//因为起始代码中已经调用了SystemInit函数将时钟主频设置为72M了。所以我们在这里RCC直接使用就OK了。
//systick是属于CPU部分的(ARM搞的),时钟时钟是打开的,不必要再去打开了。
//这里打开自己需要(这里使用普中科技的ARM3.0开发板进行LED灯的闪烁实验)的GPIO即可。
/* Enable Key Button GPIO Port, GPIO_LED and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
//GPIO的配置。常规操作。
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// PB14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
}
void SYSTICK_Configuration(void)
{
// 配置1s钟
//ticks = 72000000/8 * 1 = 90000000
SysTick_Config(9000000); // <16777216
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}
//stm32f10x_it.c中SysTick_Handler函数中扔LED取反即可。
void SysTick_Handler(void)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_14, !(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14)));
// 按理说需要清中断,但是systick不需要,他是自动清除的。
}
//这样看是不是很简单喔。中断方式就是在配置RCC 、GPIO、还用就是systick (SysTick_Config(ticks); // <16777216
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);这两个函数的调用)就搞定啦
//《《《《《《《《————————查询方式——————————》》》》》》》
//RCC、GPIO的配置基本一样,不用动。
#include “stm32f10x.h”
// 函数声明
void RCC_Configuration(void);
void GPIO_Configuration(void);
void delay_ms(unsigned int ms);
#define DELAY 40
int main(void)
{
RCC_Configuration(); //系统时钟配置
GPIO_Configuration(); //GPIO配置
while (1)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET); // 灯亮
delay_ms(DELAY);
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET); // 灯灭
delay_ms(DELAY);
}
return 0;
}
void RCC_Configuration(void)
{
//因为起始代码中已经调用了SystemInit函数将时钟主频设置为72M了。所以我们在这里RCC直接使用就OK了。
//systick是属于CPU部分的(ARM搞的),时钟时钟是打开的,不必要再去打开了。
//这里打开自己需要(这里使用普中科技的ARM3.0开发板进行LED灯的闪烁实验)的GPIO即可。
/* Enable Key Button GPIO Port, GPIO_LED and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// PB8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
}
//利用systick计数器帮我们实现 ms级别的延时
//要注意两点:1主频72M 2 ms<1864
void delay_ms(unsigned int ms)
{
unsigned int tmp = 0;
******// 首先进行systick的时钟设置,再就是给一个正确的ticks
// 下边就是使能systick. while()循环等待时间到******
SysTick->LOAD = ms * 9000; // 72MHzÖ÷Ƶ£¬9MHz systickʱÖÓ
SysTick->VAL = 0;
SysTick->CTRL = 0x01; // 使能systick,禁止中断,时钟频率AHB/8
do
{
tmp = SysTick->CTRL;
}while (!(tmp & (1<<16)));
// 跳出while循环说明定时时间到了。接下来就是关闭定时器
SysTick->VAL = 0;
SysTick->CTRL = 0x00;
}
*## 查询方式与中断方式很像。RCC GPIO的配置。不一样的地方就是:systick配置上。也是关键的地方。查询方式直接是对寄存器的操作。而没有使用库函数。对寄存器配置,一直检查 SysTick->CTRL是否变1.