寄存器操作, 清晰简单.
已验证方案.
图中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);
}