本帖最后由 lcdi 于 2024-6-4 09:21 编辑
屏幕使用的是中景园的1.9寸模块,SPI驱动,厂家给出的例程基本上都是软SPI,当然要改成硬件spi,
添加厂家的文件,其中修改lcd_init.c中的如下:
void LCD_Writ_Bus(u8 dat)
{
spi_i2s_data_transmit(SPI2, dat);
while(spi_i2s_flag_get(SPI2, SPI_I2S_TDBE_FLAG) == RESET);
}
这里判断标志在发送后,发送完毕才能返回,原因是如此方可配合DC引脚电平,区分好命令和数据。
另本设计未留GPIO控制lcd reset,所以设置完外设后,需要等待一段时间,再去设置LCD,否则LCD设置不成功。
厂家例程文字显示函数编译不成功,字符和画线正常,先继续~
DMA1设置为16bit模式,因为ADC数据是10位的。
DMA2是8bit模式,DAC数据是8位的。
tmr11的ch1通道输出作为ADC的时钟,同时也作为DMA1的触发信号。
tmr10的ch1通道输出作为DAC的时钟,同时也作为DMA2的触发信号。
ADC采样够一屏幕数据DMA1停止,然后画线显示出来,暂停一段时间以便观察,然后继续采样。
注意设置这里,at32f402_405_wk_config.h里面要定义:
#define DMA1_CHANNEL1_BUFFER_SIZE 300
#define DMA1_CHANNEL1_MEMORY_BASE_ADDR (uint32_t)&adcdata
和
#define DMA2_CHANNEL1_BUFFER_SIZE 120
#define DMA2_CHANNEL1_MEMORY_BASE_ADDR (uint32_t)&sindata
主程序中
wk_dma_channel_config(DMA1_CHANNEL1, (uint32_t)&GPIOA->idt, DMA1_CHANNEL1_MEMORY_BASE_ADDR, DMA1_CHANNEL1_BUFFER_SIZE);
要手动修改外设地址为GPIOA的idt,workbench里面没有修改之处,而且会傻傻的设置为触发信号,也就是tmr11的地址。
同理如下:
wk_dma_channel_config(DMA2_CHANNEL1, (uint32_t)&GPIOB->odt, DMA2_CHANNEL1_MEMORY_BASE_ADDR, DMA2_CHANNEL1_BUFFER_SIZE);
还有,workbench虽然设置了DMA1的中断,但是并没有设置具体中断信号,对比官方例程,还需添加如下:
dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE);
如此传输一遍DMA数据后,可以进入中断,然后检测传输完成标志:
if(dma_interrupt_flag_get(DMA1_FDT1_FLAG) != RESET)
{
dma_channel_enable(DMA1_CHANNEL1, FALSE);//关闭DMA1
dma_flag_clear(DMA1_FDT1_FLAG);//清标志
adcfinish =1;//自定义变量,主程序中检测可知得到一帧ADC数据
}
效果:
显示板上的一个时钟信号:
显示LCD的背光控制信号,因为直接三极管,故而被拉低了:
显示DAC输出的正弦波,太大干扰了,测量发现DAC的基准电压上干扰很大不稳定,后续再研究看是芯片问题还是布线问题。
由此可以看出本项目方案有一定实用价值,可以清晰的看出干扰越下面越大,代表电平越高干扰越大(波形上下是反向显示的),而基准电压是最高的1.2V干扰最大。
小结:
雅特力的workbench是很方便的工具,修改设置,调整频率非常方便。
但是不足还是有的:
1,DMA的地址设置方面还没有能够直接在workbench里选择,而是很奇怪的把触发外设填在外设地址那里。
2,DMA的中断设置居然漏了中断标志开启(没有任何标志选择或设置)。以上在10楼得到了解释,当然在workbench里面能够选择设置就会更方便,期待以后workbench完善度更高。
经过做项目式的评测,AT32F402/405系列成熟好用,性能强悍,高频率的端口操作也比较顺畅。非常棒!
项目中遇到一些问题耗费一些时间调试,主要是自己考虑不周(焊接水平差),布线不够好,程序不完善,这也是通常的过程。
坚持就会有收获!
项目验证了设计思路,值得继续测试完善。
暂且到此~~
噪声干扰确定是有布线的原因,还有跟随器设计不当,高频自激,绕过跟随器的波形就比较好了,补一张:
|