-
使用 DMA写flash后,读取数据出现错位现象
使用DMA写flash后,读取数据出现错位现象,读到的buffer的第一节总为0,从第二字节开始才是正常数据。只能在24bit地址发送完后,再发一个DUMMY_BYTE(无效字节),才能bufferr接收数据。一但调“dma_channel_enable(DMA1,DMA_CH3)这个使能”后就出现上述现象。每次读取数据时都要先发一个DUMMY_BYTE才能正确接收。若上电不调“dma_channel_enable(DMA1,DMA_CH3)“接收都是正常的。使用的MCU是GD32F470VIT6,SPIFLAH是GD25Q40C.请各位大佬帮忙分析下。以下为SPI代码DMA配置voiddma_init(uint8_t*data_buffer,uint32_tdata_length){dma_single_data_parameter_structdma_init_struct;rcu_periph_clock_enable(RCU_DMA1);//DMA发送dma_deinit(DMA1,DMA_CH3);//DMA初始化参数设置dma_init_struct.direction=DMA_MEMORY_TO_PERIPH;dma_init_struct.memory0_addr=(uint32_t)data_buffer;dma_init_struct.memory_inc=DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.periph_addr=(uint32_t)&SPI_DATA(SPI0);dma_init_struct.periph_inc=DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.periph_memory_width=DMA_MEMORY_WIDTH_8BIT;dma_init_struct.number=data_length;dma_init_struct.circular_mode=DMA_CIRCULAR_MODE_DISABLE;dma_init_struct.priority=DMA_PRIORITY_MEDIUM;dma_single_data_mode_init(DMA1,DMA_CH3,&dma_init_struct);dma_channel_subperipheral_select(DMA1,DMA_CH3,DMA_SUBPERI3);//使能DMA中断通道nvic_irq_enable(DMA1_Channel3_IRQn,0,0);//配置DMA中断使能位//dma_circulation_disable(DMA1,DMA_CH3);dma_interrupt_enable(DMA1,DMA_CH3,DMA_CHXCTL_FTFIE);}DMA发送int8_tspi_dma_data_send(uint8_t*pbuffer,uint32_twrite_addr,uint16_tnum_byte_to_write){/*enablethewriteaccesstotheflash*/spi_flash_write_enable();/*selecttheflash:chipselectlow*/SPI_FLASH_CS_LOW();/*send"writetomemory"instructi
2024-11-07 15 -
GD32F303CCT6keil5下载不了程序但是Jlink可以检测到芯片ID
公司的一个项目画了一块板子因为要适配上位机的原因前前后后调试的半个月,中间因为解压的时候点错了导致在这个项目的文件夹里存在着两套项目文件(GD.后缀和GD_1.后缀),后来有一次因为这个项目进调试后退出会导致keil卡死只能通过任务管理器强行关闭我在网上搜索的教程是删掉uvoptx文件然后重新编译,事情就发生在这个操作之后。后面我发现下不了程序后就把文件恢复了但还是一样报错下载不了,现在的情况就是同一个项目我拷贝到同事电脑上是可以下载的,程序也是可以正常跑起来,但是在我电脑上用keil5和J-Flash都不行然而都可以连接成功和识别芯片ID,更加让我迷惑的是换了另一个项目的同型号芯片的板子是正常的,中间也试过降低速度,J-Flash查看但是都是只有一开始的连接和识别成功后面的在清楚flash阶段就提示报错。这个是和我的接口有关联吗。下面是keil5截图
2024-11-01 12 -
比较器的开窗控制具体是什么
比较器的开窗功能具体实现原理是什么?我网上查的是通过两个比较器并联实现:输入信号<V_low:两个比较器中,第一个比较器输出低状态,最终输出也为低。输入信号在[V_low,V_high]范围内:两个比较器都输出高状态,最终输出为高。输入信号>V_high:第二个比较器输出低状态,最终输出为低。如果是这样,那是不是应该设置上下阈值,然而并没有寄存器可以设置
2024-10-24 6 -
GD32f303rct6 RTC问题。
我准备用兆易的GD32F103rct6,RTC时钟,它的时钟32.768晶振的选择是不是和STM32F103一样容易出现问题,不起振?在选择晶振时应注意什么?
2024-10-12 10 -
HC32F460 USB使用
本帖最后由Pupil2013于2024-10-915:44编辑HC32F460USB使用
2024-10-09 12 -
使用stm32mp157进行软件模式spi通讯,无法设置为四线模式
本帖最后由七呀嘛七于2024-9-1810:10编辑目前使用stm32mp157芯片进行软件模式的spi通讯,设备树内对使用的gpio口定义如下:gpio_spi1:spi@1{compatible="spi-gpio";#address-cells=;#size-cells=;status="okay";sck-gpios=;mosi-gpios=;miso-gpios=;cs-gpios=,;//drv:i0dac:e6num-chipselects=;/*Clients*/spidev@0{reg=;compatible="linux,spidev";spi-max-frequency=;};spidev@1{reg=;compatible="linux,spidev";spi-max-frequency=;};};在使用read或ioctl函数,通过miso线进行读取时,发现读取到的都是mosi线的数据,也就是运行在三线模式。尝试使用ioctl(fd,SPI_IOC_WR_MODE,&mode)关闭三线模式,但没有产生效果。程序中spi读取的相关代码如下:intmyspi2_write_then_read(intfd,constuint8_t*tx_buf,size_tlen_tx,uint8_t*rx_buf,size_tlen_rx){structspi_ioc_transfertransfer[2];//两个传输结构,一个用于写入,一个用于读取memset(transfer,0,sizeof(transfer));//清空结构体//第一个传输,用于写入transfer[0].tx_buf=(unsignedlong)tx_buf;//发送缓冲区transfer[0].rx_buf=0;//不接收数据transfer[0].len=len_tx;//写入数据长度transfer[0].speed_hz=0;//使用当前SPI设备的默认速度transfer[0].cs_change=0;//在结束时不改变片选状态//第二个传输,用于读取transfer[1].tx_buf=0;//不发送数据transfer[1].rx_buf=(unsignedlong)rx_buf;//接收缓冲区transfer[1].len=len_rx;//读取数据长度transfer[1].speed_hz=0;//使用当前SPI设备的默认速度transfer[1].cs_change=0;//完成读写后释放片选//使用ioctl进行双向传输(写入+读取)intret=ioctl(fd,SPI_IOC_MESSAGE(2),transfer);printf("Wrote%zubytesandread%zubytesfromSPI\n",len_tx,len_rx);return0;}intspi_read(intfd,intread_length){uint8_tbuf[read_length];ssize_tret=read(fd,buf,sizeof(buf));printf("ReadfromSPI:");for(inti=0;i<ret;i++){printf(
2024-09-18 8 -
使用三个定时器输出PWM卡死
请教各位大牛一个问题,卡住我几天了。我使用如下定时器配置PWM,如下示:PA6->PWM0tim1_cha(4)PA7->PWM1tim2_cha(5)PB0->PWM2tim3_ch1b(2)在应行如下初始化代码后,直接卡死了,请问是什么原因呢voidpwm_init(){Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//端口外设时钟使能TimerPortCfg(PWM0);TimerPortCfg(PWM1);TimerPortCfg(PWM2);Timer1Cfg(100,PWM_DUTY);Bt_M23_EnPWM_Output(TIM1,TRUE,FALSE);//端口输出使能Timer2Cfg(100,PWM_DUTY);Bt_M23_EnPWM_Output(TIM2,TRUE,FALSE);//端口输出使能Timer3Cfg(100,PWM_DUTY);Tim3_M23_EnPWM_Output(TRUE,FALSE);//端口输出使能Bt_M23_Run(TIM2);//运行。Bt_M23_Run(TIM1);//运行。Tim3_M23_Run();//运行。}完整模块代码发下:#include"pwm.h"#include"timer3.h"#include"bt.h"#include"gpio.h"#include"motor.h"volatilecharpwm_duty=95;//PA6->PWM0tim1_cha(4)//PA7->PWM1tim2_cha(5)或tim3_ch0b(4)//PB0->PWM2tim3_ch1b(2)typedefenum{PWM0=0u,PWM1,PWM2,}pwm_index_t;/********************************************************************************中断服务函数******************************************************************************/voidTim1_IRQHandler(void){//Timer1模式23更新中断if(TRUE==Bt_GetIntFlag(TIM1,BtUevIrq)){Bt_M23_CCR_Set(TIM1,BtCCR0A,100-pwm_duty);//设置通道A比较值Bt_ClearIntFlag(TIM1,BtUevIrq);//清中断标志}}voidTim2_IRQHandler(void){//Timer2模式23更新中断if(TRUE==Bt_GetIntFlag(TIM2,BtUevIrq)){Bt_M23_CCR_Set(TIM2,BtCCR0A,100-pwm_duty);//设置通道A比较值Bt_ClearIntFlag(TIM2,BtUevIrq);//清中断标志}}voidTim3_IRQHandler(void){//Timer3模式23更新中断if(TRUE==Tim3_GetIntFlag(Tim3UevIrq)){Tim3_M23_CCR_Set(Tim3CCR1B,100-pwm_duty);//设置CH1通道B比较值Tim3_ClearIntFlag(Tim3UevIrq);/
2024-09-14 5 -
GD32F105代码移植到103
因为我的新产品不需要OTG功能,我想把原来在GD32F105下开发的代码移植到GD32F103上去,但KEIL里总是提示L6404E错误存储溢出,哪位大佬熟悉代码优化呢
2024-09-07 9 -
N32L436RB OPAMP2不工作
使用官方DEMO依旧不工作,debug看OPAMP2_CS寄存器没有被赋值,请问是什么原因?
2024-09-03 10 -
国民n32g452低功耗有问
、如上图,进入STOP2模式时,把所有外设时钟、GPIO配置成模拟输入(除了jlink下载的2个和1个唤醒源口),所有中断禁止;测试在stop2模式时,还有250ua的功耗,请问还有什么方法降低,目标功耗在10-20ua左右,国民代理FAE和官方Q群这边没人指导,特此发帖咨询,还望有这方面的解答回应。
2024-09-02 6