呼吸灯的实现
来源:互联网 发布:歼20真实战力知乎 编辑:程序博客网 时间:2024/04/28 20:30
int BreathFlag;
int BreathAdd;
#define GPIO_Pin_6 0x0040 /* LED1 */
#define GPIO_Pin_7 0x0080 /* LED2 */
#define PLL_M 8
#define PLL_N 336
#define PLL_P 2
#define PLL_Q 7
#define GPIO_AFRL6_AF3 ((uint32_t)0x03000000)
#define TIM_CCMR1_OC1M_3 ((uint32_t)0x0060)
void RCC_config(void);
void TIMER_config(void);
void NVIC_config(void);
void GPIO_config(void);
{
RCC_config();
GPIO_config();
TIMER_config();
NVIC_config();
while(1)
{
;
}
}
// 中断函数
void TIM1_UP_TIM10_IRQHandler(void)
{
// 中断判断
if((TIM10->SR&TIM_SR_UIF)){
// 清除标志位
CLEAR_BIT(TIM10->SR, TIM_SR_UIF);
if(BreathAdd == 1000){
BreathFlag = 1;
}
if(BreathAdd == 0){
BreathFlag = 0;
}
if(BreathFlag){
BreathAdd--;
}else{
BreathAdd++;
}
// 设置CCR1值,即改变占空比
TIM10->CCR1 = BreathAdd;
}
}
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)
{
// -------------------- 配置定时器 --------------------
// 打开TIM10时钟
RCC->APB2ENR |= RCC_APB2ENR_TIM10EN;
// 设置预分频值,对84M进行84分频,得到1M的计数器时钟频率
TIM10->PSC = 83;
// 设置自动重载值,定时器周期为1ms
TIM10->ARR = 1000;
// 设置计数模式,向上计数
CLEAR_BIT(TIM10->CR1, TIM_CR1_DIR);
// 设置时钟分割
TIM10->CR1 |= TIM_CR1_CKD_0;
// 清空计数器的值
TIM10->CNT = 0;
// 重新初始化计数器,生成更新事件
TIM10->EGR |= TIM_EGR_UG;
// 将CC1配置成PWM模式1
TIM10->CCMR1 |= TIM_CCMR1_OC1M_3;
// PWM波低电平有效
TIM10->CCER |= TIM_CCER_CC1P;
// CC1输出使能
TIM10->CCER |= TIM_CCER_CC1E;
// CC1的初始占空比为100%
TIM10->CCR1 = 1000;
// 中断使能
TIM10->DIER |= TIM_DIER_UIE;
// 自动重装载预装载使能(将TIM10_ARR的预设值导入)
TIM10->CR1 |= TIM_CR1_ARPE;
// 打开定时器10
TIM10->CR1 |= TIM_CR1_CEN;
}
void NVIC_config(void)
{
// TIM10全局中断
NVIC->ISER[0] |= 1<<25;
}
void GPIO_config(void)
{
// -------------------- 配置GPIO --------------------
// 打开G端口的时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN;
// Pin_7为输出模式,Pin_6为复用功能模式
GPIOF->MODER |= GPIO_MODER_MODER6_1;
GPIOF->MODER |= GPIO_MODER_MODER7_0;
// 有上拉电阻,开漏输出
GPIOF->OTYPER |= GPIO_OTYPER_OT_6;
GPIOF->OTYPER |= GPIO_OTYPER_OT_7;
// 中等速度
GPIOF->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR6_0;
GPIOF->OSPEEDR|= GPIO_OSPEEDER_OSPEEDR7_0;
// 不拉高不拉低
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR6;
GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR7;
// 复用功能选择
GPIOF->AFR[0] |= GPIO_AFRL6_AF3;
}
- 呼吸灯的实现
- 呼吸灯按钮的实现
- Qt实用技巧:会呼吸的痛(呼吸点/呼吸灯)
- Qt实用技巧:会呼吸的痛(呼吸点/呼吸灯)
- verilog PWM实现呼吸灯
- timer实现的呼吸灯效果——初步
- 基于PWM的呼吸灯
- 通过ValueAnimator实现呼吸灯效果
- Android呼吸灯效果两种实现
- 安卓 呼吸灯效果--代码实现
- 呼吸灯
- 呼吸灯
- 呼吸灯
- 呼吸灯
- 通过矩阵键盘,用PWM来实现呼吸灯的效果
- msp430g2553单片机 感应温度的呼吸灯
- 基于STM32最简单的呼吸灯
- 基于stm32的pwm呼吸灯
- Cocos2d-js 开发记录:自定义按钮
- shell 输入输出
- UIDatePicker
- WITH 子句
- 单例模式的多线程安全
- 呼吸灯的实现
- UIImagePickerController
- hdu2089(数位dp)
- 通过键盘上下箭头来移动网页中相邻的两个input
- UIImageView属性
- Cocos2d-js 开发记录:Loading载入界面自定义
- 关于数组排序的性能问题
- cocos2d js 版斗地主,和网狐的pc端斗地主通信,能玩
- UILabel属性