写了个很简单的测试程序.
[mw_shl_code=c,true]#include "stm32f0xx.h"
#define GPIO_AF_USART1 GPIO_AF_1
const uint32_t SRC_Const_Buffer[32] =
{
0x01020304, 0x05060708, 0x090A0B0C, 0x0D0E0F10,
0x11121314, 0x15161718, 0x191A1B1C, 0x1D1E1F20,
0x21222324, 0x25262728, 0x292A2B2C, 0x2D2E2F30,
0x31323334, 0x35363738, 0x393A3B3C, 0x3D3E3F40,
0x41424344, 0x45464748, 0x494A4B4C, 0x4D4E4F50,
0x51525354, 0x55565758, 0x595A5B5C, 0x5D5E5F60,
0x61626364, 0x65666768, 0x696A6B6C, 0x6D6E6F70,
0x71727374, 0x75767778, 0x797A7B7C, 0x7D7E7F80
};
void USART1_Test()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
//打开时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//GPIO复用
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART1);
//串口IO初始化公共部分
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//TX IO 初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//RX IO 初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置串口
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
//初始化串口
USART_Cmd(USART1, ENABLE);
//配置DMA,TDR寄存器填写.
DMA_DeInit(DMA1_Channel2);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->TDR); //外设寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Const_Buffer;//待发送缓冲区
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设作为目标地址
DMA_InitStructure.DMA_BufferSize = 32;//传输大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//源地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//每次发送都是Byte
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//字节
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//单次传输
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//不是内存到内存传输
DMA_Init(DMA1_Channel4, &DMA_InitStructure);//初始化
//使能DMA USART传输
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
DMA_Cmd(DMA1_Channel2, ENABLE);
}
int main(void)
{
USART1_Test();
for(;;)
{
}
}
[/mw_shl_code]
串口配置是没错的,用USART_SendData试过,但是加上DMA不知道如何配置,反正现在没法送数据出来.程序简化成这样了,有注释,求助大家帮忙看看. |