LL库_STM32F407_UART_IT_DMA

相关文件

stm32f4xx_ll_usart.h
stm32f4xx_ll_usart.c
stm32f4xx_ll_dma.h
stm32f4xx_ll_dma.c

相关库函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

轮询示例

在这里插入图片描述

开启printf函数

方法一:

#include <string.h>//用于字符串处理的库
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>

#define USART1_REC_LEN 200
uint16_t USART1_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14:接收到0x0d,bit13~0:接收到的有效字节数目
uint8_t USART1_NewData;//当前串口中断接收的1个字节数据的缓存
void USART1_printf (char *fmt, ...)
{
    char buff[USART1_REC_LEN+1];  //用于存放转换后的数据 [长度]
    uint16_t i=0,i1;
    va_list arg_ptr;
    va_start(arg_ptr,fmt);
    vsnprintf(buff, USART1_REC_LEN+1,fmt,arg_ptr);//数据转换
    i=strlen(buff);//得出数据长度
    if(strlen(buff)>USART1_REC_LEN)i=USART1_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
    for(i1=0;i1<i;i1++){
    	while(LL_USART_IsActiveFlag_TXE(USART1)==RESET);
    	LL_USART_TransmitData8(USART1,buff[i1]);
    }
    va_end(arg_ptr);
}

方法二:

#include "stdio.h"

#ifdef __GNUC__
/* With GCC, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART1 and Loop until the end of transmission */
  LL_USART_TransmitData8(USART1, ch);
  while(!LL_USART_IsActiveFlag_TXE(USART1)){

  }
  return ch;
}

注意:不要忘了开启浮点数支持
在这里插入图片描述

开启中断接收

在这里插入图片描述
在这里插入图片描述

开启DMA接收和发送

/*接收配置*/
  LL_DMA_ConfigAddresses(DMA2, LL_DMA_STREAM_2, LL_USART_DMA_GetRegAddr(USART1),
		  (uint32_t)rx_buf,LL_DMA_GetDataTransferDirection(DMA2, LL_DMA_STREAM_2));
  LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_2, sizeof(rx_buf));
  //使能DMA2接收完成中断
  LL_DMA_EnableIT_TC(DMA2,LL_DMA_STREAM_2);
  //使能DMA2接收错误中断
  LL_DMA_EnableIT_TE(DMA2, LL_DMA_STREAM_2);


  /*发送配置*/
  LL_DMA_ConfigAddresses(DMA2, LL_DMA_STREAM_7, (uint32_t)tx_buf,LL_USART_DMA_GetRegAddr(USART1),
  		  LL_DMA_GetDataTransferDirection(DMA2, LL_DMA_STREAM_7));
  LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_7, sizeof(tx_buf));
  //使能DMA2发送完成中断
  LL_DMA_EnableIT_TC(DMA2,LL_DMA_STREAM_7);
  //使能DMA2发送错误中断
  LL_DMA_EnableIT_TE(DMA2, LL_DMA_STREAM_7);

  //开始传输
  //使能DMA串口接收
  LL_USART_EnableDMAReq_RX(USART1);
  //使能接收的DMA2 STREAM_2
  LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_2);

  //使能DMA串口发送
  LL_USART_EnableDMAReq_TX(USART1);
//  //使能发送的DMA2 STREAM_2
//  LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_7);

  //使能串口空闲中断
  LL_USART_EnableIT_IDLE(USART1);
  /* USER CODE END USART1_Init 2 */
/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	if(LL_USART_IsActiveFlag_IDLE(USART1)){


		LL_USART_ClearFlag_IDLE(USART1);
	}
  /* USER CODE END USART1_IRQn 0 */
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

/**
  * @brief This function handles DMA2 stream2 global interrupt.
  */
void DMA2_Stream2_IRQHandler(void)
{
  /* USER CODE BEGIN DMA2_Stream2_IRQn 0 */
	uint8_t i;
	//usart1_rx
	if(LL_DMA_IsActiveFlag_TC2(DMA2)){

		for(i=0;i<sizeof(rx_buf);i++){
			tx_buf[i]=rx_buf[i];
		}

		//再次使能发送
		LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_7);
		LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_7, sizeof(tx_buf));
		LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_7);

		LL_DMA_ClearFlag_TC2(DMA2);
	}else if(LL_DMA_IsActiveFlag_TE2(DMA2)){


		//再次使能发送
		LL_DMA_DisableStream(DMA2, LL_DMA_STREAM_7);
		LL_DMA_SetDataLength(DMA2, LL_DMA_STREAM_7, sizeof(tx_buf));
		LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_7);

		LL_DMA_ClearFlag_TE2(DMA2);
	}
  /* USER CODE END DMA2_Stream2_IRQn 0 */

  /* USER CODE BEGIN DMA2_Stream2_IRQn 1 */

  /* USER CODE END DMA2_Stream2_IRQn 1 */
}

UID读取

在这里插入图片描述

#define UID_BASH 0x1FFF7A10
	USART1_printf("%x %x %x\r\n",*(uint32_t *)UID_BASH,*(uint32_t *)UID_BASH+0x04,*(uint32_t *)UID_BASH+0x08);

FLASH大小读取

在这里插入图片描述

#define  FLASH_SIZE 0x1FFF7A22
	USART1_printf("%x",*(uint32_t *)FLASHSIZE_BASE);
  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦哟啊哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值