一些语言&调试零碎
# 语言方面
# 关于函数
- 关于不管是什么片上设备的端口号,在传参数的时候都是一串32位二进制的无符号整数,也就是
uint32_t
# typedef 头文件
你可以自己编写一个struct_typedef.h
头文件来缩短、好认定义一些量所用到的符号:
#ifndef STRUCT_TYPEDEF_H
#define STRUCT_TYPEDEF_H
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed long long int64_t;
/* exact-width unsigned integer types */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
typedef unsigned char bool_t;
typedef float fp32;
typedef double fp64;
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 寄存器操作技巧
一句话技巧:清除善用 &
和 ~
,赋值用 |
# 将某位清零
假设 a
为一个寄存器,且其中已经有数值了,为了将其中某一位清零而其他位保持不变,可以使用:
// 定义一个变量a = 1001 1111 b (二进制数)
unsigned char a = 0x9f;
// 对bit2 清零
a &= ~(1<<2);
// 括号中的1 左移两位,(1<<2)得二进制数:0000 0100 b
// 按位取反,~(1<<2)得1111 1011 b
// 假如a 中原来的值为二进制数: a = 1001 1111 b
// 所得的数与a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b),
// 经过运算后,a 的值 a=1001 1011 b
// a 的bit2 位被被零,而其它位不变。
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 将连续几位清零
// 若把 a 中的二进制位分成 2 个一组
// 即bit0、bit1 为第 0 组,bit2、bit3 为第 1 组,
// bit4、bit5 为第 2 组,bit6、bit7 为第 3 组
// 要对第 1 组的bit2、bit3 清零
a &= ~(3<<2*1);
1
2
3
4
5
6
2
3
4
5
6
提示
乘法的优先级要高于左移,算术运算的优先级均高于位运算
流程是:
- 括号中的 3 左移两位,
(3<<2*1)
得二进制数:0000 1100 b
- 按位取反,
~(3<<2*1)
得1111 0011 b
- 假如
a
中原来的值为二进制数:a = 1001 1111 b
- 所得的数与
a
作“位与&”运算,a = (1001 1111 b)&(1111 0011 b)
- 经过运算后,
a
的值a=1001 0011 b
a
的第 1 组的 bit2、bit3 被清零,而其它位不变
更加一般的:
- 上述
(~(3<<2*1))
中的1
即为组编号如清零第 3 组 bit6、bit7 此处应为 3 - 括号中的
2
为每组的位数,每组有 2 个二进制位;若分成 4 个一组,此处即为 4 - 括号中的
3
是组内所有位都为 1 时的值;若分成 4 个一组,此处即为二进制数1111 b
,例如对第 2 组bit4、bit5 清零a &= ~(3<<2*2)
# 对某几位赋值
// a = 1000 0011 b
// 此时对清零后的第 2 组bit4、bit5 设置成二进制数“01 b ”
a |= (1<<2*2);
// a = 1001 0011 b,成功设置了第 2 组的值,其它组不变
1
2
3
4
5
2
3
4
5
与上面的清除相似
# 调试方面
# Keil 的ST-Link下载与串口下载
主要是加密的问题,如果在 FlyMCU 上设置了读加密,则在 Keil 上的擦除是无效的。Keil 此时无法将程序 load 进单片机内部。尽量还是使用 ST-Link。
顺带一提,那个杨桃的最小核心板的串口是天生的 TTL 转 USB,不需要你再去接线了
编辑 (opens new window)
上次更新: 2020/11/14, 12:11:00