用STC8G1K08 16pin的单片机PCA输出PWM问题在线等
用STC8G1K08 16pin的单片机PCA输出PWM,用的是库函数的程序,代码量一大,就会出错!!! // static unsigned int TABLEAD_BUF;unsigned int timer_ms;
GPIO_config();
ADC_config();
//UART_config();
// Timer_config();
PCA_config();
PWMn_Update(2,30);
EA = 1;
PTCSET = 1;//¸øÈÈÃôµç×è²É¼¯¹©µç
这是初始化部分 /******************** PCAÅäÖÃ ********************/
void PCA_config(void)
{
PCA_InitTypeDef PCA_InitStructure;
PCA_InitStructure.PCA_Clock = PCA_Clock_1T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
PCA_InitStructure.PCA_IoUse = PCA_P12_P11_P10_P37; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //ENABLE, DISABLE
PCA_InitStructure.PCA_Priority = Priority_0; //Ö¸¶¨ÖжÏÓÅÏȼ¶(µÍµ½¸ß) Priority_0,Priority_1,Priority_2,Priority_3
PCA_InitStructure.PCA_RUN = DISABLE; //ENABLE, DISABLE
PCA_Init(PCA_Counter,&PCA_InitStructure); //ÉèÖù«ÓÃCounter
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit, PCA_PWM_10bit
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 65535; //¶ÔÓÚÈí¼þ¶¨Ê±, ΪƥÅä±È½ÏÖµ
PCA_Init(PCA2,&PCA_InitStructure);
}这是PCA配置 Program Size: data=112.3 xdata=256 code=5120 这是目前代码已经开始出错 PWMn_Update(2,30); 我设置的是初始化的时候一个固定的输出,结果额外出来很多的高电平输出 Nref = Get_ADCResult(15); //¶ÁÄÚ²¿»ù×¼µçѹ, ¶Á15ͨµÀ
//// delay();
TempOkFlg = OverTempString();//ζȹý¸ß¼ì²â
delay();
VccAdNum= Get_ADCResult(7);//¼ì²âµçÔ´µçѹ
VccAdNum = (u32)1190 * (u32)VccAdNum / Nref; //Ux = Vref * Nx / Nref. Vref = 1190mV(Uxµ¥Î»Îªmv£¬¼´µ±Ç°µçѹ)
if(VccAdNum>VOLTAGEMAX || VccAdNum<VOLTAGEMIN) VccErrorFlg=1;
//// delay();
// KeyFlg1 = key1();
//// delay();
// KeyFlg2 = key2();
//// delay();
////
OutAdNum= Get_ADCResult(12);//¼ì²âÊä³öµçѹ
OutAdNum = (u32)1190 * (u32)OutAdNum / Nref; //Ux = Vref * Nx / Nref. Vref = 1190mV(Uxµ¥Î»Îªmv£¬¼´µ±Ç°µçѹ)
if(OutOkFlg==1) { OutAdTime++; }else{OutAdTime=0;}
// if((OutAdTime>=5)&&(OutAdNum<500)){OutCurrentErrorFlg=1;}
if((OutAdTime>=5)&&((fun(VccAdNum,OutAdNum))>VCCOUTADMAX)) { OutCurrentErrorFlg=1; }
// sendusart1("D",OutAdTime);
程序通过基准电压检测AD,好像是屏蔽AD检测就好一些,不屏蔽就会出错 快来大神帮忙解答一下,愁死人!!! MCU的外设都是相互独立的,跟代码大小无关,只要中断忙得过来,内存没有溢出,堆栈没有溢出。 data的使用量控制在100以内,将一些变量定义到xdata中。 社区闲人 发表于 2023-3-10 18:59
data的使用量控制在100以内,将一些变量定义到xdata中。
非STC32G系列,data+idata在200以内一般不用担心堆栈溢出,data超过128个会报错,idata的变量定义,加idata即可。数组尽量放在xdata。