[持更]边工作边总结,记录日常遇到的一些坑

  1. 画板子先出原理图!!画板子先出原理图!!画板子先出原理图!!
  2. 调试的时候,暂停了之后时钟还是会跑,定时器的值还是会变。
  3. 掉电模式,进入掉电模式之前要把所有IO口的状态设好,不然浮空的脚或者没有处理好的脚会漏电。
  4. 现象:N76E003 进入掉电模式,仿真里面定时器还在运行,实际电路测试待机功耗有200多UA。
    解决方法:关闭ADCEN、BOD、POF寄存器,实测待机功耗减小。
  5. 三脚电感升压:中间抽头接mos漏极(通过MCU输出PWM控制MOS导通),线圈少的一头(与中间抽头两端电阻小的)接5v(供电脚),线圈多的一头接负载。
  6. 一般的快充 D+ D-是协议脚,如果短路可能就代表快充(具体看被充端怎么规定)。
  7. USB TYPE-C等金属外壳的座子,外壳一定要接地,不然插上负载可能会导致极性相反导致设备烧毁.
  8. N76E003如果要产生频率大于30K的PWM波,只能要么外部晶振提高时钟速度(麻烦),要么改用PWM中心对齐模式(最方便)
  9. 写程序的时候,比如按键处理,识别到按键之后要置标志位,然后清除一大堆的变量,最好把这段清除变量的程序抽象出来封装成函数,这样方便移植也方便后面编写程序。比如开机之后置完标志位就调用一次这个开机初始化的函数,在遥控开机的地方也只需要调用一次。同理还有关机初始化函数,在关机、自动关机、APP控制关机中,直接调用就好。
  10. 中微CMS8S6990TSOP20,在配置烧录器的时候,要把型号选择成CMS8S6990NTSOP20,不然烧录器无法识别到CMS8S6990TSSOP20的芯片。
  11. 中微烧录器在配置的时候,要长按“↑”按键,返回到初始菜单,电脑才能识别到烧录器设备。配置好之后长按“↓”按键,可以返回到子菜单选择不同烧录固件。
  12. 代码风格,判断某个动作成立之后,要置标志位,然后再到主程序或者低时效性程序段里执行相应的动作,比如按下按键要让某个mos管导通,不要直接在if成立的动作里让io电平改变,而要置一个标志位为1,到主循环或者中断里写一个重复500ms才执行的低时效性的程序段里再改变io的电平。区分好哪些动作需要高时效性,哪些动作不用高时效性。
  13. 配置烧录器烧录中微6990芯片的时候,要选6990NTS20选项,不然烧录不进去,并且选完记得还要调烧录选项,不然配置跟Keil中不一样。
  14. 充电类的项目,充电管理芯片的充电指示脚无论如何都要接进MCU里,纯靠电压判断电池是否充满误差太大。
  15. 九齐的MCU,仿真跟实际烧录出来功能不同,如果有ADC检测,然后根据检测值判定某状态这类,先检查一下ADC值是否正确。
  16. 九齐的Q-Link如果拿来当烧录器用的话,由于没有校频,烧录出来的程序会有定时器快慢不等的情况。
  17. 九齐NY8BE62D 如果不开启LVR的话,上电的一瞬间有可能让某些IO口输出随机电平。
  18. 辉芒微的FT61FC23,进入睡眠之后端口唤醒有几率唤不醒MCU,大坑!
  19. ADC采样,有条件还是做分压之后经过RC低通滤波器之后再送进MCU采样,不然电压一波动,采样值也跟着拨动。
  20. 带有触摸功能的芯片或者MCU,要用触摸的情况下,一定要走LDO单独供电,否则同一电源内的其他用电器的启停会对触摸造成严重的干扰。

很久没更了,2023.4.13来补充:

21.经过新唐官方论坛版主确认,新唐MS51官方库在关于时钟配置的地方有问题,如果使用的是外部晶振的话,库函数中:

void ClockEnable(unsigned char u8FsysMode)
{
  switch (u8FsysMode)
  {
    /***** HIRC enable part ******/
    case FSYS_HXT:
        clr_CKEN_EXTEN1;                        /*step1: Enable extnal 4~ 24MHz crystal clock source.*/
        set_CKEN_EXTEN0;
        while((CKSWT|CLR_BIT7)==CLR_BIT7);      /*step2: check clock source status and wait for ready*/  /*此处大坑*/
    break;
   
    /***** HIRC enable part ******/
    case FSYS_HIRC:
        set_CKEN_HIRCEN;                        //step1: Enable extnal clock source.
        while((CKSWT|CLR_BIT5)==CLR_BIT5);      //step2: check clock source status and wait for ready
    break;
   
    /***** LIRC enable part******/
    case FSYS_LIRC:
        set_CKEN_LIRCEN;                        //step1: Enable extnal clock source.
        while((CKSWT|CLR_BIT4)==CLR_BIT4);      //step2: check clock source status and wait for ready
    break;
    
    /***** ECLK P30 enable part ******/
    case FSYS_OSCIN_P30:
        set_CKEN_EXTEN1;                        //step1: Enable extnal clock source.
        set_CKEN_EXTEN0;
        while((CKSWT|CLR_BIT3)==CLR_BIT3);      //step2: check clock source status and wait for ready
    break;
    
    /***** ECLK P00 enable part ******/
    case FSYS_HXTIN_P00:
        set_CKEN_EXTEN1;                        //step1: Enable extnal clock source.
        clr_CKEN_EXTEN0;
        while((CKSWT|CLR_BIT6)==CLR_BIT6);      //step2: check clock source status and wait for ready
    break;
  }
}

官方资料是:

case FSYS_HXT:
        clr_CKEN_EXTEN1;                        /*step1: Enable extnal 4~ 24MHz crystal clock source.*/
        set_CKEN_EXTEN0;
        while(CKSWT|CLR_BIT7);      /*step2: check clock source status and wait for ready*/  /*此处大坑*/
    break;

那么如果用户使用的是外部晶振,在主函数中调用 FsysSelect(FSYS_HXT); 函数的话,程序就会一直卡在上面这个while循环里面,正确的写法应该为:while((CKSWT|CLR_BIT7)==CLR_BIT7);

或者使用最近版的官方库,下载地址:https://github.com/OpenNuvoton/MS51BSP_KEIL 亲测官方库已经修复这个问题

  1. KEIL编译报错:*** WARNING L5: CODE SPACE MEMORY OVERLAP。 出现原因:代码里面有重复的中断号,就是说中断服务函数写重了,检查代码里面是不是哪段中断服务函数在库里面的某个C文件里已经声明了,然后自己又在ISR.C里面又声明了一次。

你可能感兴趣的:(技术分享,单片机)