【库函数版】 #include <stm32f10x.h>
void delay(void) { uint32_t i; for (i = 0; i < 2000000; i++); }
void config_gpio(void) { GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // LED灯 gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); gpio.GPIO_Mode = GPIO_Mode_AF_PP; gpio.GPIO_Pin = GPIO_Pin_9; // TX GPIO_Init(GPIOA, &gpio); gpio.GPIO_Mode = GPIO_Mode_IPU; gpio.GPIO_Pin = GPIO_Pin_10; // RX GPIO_Init(GPIOA, &gpio); }
void config_usart(void) { USART_InitTypeDef usart; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_StructInit(&usart); // 直接采用默认的串口参数 USART_Init(USART1, &usart); USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); // 允许通过DMA发送数据 USART_Cmd(USART1, ENABLE); }
// 用DMA方式发送批量数据 void usart_send_data(void *data, uint16_t size) { DMA_InitTypeDef dma; DMA_StructInit(&dma); dma.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR; dma.DMA_MemoryBaseAddr = (uint32_t)data; dma.DMA_DIR = DMA_DIR_PeripheralDST; // 从主存到外设 dma.DMA_BufferSize = size; dma.DMA_MemoryInc = DMA_MemoryInc_Enable; // 主存地址自动后移 DMA_Init(DMA1_Channel4, &dma); DMA_Cmd(DMA1_Channel4, ENABLE); }
int main(void) { config_gpio(); config_usart(); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 开机时必须等到TC=1后才能发送数据 USART_SendData(USART1, 'a'); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待字符发送完毕 USART_SendData(USART1, '\n'); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); usart_send_data("Hello World!\n", 13); // 用DMA方式发送 while (1) { delay(); GPIO_SetBits(GPIOB, GPIO_Pin_8); delay(); GPIO_ResetBits(GPIOB, GPIO_Pin_8); } }
|