linux裸机编程学习过程中个人错误集合-IMX6ULL开发版】

  • main写成mian,编译出错
  • .h文件复制完后忘记更改头文件#ifndef后面的内容,导致头文件一直找不到
  • vscode错误更正完毕后还是找不到库函数参数,把库函数删掉,然后重新写一遍就正常了
  • 写led切换函数,led灯点不亮,是切换函数选择的问题,错误明显但是没发现
  • 弄清楚(GPIO1->DR)&(1<<18)((GPIO1->DR) >> 18) & 0x1的区别:
  • 以下是对这两个表达式的详细解释:
  1. (GPIO1->DR)&(1<<18)

    • 这部分表示对 GPIO1 的数据寄存器(DR)与 1 左移 18 位的值进行按位与操作。
    • 它的目的是检查 GPIO1->DR 的第 18 位是否为 1。
  2. ((GPIO1->DR) >> 18) & 0x1

    • 这部分先将 GPIO1->DR 右移 18 位,然后与 0x1(即二进制的 1)进行按位与操作。
    • 它的作用也是提取 GPIO1->DR 的第 18 位的值,但通过右移操作来实现。

总的来说,这两个表达式都是用于获取 GPIO1->DR 的第 18 位的值,但是其比较的结果不一样,第二种比较的结果只有1或者0,但是第一种比较的结果有0和一个不确定的正值

  • flag=~flag; 的结果是将 flag 的每一位取反,即 0 变成 1,1 变成 0。

  • flag=!flag; 的结果是将 flag 的逻辑值取反,即原来是 0 则变成 1,原来是 1 则变成 0。

  • 但需要注意的是,这两种操作的结果都是对 flag 的值进行修改,具体的结果取决于 flag 原来的值。

  • linux开发环境下bss清除段注释掉才能正常运行,没有进行四字节对齐,_bss_start的反汇编起始地址最后一位一定是能被4整除,例如可以是0x0,0x4,0x0,0x8,0x****c,唯独不可能是0x878000289

  • CCM_ANALOG->PFD_480=reg与上面的步匹配。写成:CCM_ANALOG->PFD_528=reg:错误的形式是:初始化PLL3的各路PFD0-PFD3的时钟时出现大问题,而且后序其他支路用到这条时钟线分支的也不起作用,卡死,SOC卡死,运行不正常;错误代码如下:\

  •   reg=CCM_ANALOG->PFD_480;
      reg &=~(0x3f3f3f3f);
      reg |=(19<<24);              /*初始化PLL3_PFD3=454.7MHz,利用公式的得到:*/
      reg |=(17<<16);              /*初始化PLL3_PFD2=508.2MHz,利用公式的得到:*/
      reg |=(16<<8);               /*初始化PLL3_PFD1=540MHz,利用公式的得到:*/
      reg |=(12<<0);               /*初始化PLL3_PFD0=720MHz,利用公式的得到:*/
      CCM_ANALOG->PFD_528=reg;     /*设置完毕*/设置错误:CCM_ANALOG->PFD_480=reg;
    
  •  reg= CCM->CBCDR;
     reg &= ~(7<<10);  //先清零,这里不能直接先 CCM->CBCDR &= ~(7<<10)清零,因为清零直接变成1分频,
     //超 过了132Mhz,直接死机
     reg |= (2<<10);   //在赋值3分频
     CCM->CBCDR=reg;
     while((CCM->CDHIPR >> 1) & (0x1));/*等待握手信号*/
    
  • 中断初始化错误在这里插入图片描述

  • 配置LCD错误-白屏但是不能正确显示内容,而且反复变色:错误原因是没有正确选择时钟的来源,也就是时钟选择器配置错误,错误如下:

  •   /*这里的目的是把bit17-15变为011,
     但是我只把最高位清零,把中间的置1,没有管bit15
     但是bit15如果原来是1的话,就不能选择正确的时钟*/
      CCM->CSCDR2  &= ~(1<<17);
      CCM->CSCDR2  |= (2<<15);   /*四路时钟选择器*/ 
    
  • 错误重复定义,如果在一个源文件中引用头文件引用了两次,如果出现外部引用和结构体变量,就会出现重复定义,这种错误很隐蔽:错误如下:如果更正后错误依然存在,则可以重启电脑进行试试;
    在这里插入图片描述

  • warning: left shift count >= width of type seconds = ((uint64_t)(SNVS->LPSRTCMR<<32))|(SNVS->LPSRTCLR);出现这种错误指左移超过了这个数的本身长度,这个数是32位的,但是左移32位显然不正确,解决的办法是加上强制类型转换,转换成64位的数;

  • 在这里插入图片描述

  • 注意在单片机中计数器计数一次是外部晶体每次的时钟+1,而不是对应的一秒+1,这个在配置RTC时钟时进行秒数转换有大坑,比如读取秒数时要把秒数除以32K也就是左移17位;

  • 在写IIC通信时,标志位的清除使用错误的寄存器I2CR,而表示标志位的寄存器是:I2SR,也就是清除错误:

  • 在这里插入图片描述

  • 错误:文件能跳转,显示报错未定义,是因为makfile文件中只包含了 源文件的目录,没有包含头文件的目录,错误如下:在这里插入图片描述

  • 在这里插入图片描述

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值