在不侧重于硬件配置情况下,给出逐飞给出的部分外设重要函数:
1 | //zf_common_clock.c:设置、获取系统频率,关闭看门狗,时钟初始化,等待所有核心初始化完毕 |
例程中的重要部分:
GPIO演示例程 | 本例程主要作用是,展示如何使用GPIO模块 |
---|---|
串口演示例程 | 本例程主要作用是,展示如何使用串口的发送与中断接收 |
ADC采集例程 | 本例程主要作用是,展示如何使用ADC模块 |
PWM输出例程 | 本例程主要作用是,展示如何使用GTM模块输出PWM以及设定占空比 |
周期中断演示例程 | 本例程主要作用是,展示如何使用定时器完成周期中断 |
GPIO中断演示例程 | 本例程主要作用是,展示如何使用GPIO触发中断 |
编码器例程 | 本例程主要作用是,展示如何使用正交解码编码器以及带方向编码器 |
Flash存取例程 | 本例程主要作用是,展示如何使用片内EEPROM(Dflash)存取参数 |
延时例程 | 本例程主要作用是,展示如何使用滴答定时器进行延时 |
调试信息输出例程 | 本例程主要作用是,展示如何使用底层库进行调试信息输出 |
中断优先级例程 | 本例程主要作用是,展示如何使用中断优先级的设置 |
核心1处理中断例程 | 本例程主要作用是,展示如何使用核心1来处理中断 |
双核使用例程 | 本例程主要作用是,展示如何使用双核同时运行程序 |
指定变量或代码位置 | 本例程主要作用是,展示如何控制变量或者代码位置,来提高性能 |
FFT使用例程 | 本例程主要作用是,展示如何使用英飞凌SDK自带的软件FFT计算 |
E1:配置IO口,点灯(略)
E2:利用串口发送/接受信息,注意中断的配置
E3:ADC,主要函数有adc_convert(); adc_mean_filter_convert();参数是ADC通道等
E4:pwm制作呼吸灯
E5:利用中断控制灯的亮灭
E6:中断嵌套的应用
E7:利用中断读取编码器的输出值
E8:利用串口输出数据至串口助手
E9:利用system_getval_ms();来获取系统从运行到现在的时间,也可以us
...双核的使用建议看E14,详细解释了分配规则:
CPU0是一级流水线,CPU1是三级流水线,因此CPU1更适合做运算,速度会比CPU0快一些
CPU0 psram 程序RAM 大小为16KB CPU0 dsram 数据RAM 大小为72KB
CPU1 psram 程序RAM 大小为32KB CPU1 dsram 数据RAM 大小为120KB
TC264D中两个核心都有自己的程序缓存, CPU0 Cache大小为8KB CPU1 Cache大小为16KB
程序RAM用来放代码,将代码放在RAM中,可以提高执行速度,特别是当周期运行的代码大小超过了cache之后效果比较显著。数据RAM用来放变量,任意CPU都可以访问dsram0和dsram1,也就是说CPU0可以访问dsram1,这种行为叫做跨核访问,带来的问题就是访问延迟有所增大;最好的是CPU0访问dsram0,CPU1访问dsram1,这样速度最快。 默认情况下定义的全局变量都是保存在dsram1中的,这就会导致在CPU0中跑的代码对RAM读取会有一定的延迟。
1
2
3
4
5
uint8 test_value = 0;
// 如果将cpu0_dsram改为cpu1_dsram 则变量放在cpu1_dsram区域内
// 我们建议程序由哪个CPU执行,则将所使用的变量放置在哪个区域内,默认不指定的情况下变量被放置在cpu1_dsram区域1
2
3
4
5
6
7
8
9
10
11
12
13// 使用#pragma section all "cpu0_psram" 和 #pragma section all restore可以将函数加载到cpu0_psram
// 我们只需要将函数定义放在上面两句话中间即可,使用示例如下
void delay_tset(void)
{
uint32 i;
i = 16000000;
while(i--);
}
// 如果将cpu0_psram改为cpu1_psram 则函数加载到cpu1_psram区域内
// 我们建议程序由哪个CPU执行,则将函数加载到在哪个区域内,默认不指定的情况下,程序都是从flash加载并执行
// 通常我们都不需要将函数放在RAM运行,一般在周期执行的程序大小超过了cache后,会出现程序执行速度降低,这个时候我们就可以将部分代码放入RAM执行,可以提高运算速度
1 | float I_ex, I_ey, I_ez; //误差积分 |
附加滤波算法:
注意,对于各个部件选用同一种滤波方式时要区分,也即写多个同样的函数(但不同名)
一阶滞后滤波算法
1 |
|
二阶滞后滤波算法与卡尔曼滤波
1 | int16 SecondOrderLagFilter(int16 value) |
1 | typedef struct { |
模糊PID算法:
1 |
|
图像处理部分:
图像阈值二值化
首先进行图像的二值化:
1 |
|
对应的处理函数有(自适应建议用,opencv经典算法):
1 | uint8 otsuThreshold(uint8 *image, uint16 width, uint16 height); //计算二值化阈值: 大津法 3ms |
1 |
|
识别边界拐点等:
1 |
|
1 | void GetImagBasic(int *LeftLine, int *CentreLine, int *RightLine ,char path); //扫线提取左中右三线 |
1 |
|