/*******************************************************************************
* Function Name : UART8_CFG
* Description : Initializes the USART8 peripheral.
* 描述 : 串口初始化
* Input : None
* Return : None
*******************************************************************************/
void UART8_CFG(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART8, ENABLE);
GPIO_PinRemapConfig(GPIO_FullRemap_USART8, ENABLE);
/* USART6 TX-->E14*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600; // 波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位 8
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位 1
USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Tx; //使能 RX 和 TX
USART_Init(UART8, &USART_InitStructure);
USART_Cmd(UART8, ENABLE); //开启UART
}
void DMA10_INIT(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
// TX DMA 初始化
DMA_DeInit(DMA2_Channel10);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&UART8->DATAR); // DMA 外设基址,需指向对应的外设
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)yuyinBuffer; // DMA 内存基址,指向发送缓冲区的首地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 方向 : 外设 作为 终点,即 内存 -> 外设
DMA_InitStructure.DMA_BufferSize = 0; // 缓冲区大小,即要DMA发送的数据长度,目前没有数据可发
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址自增,禁用
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址自增,启用
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据位宽,8位(Byte)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 内存数据位宽,8位(Byte)
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 普通模式,发完结束,不循环发送
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // 优先级最高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // M2P,禁用M2M
DMA_Init(DMA2_Channel10, &DMA_InitStructure);
}
/*******************************************************************************
* Function Name : uartWriteYuyin
* Description : send data to ESP8266 via UART6
* 描述 : 向 WiFi 模组发送数据
* Input : char * data data to send 要发送的数据的首地址
* uint16_t num number of data 数据长度
* Return : RESET UART6 busy,failed to send 发送失败
* SET send success 发送成功
*******************************************************************************/
FlagStatus uartWriteYuyin(char * data , uint16_t num)
{
//如上次发送未完成,返回
if(DMA_GetCurrDataCounter(DMA2_Channel10) != 0){
lcd_show_string(0, 90, 24,"cscs555");
return RESET;
}
lcd_show_string(0, 90, 24,data);
DMA_ClearFlag(DMA2_FLAG_TC10);
DMA_Cmd(DMA2_Channel10, DISABLE ); // 关 DMA 后操作
DMA2_Channel10->MADDR = (uint32_t)data; // 发送缓冲区为 data
DMA_SetCurrDataCounter(DMA2_Channel10,num); // 设置缓冲区长度
DMA_Cmd(DMA2_Channel10, ENABLE); // 开 DMA
return SET;
}
/*******************************************************************************
* Function Name : uartWriteYuyinStr
* Description : send string to ESP8266 via UART6 向 WiFi 模组发送字符串
* Input : char * str string to send
* Return : RESET UART busy,failed to send 发送失败
* SET send success 发送成功
*******************************************************************************/
FlagStatus uartWriteYuyinStr(char * str)
{
uint16_t num = 0;
while(str[num])num++; // 计算字符串长度
return uartWriteYuyin(str,num);
}
int main(void)
{
UART8_CFG();
DMA10_INIT();
USART_DMACmd(UART8,USART_DMAReq_Tx,ENABLE);
while(1){
char yuyin[] = "123456";
uartWriteYuyinStr(yuyin);
delay_ms(2000);
}
}
请问代码有问题吗?感谢回答(注释有些没改)。