历史上的今天
今天是:2025年04月22日(星期二)
2020年04月22日 | STM32学习笔记七——LED闪烁的三种控制方法
2020-04-22 来源:eefocus
法一:软件延时(不精准)
void delay_nms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--);
}
}
方法二:
main.c
#include "stm32f10x.h"
__IO uint32_t TimingDelay;
/******************
*函数名称: LED_GPIO_Config()
*功 能:实现LED等GPIO的配置
*参 数:无
*返 回 值:无
*作 者:Katter
******************/
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
/******************
*函数名称: Init_SysTick(void)
*功 能:1ms中断的定时参数
*参 数:无
*返 回 值:无
*作 者:Katter
******************/
void Init_SysTick(void)
{
if(SysTick_Config(SystemCoreClock/1000))
{
while(1); //SysTick_Config等待配置成功
}
}
/******************
*函数名称: delay_ms()
*功 能:delay_ms(__IO uint32_t nTime)
*参 数:有
*返 回 值:无
*作 者:Katter
******************/
void delay_ms(__IO uint32_t nTime)
{
TimingDelay =nTime;
while(TimingDelay!=0);
}
int main(void)
{
SystemInit();
LED_GPIO_Config();
Init_SysTick();
while(1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
delay_ms(1000);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
delay_ms(1000);
}
}
中断函数
void SysTick_Handler(void)
{
if(TimingDelay!=0x00)
{
TimingDelay--;
}
}
思路分析:
Init_SysTick(void)函数是重点。SysTick—系统定时器是属于 CM3 内核中的一个外
设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次
的时间为 1/SYSCLK,一般我们设置 系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的
值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复 也就是相当于只要我们配
置了寄存器中的递减起始值,就可以控制中断的时间。72M的时钟,要1ms产生一次中断,测
起始的值为X/72M=1ms=72K,因此在函数的参数中赋值为SystemCoreClock/1000 这样就将
递减的起始值设置成了72K,可以过1ms产生一次中断,在中断中计数1000次,就可以达到1s
的延时。
方案三:定时器中断
u16 i;
/*******************
*函数名称: LED_GPIO_Config()
*功 能:实现LED等GPIO的配置
*参 数:无
*返 回 值:无
*作 者:Katter
********************/
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
// GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
/*******************
*函数名称:RCC_Configuare()
*功 能:实现复位和系统时钟的控制
*参 数:无
*返 回 值:无
*作 者:Katter
********************/
void RCC_Configuare(void)
{
SystemInit();
RCC_ClockSecuritySystemCmd(ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
}
/*******************
*函数名称: NVIC_Configuare(void)
*功 能:设置中断管理
*参 数:无
*返 回 值:无
*作 者:Katter
********************/
void NVIC_Configuare(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*******************
*函数名称: TIM3_Configuare(void)
*功 能:初始化TIM3 1ms 定时
*参 数:无
*返 回 值:无
*作 者:Katter
********************/
void TIM3_Configuare(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period=10-1;
TIM_TimeBaseStructure.TIM_Prescaler=(7200-1);
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);
TIM_Cmd(TIM3,ENABLE);
}
int main()
{
RCC_Configuare();
LED_GPIO_Config();
NVIC_Configuare();
TIM3_Configuare();
// GPIO_ResetBits(GPIOA,GPIO_Pin_8);
while(1);
// return 0;
}
思路分析:定时器产生1s的中断,在中断中对LED实现开通和关闭。
史海拾趣
|
选择使用DC/DC模块电源除了最基本的电压转换功能外,还有以下几个方面需要考虑: 1.0额定功率 一般建议实际使用功率是模块电源额定功率的30~80%为宜,这个功率范围内模块电源各方面性能发挥都比较充分而且稳定可靠。负载太轻造成资源浪费 ...… 查看全部问答> |
|
十天学会 51视频教程 免费下载 地址:http://www.verycd.com/groups/mcu/392145.topic#post2203424… 查看全部问答> |
|
“万用表”是万用电表的简称,它是我们电子制作中一个必不可少的工具。用途多,量程广,使用方便是万用表的优点。万用表能测量电流、电压、电阻、有的还可以测量三极管的放大倍数,频率、电容值、逻辑电位、分贝值等。万用表有很多种,现在最流行的 ...… 查看全部问答> |
|
在AT4DB021B的Datasheet中说的Inactive Clock Polarity Low or Inactive Clock Polarity High 是个什么模式,和SPI Mode 0 or SPI Mode 3有什么区别, 在这两种模式下的opcode都不一样,比如读register的前者模式下是0x57,在后者模式下是0xD7,我 ...… 查看全部问答> |
|
最近要在EP9315的芯片上做win ce的驱动,但是我没有win ce的开发经验,请问如何下手学习啊?有哪些win ce开发较好的入门级的书,请牛人给推荐一下。 能否说的细致一些,比如如何搭建开发环境,在没有硬件的情况下如何模拟开发(驱动程序)。 摆脱 ...… 查看全部问答> |
|
一、恒压充电 恒压充电是指每只单格UPS电源蓄电池均以一恒定电压(一般取单格电池数乘以2.5v)进行充电。特点是:初始充电电流相当大,UPS蓄电池电动势和电解液体相对密度上升较快,随着充电的延续,充电电流逐渐减小,在充电终期只有很小的电流通 ...… 查看全部问答> |
|
刚买的2407DSK与仿真器,有几点不明:CCS不知应该装哪个,应该如何设置,感觉装上后的有点错误。USB仿真器连上了,例程下不进去,修改了CMD文件后有一些能下,但似乎跑不了,断点也不能用。… 查看全部问答> |




