• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

F103板子RAM和串口DMA的问题

donatello 2018-01-24 浏览量:1252

       如题,使用F103板子测试串口1接收DMA,同样的程序,在F103C8T6上报错,在F103CBT6上正常运行,将启动.s文件换成startup_stm32f103x6.s也是这样,初步判断是RAM大小的问题,那么,有没有解决方法呢?能不能让这个程序在F103C8T6上正常运行呢?

#define BUFFERSIZE 200
uint8_t ReceiveBuff[BUFFERSIZE];
uint8_t recv_end_flag = 0,Rx_len;

UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;
GPIO_InitTypeDef GPIO_InitStruct;

void UART1_Init(int baud)
{
	
	__HAL_RCC_GPIOA_CLK_ENABLE();	
	__HAL_RCC_USART1_CLK_ENABLE();
	__HAL_RCC_DMA1_CLK_ENABLE();
	
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	
  huart1.Instance = USART1;
  huart1.Init.BaudRate = baud;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  HAL_UART_Init(&huart1);
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
	HAL_NVIC_SetPriority(USART1_IRQn,0,0);
  HAL_NVIC_EnableIRQ(USART1_IRQn);
	
	hdma_usart1_rx.Instance = DMA1_Channel5;
  hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;
  hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  hdma_usart1_rx.Init.Mode = DMA_NORMAL;
  hdma_usart1_rx.Init.Priority = DMA_PRIORITY_LOW;
  HAL_DMA_Init(&hdma_usart1_rx);
  __HAL_LINKDMA(&huart1,hdmarx,hdma_usart1_rx);
	
  HAL_NVIC_SetPriority(DMA1_Channel5_IRQn,1,2);
  HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);

}

void USART1_IRQHandler()
{
  HAL_UART_IRQHandler(&huart1);
	uint32_t temp;
	if(USART1 == huart1.Instance)
	{	
		if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))
		{
			__HAL_UART_CLEAR_IDLEFLAG(&huart1);
			HAL_UART_DMAStop(&huart1);
			temp  = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
			Rx_len =  BUFFERSIZE - temp; 
			recv_end_flag = 1;
		}
	}
}

int fputc(int ch,FILE *f)
{
	while(!(USART1->SR&(1<<7)));
	USART1->DR=ch;
  return ch;
}

void UART1_DMA_Get()
{
	if(recv_end_flag==1)
	{
		printf("rx_len=%d\n",Rx_len);
		printf("%s\n",ReceiveBuff);	  
		for(int i=0;i<Rx_len;i++) 
		ReceiveBuff[i]=0;
		Rx_len=0;
		recv_end_flag=0;
	}
	HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 如果只是跑一个DMA串口的程序,应该不会是RAM问题。因为RAM是一样的。贴下报错的说明看看。
    ps:其实C8T6的程序,可以使用CBT6型号来写,不会有问题的。
    • 发布于 2018-01-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :贴片式安装,回流焊焊接。一般都是用锡膏。 回复

其他答案 数量:2
  • 判断是RAM大小的问题,就考虑外挂SRAM呗
    • 发布于2018-01-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :CL6N5-G 回复

  • 这个芯片是同系列的,相互兼容的。

    RAM也是相同的,只是flash容量CB要大一些。

    建议楼主还是看看程序本身吧!

    您是通过cube生成的,我个人不太喜欢这个库与代码编写风格,所以接触较少。

    我建议楼主写一个流程图,我觉得您了是在中断里面打开了DMA接收,好像是在中断里做了好多的事情

    • 发布于2018-01-25
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :台湾康扬厂牌主要生产五金配件产品。没有连接器产品系列 回复

相关问题

问题达人换一批

F103板子RAM和串口DMA的问题