您的位置:首页 > 其它

用定时器实现流水灯

2015-09-06 20:48 162 查看
#include <stm32f4xx.h>

#define GPIO_Pin_6 0x0040 /* LED2 */

#define GPIO_Pin_7
0x0080 /* LED1 */

#define PLL_M
8

#define PLL_N
336

#define PLL_P
2

#define PLL_Q
7

void RCC_config(void);

void TIMER_config(void);

void GPIO_Config(void);

void Delay_ms(int nCount);

int main()

{

RCC_config();

TIMER_config();

GPIO_Config();

while(1)

{

// Pin_7灭,Pin_6亮

GPIOF->ODR
&= ~GPIO_Pin_6;

GPIOF->ODR
|= GPIO_Pin_7;

Delay_ms(1000);

// Pin_6灭,Pin_7亮

GPIOF->BSRRL
|= GPIO_Pin_6;

GPIOF->BSRRH
|= GPIO_Pin_7;

Delay_ms(1000);

}

}

void RCC_config(void)

{

// -------------------- 配置HSE时钟 --------------------

// 配置PLL预分频

RCC->PLLCFGR= 0x00000000; // 将该寄存器默认值初始化为零

RCC->PLLCFGR|= PLL_M;

RCC->PLLCFGR|= PLL_N<<6;

RCC->PLLCFGR|= (PLL_P/2-1)<<16;

RCC->PLLCFGR|= PLL_Q<<24;

// 打开HSE晶振

SET_BIT(RCC->CR, RCC_CR_HSEON);

// 等待HSE晶振进入稳定状态

while(!(RCC->CR&RCC_CR_HSERDY)){

;

}

// 配置AHB预分频

SET_BIT(RCC->CFGR, RCC_CFGR_HPRE_DIV1);

// 配置APB1预分频,得到84M的时钟频率

SET_BIT(RCC->CFGR, RCC_CFGR_PPRE1_DIV4);

// 配置APB2预分频

SET_BIT(RCC->CFGR, RCC_CFGR_PPRE2_DIV2);

// 将HSE作为PLLCLK的输入

SET_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC_HSE);

// 使能PLLCLK

SET_BIT(RCC->CR, RCC_CR_PLLON);

// 等待PLLCLK稳定

while(!(RCC->CR&RCC_CR_PLLRDY)){

;

}

// 正确设置FLASH延迟时间

FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;

// 检查设置是否成功

if((FLASH->ACR & FLASH_ACR_LATENCY) != FLASH_ACR_LATENCY_5WS){

;

}

// 将PLLCLK作为SYSCLK,关闭HSI

SET_BIT(RCC->CFGR, RCC_CFGR_SW_PLL);

CLEAR_BIT(RCC->CR, RCC_CR_HSION);

// 等待设置成功

while((RCC->CFGR & RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL){

;

}

}

void TIMER_config(void)

{

// -------------------- 配置定时器 --------------------

// 打开TIM4时钟

RCC->APB1ENR|= RCC_APB1ENR_TIM4EN;

// 设置预分频值,对84M进行8400分频,得到10k的计数器时钟频率

TIM4->PSC= 8399;

// 设置自动重载值,定时器频率为1s

TIM4->ARR= 10000;

// 设置计数模式,向上计数

CLEAR_BIT(TIM4->CR1, TIM_CR1_DIR);

// 清空计数器的值

TIM4->CNT= 0;

// 中断使能

TIM4->DIER|= TIM_DIER_UIE;

// 自动重装载预装载使能

SET_BIT(TIM4->CR1, TIM_CR1_ARPE);

// 打开定时器4

SET_BIT(TIM4->CR1, TIM_CR1_CEN);

}

void NVIC_config(void)

{

// TIM4全局中断

NVIC->ISER[0]|= 1<<30;

}

void GPIO_config(void)

{

// -------------------- 配置GPIO --------------------

// 打开G端口的时钟

RCC->AHB1ENR|= RCC_AHB1ENR_GPIOGEN;

// 输出模式

GPIOG->MODER|= GPIO_MODER_MODER6_0;

GPIOG->MODER|= GPIO_MODER_MODER7_0;

// 有上拉电阻,开漏输出

GPIOG->OTYPER|= GPIO_OTYPER_OT_6;

GPIOG->OTYPER|= GPIO_OTYPER_OT_7;

// 中等速度

GPIOG->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR6_0;

GPIOG->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR7_0;

}

void Delay_ms(int nCount)

{

while(nCount){

// 等待定时器溢出

while(!(TIM4->SR&TIM_SR_UIF));

// 清除标志位

CLEAR_BIT(TIM4->SR, TIM_SR_UIF);

nCount--;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: