- 积分
- 3553
- 下载分
- 分
- 威望
- 点
- 原创币
- 点
- 下载
- 次
- 上传
- 次
- 注册时间
- 2014-11-13
- 精华
|
马上注册,获取阅读精华内容及下载权限
您需要 登录 才可以下载或查看,没有帐号?注册
x
在配置STM32外设的时候,任何时候都要先使能该外设的时钟!
第一个例程,首先,考虑一个延时程序,要实现这一功能,共四步步骤(实际使用中两步就够了,第一步任何例程都必须做,):
Stm32_Clock_Init(9); //系统时钟设置,系统时钟设置为9倍频,即8Mhz*9=72Mhz
delay_init(72); //延时初始化,按总线时钟72Mhz延时
//LED_Init(); //初始化与LED连接的硬件接口,这个不算第三步,使用它以便演示流水灯
delay_ms(300);
第一步,看第一个程序:
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
MYRCC_DeInit(); //复位并配置向量表
RCC->CR|=0x00010000; //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18; //设置PLL值 2~16
RCC->CFGR|=1<<16; //PLLSRC ON
FLASH->ACR|=0x32; //FLASH 2个延时周期
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
第二步,延时功能初始化,看第二个程序
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
第三部,调用延时程序:
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达,先将
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
------------------------------------
不得不说,《21天学通ARM嵌入式开发》是一本不折不扣的烂书,只是把官方手册照搬上去,再把库函数加些注释就变成一本书了,谁买谁上当,视频教程也没什么技术含量可言,千万不要买这本书。
STM32的定时器功能比单片机复杂,切不可照搬,首先给出一些基本定义:
ARR:auto reload register:自动重载寄存器,ARR也有定时器重载值的含义,STM32中的定时器是自动重载的,(不像单片机中的定时器有自动重载模式和手动软件重载模式,而且手动重载用得较多);
TIMx_CR:定时器控制寄存器;
更新事件:更新不等于触发中断,更新是指计数器上溢或下溢时,内部产生一个更新信号,根据此时相关寄存器的设置执行一些相应操作,比如重载ARR,具体在下文中会介绍。
触发事件:主要用于信号计数,可以使内部信号(定时器的输出也可以作为触发信号),也可以是外部引脚信号
接下来关注下面寄存器TIMx_CR中的两个位
ARPE:自动重装载预装载允许位
TIMx_CR中的UDIS:update disable 禁止更新
ARPE为0时,若改变ARR值,影子寄存器中的值立即被改变;ARPE=1时,影子寄存器中的值将等到计数值到达上一次设定的溢出值(即发生更新事件后)时,才会装载被修改过的ARR值;
UDIS:禁止更新,1有效
产生更新事件的条件:
①当计数器上溢或下溢时,并触发中断;
②当循环计数器计数值为0时(仅适用于TIM1),触发中断;
③通过软件设置UG(Update Generation)位,这种情况下不会触发定时中断 |
|
|