新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2023-1-20
- 在线时间
- 6 小时
|
10金钱
调试H750串口DMA发送两周了,还是不能启动发送,但是用HAL_UART_Transmit()函数是可以发送的。
用正点原子的例程没有问题,但是将烧写算法改为“STM32H750XX”后就不能发送了,难道DMA发送和烧写算法有关系?
将正点原子的例程简化了,只提出串口DMA发送的相关部分,也是不行。
还用了“野火”的DMA串口发送例程,是可以正常发送的,但将“野火”例程移植到正点原子的模版里就不行了。
哪位大神指点一下到底是怎么回事。
下面是源程序:变量定义部分就没有列出了。
//**********************************************************************************//int main(void)
{
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(160,5,2,4); //设置时钟,400Mhz
delay_init(400); //延时初始化
LED_Init(); //初始化LED时钟
uart_init(115200); //串口初始化
USART_DMA_Config(); //DMA配置
for (i=0; i<Send_SUM; i++)
USART1_Tx[i] = 0xAA;
while(1)
{
HAL_UART_DMAStop(&UART1_Handler); //必须先关闭一次DMA
HAL_UART_Transmit_DMA (&UART1_Handler, (uint8_t *)USART1_Tx, Send_SUM); //启动DMA传输
delay_ms(1000);
}
}
//**********************************************************************************//
//************** 初始化串口1及相关配置STAR ***************************//
void uart_init(u32 bound)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟
GPIO_Initure.Pin = GPIO_PIN_9; //PA9
GPIO_Initure.Mode = GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_10; //PA10
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
UART1_Handler.Instance=USART1; //USART1
UART1_Handler.Init.BaudRate=bound; //波特率
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART1_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
UART1_Handler.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
UART1_Handler.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&UART1_Handler); //使能UART1
}
//************** 初始化串口1及相关配置END ***************************//
//************** DMA配置START ***************************//
void USART_DMA_Config(void)
{
__DMA2_CLK_ENABLE(); /*开启DMA时钟*/
UART1DMA_Handle.Instance = DMA2_Stream7;
HAL_DMA_DeInit(&UART1DMA_Handle);
UART1DMA_Handle.Init.Request = DMA_REQUEST_USART1_TX;
UART1DMA_Handle.Init.Direction= DMA_MEMORY_TO_PERIPH;
UART1DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE;
UART1DMA_Handle.Init.MemInc = DMA_MINC_ENABLE;
UART1DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
UART1DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
UART1DMA_Handle.Init.Mode = DMA_NORMAL;
UART1DMA_Handle.Init.Priority = DMA_PRIORITY_MEDIUM;
UART1DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
UART1DMA_Handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
UART1DMA_Handle.Init.MemBurst = DMA_MBURST_SINGLE;
UART1DMA_Handle.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&UART1DMA_Handle);
__HAL_LINKDMA(&UART1_Handler, hdmatx, UART1DMA_Handle);
}
//************** DMA配置END ***************************//
|
|