STM32F407ZGT6假死现象,看门狗不起作用
目前新项目,MCU采用STM32F407VGT6,文件存在TF卡(SDIO),请问能否通过F4的USB把TF卡里面的txt和excel文件拷贝到U盘?哪个USB可以实现?
STM32F407VGT6使用PLL倍频后芯片会反复重启
求助佬们,STM32U083 进行外部计数只能计数8000多一点
CAN接收丢包
DMA发送函数只能被调用一次
L9663驱动开发
使用Cubeprogrammer无法连接、连接G431和一块H750的板子可以连上但是连另外一块H750的板子和F407的板子就直接报错,这个应该如何解决。
SPI 通信,既有单字节数据传输,又有多字节数据传输,该如正确使用 DMA?
SD卡log存储
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
/* TIM1 DMA Init */
/* TIM1_UP Init */
hdma_tim1_up.Instance = DMA2_Stream5;
hdma_tim1_up.Init.Channel = DMA_CHANNEL_6;
hdma_tim1_up.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim1_up.Init.PeriphInc = DMA_PINC_ENABLE;
hdma_tim1_up.Init.MemInc = DMA_MINC_DISABLE;
hdma_tim1_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_tim1_up.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_tim1_up.Init.Mode = DMA_CIRCULAR;
hdma_tim1_up.Init.Priority = DMA_PRIORITY_LOW;
hdma_tim1_up.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_tim1_up) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(tim_baseHandle,hdma[TIM_DMA_ID_UPDATE],hdma_tim1_up);
/* USER CODE BEGIN TIM1_MspInit 1 */
__HAL_TIM_CLEAR_IT(&htim1,TIM_IT_UPDATE);
//HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);//打开DMA中断
HAL_DMA_Start(&hdma_tim1_up,(uint32_t)arry_spi_tx,
(uint32_t)&SPI1->DR,D_ADS8695_LENGTH);
__HAL_TIM_ENABLE_DMA(&htim1,TIM_DMA_UPDATE);
__HAL_TIM_ENABLE(&htim1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
/* USER CODE END TIM1_MspInit 1 */
}
if(spiHandle->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* USER CODE END SPI1_MspInit 0 */
/* SPI1 clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = ADS8695_SCL_Pin|ADS8695_SDI_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = ADS8695_SDO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(ADS8695_SDO_GPIO_Port, &GPIO_InitStruct);
/* SPI1 DMA Init */
/* SPI1_RX Init */
hdma_spi1_rx.Instance = DMA2_Stream0;
hdma_spi1_rx.Init.Channel = DMA_CHANNEL_3;
hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi1_rx.Init.Mode = DMA_CIRCULAR;
hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;
hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_spi1_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_spi1_rx.Init.MemBurst = DMA_MBURST_INC4;
hdma_spi1_rx.Init.PeriphBurst = DMA_PBURST_INC4;
if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);
/* SPI1_TX Init */
hdma_spi1_tx.Instance = DMA2_Stream3;
hdma_spi1_tx.Init.Channel = DMA_CHANNEL_3;
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi1_tx.Init.Mode = DMA_NORMAL;
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(spiHandle,hdmatx,hdma_spi1_tx);
/* SPI1 interrupt Init */
HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI1_IRQn);
/* USER CODE BEGIN SPI1_MspInit 1 */
//注册传输完成中断
HAL_DMA_RegisterCallback(&hdma_spi1_rx, HAL_DMA_XFER_CPLT_CB_ID, ADS8695_DmaCplCb);
HAL_DMA_Start_IT(&hdma_spi1_rx, (uint32_t)&SPI1->DR,
(uint32_t)S_GLOBAL_VARIBLE.ARRYI_ADS8695_DATA,D_ADS8695_LENGTH);
SET_BIT(SPI1->CR2,SPI_CR2_RXDMAEN);
__HAL_SPI_ENABLE(&hspi1);
/* USER CODE END SPI1_MspInit 1 */
}
这是我的程序,如何在UP事件来到时发送 呢 我是采用
HAL_DMA_Start(&hdma_tim1_up,(uint32_t)arry_spi_tx,
(uint32_t)&SPI1->DR,D_ADS8695_LENGTH);
这个函数的 如何让他发送 32位数据呢 这个函数只发送8位数据
是在定时器更新中断中完成SPI的发送吗?能不能通过某些设置让SPI自动发送32位数据呢。我是通过 HAL_DMA_Start(&hdma_tim1_up,(uint32_t)arry_spi_tx, (uint32_t)&SPI1->DR,D_ADS8695_LENGTH);
这个函数完成更新事件触发DMA的,但是这个方式,只能发送一次,也就是8位,不能发送32位 请问这个该怎么解决呢?
对于STM32F4系列,没法一个事件触发多个DMA传输。
我之前的想法是1个更新事件,基于更新中断发送多个SPI数据。
你现在数据较多,不希望过多中断干预可以理解,也是你当前的真实需求。
比方你希望通过SPI发送1024个数据,使用定时器触发DMA也是可以的。
这里定时器事件作为DMA触发源,传输指定个数后,可以4个,可以是1024个,然后DMA停止传输。
当然,这里每个数据的传输还是对应1个定时器事件。不知这样是否可以满足你的应用需求。
对于STM32F4系列,一般没法一个事件触发多个DMA传输。
我之前的想法是1个更新事件,基于更新中断发送多个SPI数据。
你现在数据较多,不希望过多中断干预可以理解,也是你当前的真实需求。
比方你希望通过SPI发送1024个数据,使用定时器触发DMA也是可以的。
这里定时器事件作为DMA触发源,传输指定个数后,可以4个,可以是1024个,然后DMA停止传输。
当然,这里每个数据的传输还是对应1个定时器事件。不知这样是否可以满足你的应用需求。
你好,我在使用AD8695和你遇到了同样的问题,请问你解决了吗?可不可以加我QQ我们讨论一下