开箱后,开发套件主要是两个,下图一块主板,一个下载器。

板子到手,照着官网资料搭建好开发环境,先来个最拿手的点灯。
程序代码:
void delay(unsigned int x){ unsigned int i=0,j=0; for( ;j<x;j++) for(i=0;i<200;i++); }
复制代码void main(void){ uint16 PowerUpCnt = 0; uint16 i=0; float adc7=0.0; /*********上电等待*********/ for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++); SetBit(P4_OE,P44);//设置GPIO44输出使能 SetBit(P4_PU,P44);//设置上拉 GP44=0;//GPIO44写0 UART1_Init(); while (1) { GP44=!GP44; delay(5000); } }
复制代码实验效果:

接下来就是最常用也最方便的串口了,官方已经给好了初始化代码,但是这里还是将putchar()函数重写一下,方便使用printf()格式化串口输出
void UART1_Init(void){ SetBit(PH_SEL, UART1EN); //P0[6]as UART2_RXD; P0[5]as UART2_TXD #if 0 ClrBit(P0_OE, P06); //输入使能 SetBit(P0_PU, P06); //上拉电阻 SetBit(P0_OE, P05); //输出使能 SetBit(P0_PU, P05); //上拉电阻 #endif UT_MOD1 = 0; //00-->单线制8bit 01-->8bit uart(波特率可设置) UT_MOD0 = 1; //10-->单线制9bit 11-->9bit uart(波特率可设置) SM2 = 0; //0-->单机通讯 1-->多机通讯; REN = 1; //0-->不允许串行输入 1-->允许串行输入,软件清0; TB8 = 0; //模式2/3下数据发送第9位,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址 RB8 = 0; //模式2/3下数据接收第9位,若SM2=0,作为停止位 PI2C_UT11 = 0; //中断优先级时最低 PI2C_UT10 = 0; ClrBit(UT_BAUD, UART_2xBAUD); //倍频使能0-->Disable 1-->Enable ES0 = 0; //UART1中断使能0-->Disable 1-->Enable UT_BAUD = 0x000c;//波特率可设置 = 24000000/(16/(1+ UT_BAUD[BAUD_SEL]))/(UT_BAUD+1) //9B-->9600 0x000c-->115200 }
复制代码char putchar(unsigned char c){ UT_DR = c; while (!TI); TI=0; return 0; }
复制代码void main(void){ uint16 PowerUpCnt = 0; uint16 i=0; float adc7=0.0; /*********上电等待*********/ for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++); SetBit(P4_OE,P44);//设置GPIO44输出使能 SetBit(P4_PU,P44);//设置上拉 GP44=0;//GPIO44写0 UART1_Init(); while (1) { GP44=!GP44; delay(5000); printf("%d.Uart1 Test!\r\n", ++i); } }
复制代码演示效果:

主板上还有一个滑动变阻器,接在P34上,这个滑动变阻器官方是用来模拟调速的,现在先简单测试一下


通过数据手册知道FU6832L芯片内部的ADC是12位的,那么读出ADC转换结果乘以参考电压再除4095就可以得到电压值了。而通道7的转换结果存放在16位寄存器ADC7_DR中,
故计算公式:
adc7=(ADC7_DR>>3)*5.0/4095;
复制代码左移3位是因为对齐方式位左次高对齐,也可以设置右对齐,就不用移位了,

主要代码:
void main(void){ uint16 PowerUpCnt = 0; uint16 i=0; float adc7=0.0; /*********上电等待*********/ for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++); SetBit(P4_OE,P44);//设置GPIO44输出使能 SetBit(P4_PU,P44);//设置上拉 GP44=0;//GPIO44写0 UART1_Init(); VREFConfigInit();//设置参考电压 5V SetBit(P3_AN , PIN4); //设置P34为模拟输入 SetBit(ADC_MASK,CH7EN); //通道使能 SetBit(ADC_CR, ADCALIGN); //ADC数据次高位对齐使能0-->Disable 1-->Enable SetBit(ADC_CR, ADCEN); //使能 ADC0 while (1) { GP44=!GP44; delay(5000); SetBit(ADC_CR,ADCBSY);//启动ADC while(ReadBit(ADC_CR,ADCBSY));//等待ADC转换完成 adc7=(ADC7_DR>>3)*5.0/4095; printf("%d.滑动变阻器电压:%.2f V\r\n", ++i, adc7); } <div>
复制代码用手旋转滑动变阻器得到如下结果:

接下来再来个定时器,有了定时器,不管做什么都是很方便的啦。查阅数据手册知道Timer1 包含一个 16 位向上计数的基本定时器和一个 16 位向上计数的重载定时器,两个定时器的计数源均为内部时钟。而且可以产生溢出中断。当然还有一个滴答定时器,但是已经被当作系统总中断用了,那为了后续使用,这里就用TIM1。


其他定时器主要用作PWM输出或脉冲输入检测,故这里选用TIM1。
注释我写的比较详细,就直接上代码了
void Timer1_Init(void){ SetBit(TIM1_CR3,T1PSC2); SetBit(TIM1_CR3,T1PSC1); SetBit(TIM1_CR3,T1PSC0);//配置TIM1时钟分频,111->187.5K SetBit(TIM1_IER,T1MAME|T1BOIE);//T1MAME使能后,基本定时器和重载定时器作为独立的定时器。具体细节为: //基本定时器的BCNTR不再由T1BRS控制清零,由BCNTR上溢事件清 零; //T1BOIE基本定时器上溢中断使能 ClrBit(TIM1_SR,T1BOIE);//清除中断标志 TIM1__BCNTR=0;//基本定时器计数值 TIM1__BARR=18750;//基本定时器自动重载值 100ms一次中断 SetBit(TIM1_CR0,T1BCEN);//基本定时器计数器使能 }
复制代码volatile unsigned long total_time=0;void main(void) { uint16 PowerUpCnt = 0; uint16 i=0; float adc7=0.0; /*********上电等待*********/ for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++); SetBit(P4_OE,P44);//设置GPIO44输出使能 SetBit(P4_PU,P44);//设置上拉 GP44=0;//GPIO44写0 UART1_Init(); Timer1_Init(); EA=1; while (1) { delay(5000); } }
复制代码void TIM1_INT() interrupt 5{ static uint16 i=0; if(++i==10) { i=0; GP44=!GP44;//一秒钟翻转一次 total_time++;//一秒钟自增一次 printf("已开机:%ld 秒\r\n", total_time); } ClrBit(TIM1_SR,T1BOIE);//清除中断标志 }
复制代码效果如下:

其它通用外设比如IIC,大部分都是用模拟的,这里我就不测试了,还有SPI也不大方便测。
但是这款单片机内部还集成了运算放大器,比较器,FOC相关专用寄存器,这些官方给的例程里都用到了,接下来就是官方的无刷电机控制例程了,毕竟这款单片机可以说是专为FOC而生的了。由于我手里只有一个无感无刷电机,就先来一个慢一点的,磕磕绊绊的,应该是电机参数没测好

再来个中速的

最后是暴力旋转。

(本来在word写的,视频都是MP4,听声音可以听出快慢的,但是上传发现只能GIF,就没声音了,大家将就看吧)
好了,这次测评就到此结束了,等有了有感无刷,再来玩玩这块板子,应该会更好玩。