我 用的 Keil编译器 芯片STM32F103RE, 遇见一个非常奇怪的问题:
定义函数
void PWM_Config( u32 chn, const u32 freq, const float pul, const u16 cntmode, bool en);
//chn: 通道 1~4 freq : 输出频率 pul 占空比 cntmode: 计数模式, en:使能
现象: 函数参数 freq 传递不进去, 执行到这步,就死机了 。如果把 freq 在函数体内 换成 具体数值 就 正常了。
请问诸位高人是什么原因呢? 是否编译器问题?
主函数调用如下:
TIM8-> WM_Config( 1, 50000, 0.2, TIMType::Up, true) ;
函数实现如下 :
void TIMType:  WM_Config( u32 chn, const u32 freq, const float pul, const u16 cntmode, bool en)
{
u32 clk=0;
if ((this == (TIMType*)TIM1_BASE) || (this == (TIMType*)TIM8_BASE))
clk = TIM1Clock ;
else
clk = TIMXClock ;
chn = chn - 1;
//u32 t = clk/freq; //有问题 ,死机
u32 t = clk/50000; //没问题 波形输出都正常
u16 psc = (u16)( t>>16 );
u16 arr = t /(psc+1) -1 ;
PSC = psc ;
ARR = arr ;
u16 ccr =
(u16)((float)arr * pul) ;
switch(chn)
{
case 0: CCR1 =ccr; CCMR1 = CCMR1 & 0xff00 | (6<<4) |(1<<3) ; break;
case 1: CCR2 =ccr; CCMR1 = CCMR1 & 0x00ff | (6<<12)|(1<<11); break;
case 2: CCR3 =ccr; CCMR2 = CCMR2 & 0xff00 | (6<<4) |(1<<3) ; break;
case 3: CCR4 =ccr; CCMR2 = CCMR2 & 0x00ff | (6<<12)|(1<<11); break;
}
CR1 = CR1 & 0x08F | cntmode | (1<<7) ;
CCMR1 = CCMR1 & 0xff00 | (7<<4) |(1<<3) ;
CCER |= 0x1 << (chn<<2) ;
PWMEnable(en);
Enable(en);
}
注: 软件仿真是正常的 值算的都对
但是下到单片机(--用的 是 IAP )里面就死机了……………………
|