一、测试情况表
常用功能 | 测试情况 | 是否完成 |
ADC | 完成 |
|
ADC模拟看门狗 | 完成 |
|
ADC+DMA | 完成 |
|
ADC+DMA+TIM | 完成 |
|
CAN+UART | 完成 |
|
EXTI | 完成 |
|
FLASH | 完成 |
|
I2C | 未完成 |
原理图,使用手册,官方例程都是上手最快的资料。官方例程如下:
调节可变电阻RV1,电压表测试电容C22两端电压1.16V,转换ADC值为1.16/3.3*4096≈1440.
配置如下,则ADC不会进入中断,因为1461在0到2772范围之内。AD值:1461(由于ADC误差以及电源纹波等,通常需要进行滤波)
当调节可变电阻RV1使ADC值不断增大直至>=2722,则进入中断:如下图的断点,ADCVAL接近2772。
官方例程:ADC_DMA_MultiChan_Interrupt,每次扫描3个ADC通道后进入DMA1_Channel1_IRQHandler中断。如图:
主要是DMA配置如下图:
实际情况会让ADC不断通过DMA更新数据。比如使用中断,在每次进入中断则刷新整个varADCavarage[AVERAGELEN][ADCNUM]数组,这个处理ADC数值时,会有足够多的数据。可以在中断中就行ADC值处理(滤波等),但实际不推荐,一般更新处理标志。
初始化如图:
添加代码:
//省略其他部分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;输出信息是正确的,可能是缓冲问题吧!
根据官方例程:EXTI_Key 直接测试。按下Key4,进入EXTI0中断.如下图:
根据官方例程: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;
官方例程:I2C_EEPROM_DMA_Master_Interrupt,一直卡在下图,奇怪!!!
由于项目较忙,后面继续更新!另外,不足请指出,不胜感激!
文章评论(0条评论)
登录后参与讨论