- 把
main
写成mian
,编译出错 .h
文件复制完后忘记更改头文件#ifndef
后面的内容,导致头文件一直找不到vscode错误更正完毕后
还是找不到库函数参数,把库函数删掉,然后重新写一遍就正常了- 写led切换函数,led灯点不亮,是切换函数选择的问题,
错误明显但是没发现
- 弄清楚
(GPIO1->DR)&(1<<18)
和((GPIO1->DR) >> 18) & 0x1
的区别: - 以下是对这两个表达式的详细解释:
-
(GPIO1->DR)&(1<<18)
:- 这部分表示对
GPIO1
的数据寄存器(DR
)与1
左移 18 位的值进行按位与操作。 - 它的目的是检查
GPIO1->DR
的第 18 位是否为 1。
- 这部分表示对
-
((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文件中只包含了 源文件的目录,没有包含头文件的目录
,错误如下: