初级会员

- 积分
- 68
- 金钱
- 68
- 注册时间
- 2014-10-30
- 在线时间
- 1 小时
|
5金钱
http://www.openedv.com/posts/list/0/38508.htm 通过战舰开发板演奏音乐实验中,我将main.c里面sound函数由
void sound(u16 k)
{
u16 x;
x=music_data[k][0]; //读取音阶数据
if(x!=0)
{
x=4000000/x; //计算计数值
TIM4->ARR = x; //计数值写入重装载寄存器
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X0000000B; //PB.8复用推挽输出
TIM_Cmd(TIM4, ENABLE); //开声音
}
else
{
TIM_Cmd(TIM4, DISABLE); //关声音disenable
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000003; //PB.8推挽输出
  Bout(8)=0; ////停止时蜂鸣器管脚低电平
}
}
改为了
void sound(u16 k)
{
extern TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
u16 x;
x=music_data[k][0];
if(x!=0)
{
x=4000000/x;
TIM_TimeBaseStructure.TIM_Period = x;
TIM_TimeBaseStructure.TIM_Prescaler =9;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_Cmd(TIM4, ENABLE);
}
else
{
TIM_Cmd(TIM4, DISABLE);
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000003;
PBout(8)=0;
}
}
所改部分如上面橙色部分所示,但是改了以后程序就出问题了,能不能请各位大神解释解释这是为什么,谢谢!
|
最佳答案
查看完整内容[请看2#楼]
说明定时器被你配置乱了。
找问题要学会仿真找问题。
先用好的,软件仿真,断点设置在:
TIM_Cmd(TIM4, ENABLE); //开声音
之后,看看TIM4寄存器的配置状态,截图,保存起来。
然后再用你自己改过的,同样断点设置在这个位置。
再看此时的TIM4寄存器状态,然后和你之前的截图对比,看看哪里不一样,问题就找到了。
然后就好好去分析初始化流程。
所以,好学会找问题的办法,胜过提1w个问题。
|