原创 【灵动微电子MM32 eMiniBoard】+ MM32测试之MM32eMiniBoard036开发板

2021-11-9 21:55 2316 8 8 分类: MCU/ 嵌入式
一直没空,今天终于抽时间出来看看mm32的板子。刚拿到板子时,就跑到官网(https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_mainstream/mm32f3270/),发现使用的和stm32类似的库文件,这点国产32都差不多。因为本人用过AT32,gd32,hk32,n32,stm32等。废话不多说了,直接进入正题。

一、测试情况表

常用功能

测试情况

是否完成

ADC

完成

ADC模拟看门狗

完成

ADC+DMA

完成

ADC+DMA+TIM

完成

CAN+UART

完成

EXTI

完成

FLASH

完成

I2C

未完成


一、测试简况

原理图,使用手册,官方例程都是上手最快的资料。官方例程如下:

1.模拟看门狗测试

调节可变电阻RV1,电压表测试电容C22两端电压1.16V,转换ADC值为1.16/3.3*4096≈1440.

配置如下,则ADC不会进入中断,因为1461在0到2772范围之内。AD值:1461(由于ADC误差以及电源纹波等,通常需要进行滤波)

当调节可变电阻RV1使ADC值不断增大直至>=2722,则进入中断:如下图的断点,ADCVAL接近2772。

2.ADC+DMA 多通道扫描测试

官方例程:ADC_DMA_MultiChan_Interrupt,每次扫描3个ADC通道后进入DMA1_Channel1_IRQHandler中断。如图:

主要是DMA配置如下图:


实际情况会让ADC不断通过DMA更新数据。比如使用中断,在每次进入中断则刷新整个varADCavarage[AVERAGELEN][ADCNUM]数组,这个处理ADC数值时,会有足够多的数据。可以在中断中就行ADC值处理(滤波等),但实际不推荐,一般更新处理标志。

3.DMA 半传输完成标志测试

初始化如图:

添加代码:

//省略其他部分DMA配置 DMA_ITConfig(DMA1_Channel1, DMA_IT_HT, ENABLE); //DMA_IT_HT: Half transfer interrupt mask ... /* DMA1_Channel1 中断 */ void DMA1_Channel1_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_HT1)) { //Stop Conversion ADC_SoftwareStartConvCmd(ADC1, DISABLE); //Clear interrupt flag DMA_ClearITPendingBit(DMA1_IT_HT1); //Erected transmission complete flag ADCflag = 1; } if(DMA_GetITStatus(DMA1_IT_TC1)) { //Stop Conversion ADC_SoftwareStartConvCmd(ADC1, DISABLE); //Clear interrupt flag DMA_ClearITPendingBit(DMA1_IT_TC1); //Erected transmission complete flag ADCflag = 1; } }


DMA半传输完成中断调试如下:


DMA传输完成中断:

这里为了测试才在中断中关闭ADC : ADC_SoftwareStartConvCmd(ADC1, DISABLE);

3.ADC+DMA+TIM

根据官方例程:ADC_TIM1Trig_DMA_MultiChan_Interrupt,程序作部分修改结果如图:

使DMA更新整个varADCavarage[AVERAGELEN][ADCSCANNUM]数值,使用宏定义方便修改ADC通道以及每个ADC通道缓存大小。

#define ADCSCANNUM 6

#define AVERAGELEN 20

使用定时器主要是把软件触发变成定时器触发。

CAN+UART

4.CAN 自发自收 + UART 打印

根据官方例程:CAN_Filter_20Groups,做相关修改:

1. 主函数:

s32 main(void) { u8 i = 0; CanTxMsg TxMessage = {0}; RCC_GetClocksFreq(&clk); DELAY_Init(); CONSOLE_Init(115200); CAN_Filter_20GroupInit(CAN_250K); TxMessage.CANID = 0x188; TxMessage.DLC = 1; TxMessage.Data[0] = 0xaa; while(1) { if(gRxFlag) { gRxFlag = 0; printf("CANID:0x%x Data:", gCanPeliRxBuff.ID); for(i = 0; i < TxMessage.DLC; i++) { // Print CAN message contents. printf("%x", gCanPeliRxBuff.Data[i]); } printf("\r\n"); } Send_CANFrame(&TxMessage); DELAY_Ms(500); } }

2. CAN 配置:

CAN_Peli_InitStruct.STM = ENABLE; //开启Pelican的自测模式


测试现象如下: CAN发送信息,进入中断后,gRxFlag标志置1,从而到UART打印,这里发现打印信息顺序不正常。另外can发送的信息也要对应,因为设置了过滤器。

左边的输出信息是打断点输出的:CANID:0x188 Data: aa;输出信息是正确的,可能是缓冲问题吧!

5.EXTI

根据官方例程:EXTI_Key 直接测试。按下Key4,进入EXTI0中断.如下图:

6.FLASH

根据官方例程:FLASH_Program,结果如下图:

先擦除扇区Bank1的数据:FLASH_ErasePage(BANK1_WRITE_START_ADDR);

重新写入扇区Bank1的数据:gFlashStatus = FLASH_ProgramWord(BANK1_WRITE_START_ADDR, gData);

读出扇区Bank1的数据:data = *(__IO u32*) BANK1_WRITE_START_ADDR;

7.I2C

官方例程:I2C_EEPROM_DMA_Master_Interrupt,一直卡在下图,奇怪!!!

由于项目较忙,后面继续更新!另外,不足请指出,不胜感激!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /3 下一条