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);