| 
              【库函数版】#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);
 }
 }
 
 |