对于dsp的学习仅仅停留在表面,距离结课已有了一个月多,虽然遗忘很多,还是留点东西吧
很多东西是已经是存在的,和stm32的库函数类似,课程基本是靠CCS的观察变量变化,来得出结果,除了电机,其他没有外设
内存分配位置
在不指定变量的存放位置时,const变量放入econst段,非const放入ebss段里,在函数里定义的变量不会被放入任何段,直接在ram中
对于指定变量位置时,建议代码放入page0位置,数据放入page1位置
指定变量,例如,在cmd处增加mydata : > RAML7, PAGE = 1
1 |
|
指定函数,例如,在cmd处增加mycode : > RAML2, PAGE = 0
,在main函数中调用下,否则可能会被编译器优化掉
1 |
|
先编译代码,然后点击view->Memory Allocation观察内存分配
初始
一般都是以这样开头
1 | InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟 |
初始化外设,清楚禁用所有中断,初始化中断向量表
中断
F28335看门狗
f28335操作寄存器的特点是要先关闭保护,才能继续操作
喂狗函数如下
1 | void ServiceDog(void) |
看门狗简单来说就是防止程序跑飞,当其计数器到达一定的值时,产生中断信号,使得产生中断或者使得处理器复位,在已有看门狗代码下进行如下循环,用以观察看门狗的现象
1 | while(1) |
不喂狗:
喂狗:
定时器中断
与stm32不同的是,stm32有专门的中断函数,CCS可以自定义函数名,然后与对于中断绑定
1 | EALLOW; |
中断函数,PieCtrlRegs.PIEACK.bit.ACK1=1语句与32类似,中断标志位恢复
1 | interrupt void ISRTimer2(void) |
时钟启动
1 | EALLOW; |
对应定时器开启
1 | InitCpuTimers(); |
InitCpuTimers,ConfigCpuTimer,StartCpuTimer0之类的函数都是已有的,调用填入相关参数即可
外部中断
与定时器中断相类似
1 | EALLOW; |
外部中断需要设置XINTn外部中断通道挂接对应在某引脚外部中断1(XINT1)到外部中断2(XINT2)可以挂接GPIO0到GPIO31,外部中断3(XINT3)到外部中断7(XINT7)可以挂接GPIO32到GPIO63。
引脚配置
1 | GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0; |
ePWM
一个定时器可以输出两种PWM波,互补,或者相同
1 | EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; |
SPI通讯
1 | SpiaRegs.SPICCR.all =0x0016; //第三位置1为自反馈模式,第四位指的是数据长度为6位 |
数据传输
1 | for(;;) |
传输7位,而数据有16位,出现两边不一样的现象
ADC
1 | AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x6;//采样通道,从00~15 |
以下是进行初步的采样,多个通道进行平均,实现过采样,有一定的使得波形光滑
1 | all=(AdcRegs.ADCRESULT0 >>4)+(AdcRegs.ADCRESULT1 >>4)+(AdcRegs.ADCRESULT3 >>4)+(AdcRegs.ADCRESULT4 >>4)+ |
一阶低通滤波实现:
1 | if(ConversionCount>1) |
对G(s)=1/(s/w+1)进行离散化,使用前向差分即可。
flash运行程序
这里没有实际使用过。
1:加载另一版本CMD文件,并将RAM版CMD文件右键,选择“Exclude from Build”
2:将核心代码拷贝至RAM执行(主中断内所有核心代码),先宏定义FLASH
3:将程序和代码拷贝至RAM执行,在SECTIONS中定义RAM执行段—ramfuncs”;将程序、变量定义在“ramfuncs”段中Pragma
1 |