1 功能要求
利用SysTick中断使LED每秒闪烁一次
LED的连接关系不变,与第一个工程一样
2 程序实现
1 算法描述
为了通过系统时钟使LED(D2)每隔一秒闪烁一次,必须要做如下工作。
在stm3210x_it.h中说明一个全局变量,内容如下表示
/*Exported type ---------------*/
extern_IO unit32_t TimingDelay;
在mian.c中的定义以下函数和一个全局变量。
//SysTick 初始化
void Init_SysTick(void)
{
if(SysTick_Config(SystemCoreClock/1000)) //1毫秒的时基
while(1);
}
//延时函数
_IO unit32_t TimingDelay; //定义全局变量
void delay_ms(_IO unit32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0)
}
在此使用到的SysTick_Config()函数是在库里有的,可参阅v350库帮助系统。它主要集成了优先级、复数计位器、时钟源、时基设置、使能中断、启动计时等等。
main.c 的主要内容如下:
void SystemInit() //使用工程模板时该步骤可省略
{
unsigned char temp = 0;
RCC_Delnit();
RCC->CR|=0x00010000;
while(!(RCC->CR>>17))
{
RCC->CFGR=0x00000400;
PLL -= 2;
RCC->CFGR|=PLL<<18;
RCC->CFGR|=1<<16;
FLASH->ACR|=0x32;
RCC->CR|=0x1000000;
while(!(RCC->CR>>25));
RCC->CFGR|= 0x00000002;
while(temp!=0x02)
{
temp RCC->CFGR>>2;
temp&=0x03;
}
}
}
//基于stm32f103最小系统板
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2periphClockCmd(RCC_APB2Periph_GPIOC_ENABLE); //使能pc端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_PIn_8; //选择对应的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC端口
GPIO_SetBits(GPIOC,GPIO_Pin_8); //关闭LED
}
//SysTick 初始化--1ms中断的定时参数
void Init_SysTick(void)
{
if(SysTick_Config(SystemCoreClock/1000))
while(1);
//NVIC_SetPriority(SysTick_IRQn,3);
}
//延时函数
//SysTick的时钟源为72M,SystemCoreClock = 72000000Hz
_IO unit32_t TimingDelay; //定义全局变量
void delay_ms(_IO unit32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0)
}
//主函数
int main(void)
{
//配置系统时钟为 72MHz,可省略,在V3.50中就是72MHz
SystemInit(); //可省略该步骤
LED_GPIO_Config(); //LED端口初始化
Init_sysTick(); //配置时基为1ms
while(1)
{
GPIO_SetBits(GPIOC,GPIO_Pin_8); //设置该口为 1 高电平 灯灭
delay_ms(1000); //延时1 s
GPIO_RestBits(GPIOC,GPIO_Pin_8); //设置该口为 0 低电平 灯亮
delay_ms(1000); //延时1s
}
}