用定时器实现流水灯
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--;
}
}
#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--;
}
}
相关文章推荐
- uva 10603(Fill, 隐式图搜索问题)
- 趣味C++
- 理解虚函数表
- 用C语言实现多态
- 工厂模式
- java设计原则
- 趣味C++
- 磁盘管理及文件系统管理
- 黑马程序员之反射
- 关于CSS浮动与绝对定位的个人感悟,看完这篇文章能得到很多相关问题的解释
- Django开发教程 第一节 HelloWorld
- 基类私有虚函数可被派生类重写
- Testlink软件测试项目管理之流程图与权限划分
- 61条面向对象设计的经验原则
- Linux 磁盘管理命令fdisk.df.du.mount等的介绍
- bash 环境变量
- STL—利用pair和vector对有序对类型排序
- HashMap&HashTable
- zoj 2091 Mean of Subsequence(奇怪的贪心)
- Google Accounts,OpenID,OAuth