| 在配置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)位,这种情况下不会触发定时中断 |
| 欢迎光临 迅维网 (https://www.chinafix.com/) | Powered by Discuz! X3.4 |