STM32之无源蜂鸣器

寄存器操作, 清晰简单. 

已验证方案. 

STM32之无源蜂鸣器_第1张图片

 

图中L7在实际使用中我用0R电阻代替了,作用单点接地, 对磁珠的作用不太明白

头文件中移植时修改的代码 :


// 移植配置区 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 控制线: TIM4_CH4_PB9
#define BEEP_GPIOx           GPIOB                   // GPIO端口          
#define BEEP_GPIO_PINx       PIN9                    // PINx, 注意:PIN9= 0x1<< 9; 而不是9 
#define BEEP_TIM_AFx         2                       // 复用功能编号, F429的DataSheet第180页

#define BEEP_TIMx            TIM4                    // TIM4外设端口                   
#define BEEP_TIM_CHx         4                       // 通道编号
#define BEEP_TIM_CCRx        CCR4                    // 比较器编号
#define BEEP_TIM_CLOCK_CMD   RCC->APB1ENR |= 1<< 2   // 使能时钟命令
// END 移植 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


void vBeep_Init(void);
void vBeep(u16 ms);  
void vBeep_Warn(u8 i);

c文件代码, 移植时主要修改头文件, 不用修改c了:

void vBeep_Init(void)
{
    vSys_GPIOSet (BEEP_GPIOx ,BEEP_GPIO_PINx ,2,0,2,2,BEEP_TIM_AFx);    // GPIO初始化
    
    BEEP_TIM_CLOCK_CMD ;                // 使能TIM时钟            
    BEEP_TIMx -> PSC    = 900 - 1;      // 预分频值
    BEEP_TIMx -> ARR    = 25-1;         // 自动重载值       
    BEEP_TIMx -> BEEP_TIM_CCRx   = 15;  // 比较值     
    if(BEEP_TIM_CHx<3)
    {   
        BEEP_TIMx -> CCMR1 &= ~(0x3 << ((BEEP_TIM_CHx-1)*8));   // 清0   
        BEEP_TIMx -> CCMR1 |=   0x0 << ((BEEP_TIM_CHx-1)*8);    // 通道方向  输出        
        BEEP_TIMx -> CCMR1 |=   0x1 << ((BEEP_TIM_CHx-1)*8+3);  // 预装载    使能  
        BEEP_TIMx -> CCMR1 &= ~(0x7 << ((BEEP_TIM_CHx-1)*8+4)); // 预装载    使能  
        BEEP_TIMx -> CCMR1  =   0x6 << ((BEEP_TIM_CHx-1)*8+4);  // 模式  110:PWM1 
    }
    else
    {   
        BEEP_TIMx -> CCMR2 &= ~(0x3 << ((BEEP_TIM_CHx-3)*8));   // 清0   
        BEEP_TIMx -> CCMR2 |=   0x0 << ((BEEP_TIM_CHx-3)*8);    // 通道方向  输出        
        BEEP_TIMx -> CCMR2 |=   0x1 << ((BEEP_TIM_CHx-3)*8+3);  // 预装载    使能  
        BEEP_TIMx -> CCMR2 &= ~(0x7 << ((BEEP_TIM_CHx-3)*8+4)); // 预装载    使能  
        BEEP_TIMx -> CCMR2  =   0x6 << ((BEEP_TIM_CHx-3)*8+4);  // 模式  110:PWM1          
    }
        
    BEEP_TIMx -> CCER  |= 0x1 << (BEEP_TIM_CHx-1)*4;  // 使能  通道4            
    BEEP_TIMx -> CR1   |= 0x1 << 7;                   // 预装载    使能   
    
    p("Beep        配置完成!\n" );
}   


void vBeep(u16 ms)
{
    BEEP_TIMx ->CR1 |= 0x1 << 0;
    vDelay_ms (ms);
    BEEP_TIMx ->CR1 &=~(0x1<<0);  
    //p("Beep End\n");    
}


void vBeep_Warn(u8 u)
{
    if(u>0)
        BEEP_TIMx->CR1 |= 0x1 << 0;  
    else
        BEEP_TIMx->CR1 &=~(0x1<<0);       
}

 

你可能感兴趣的:(硬件)