l 串口时钟使能,GPIO时钟使能:
RCC_APB2PeriphClockCmd();
l 串口复位:
USART_DeInit(); 这一步不是必须的
l GPIO端口模式设置:
GPIO_Init();
l 串口参数初始化:
USART_Init();
l 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig();
l 使能串口:
USART_Cmd();
l 编写中断处理函数:
USARTx_IRQHandler();
l 串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
l 串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
l 源代码:
1 #pragma import(__use_no_semihosting) 2 struct __FILE 3 { 4 int handle; 5 }; 6 7 FILE __stdout; 8 void _sys_exit(int x) 9 { 10 x = x; 11 } 12 int fputc(int ch, FILE *f) 13 { 14 while((USART1->SR&0X40)==0); 15 USART1->DR = (u8) ch; 16 return ch; 17 } 18 19 void uart_init(u32 bound){ 20 //GPIO¶Ë¿ÚÉèÖà 21 GPIO_InitTypeDef GPIO_InitStructure; 22 USART_InitTypeDef USART_InitStructure; 23 NVIC_InitTypeDef NVIC_InitStructure; 24 25 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜUSART1£¬GPIOAʱÖÓ 26 27 //USART1_TX GPIOA.9 28 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 29 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 30 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö 31 GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.9 32 33 //USART1_RX GPIOA.10³õʼ»¯ 34 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 35 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë 36 GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯GPIOA.10 37 38 //Usart1 NVIC ÅäÖà 39 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 40 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//ÇÀÕ¼ÓÅÏȼ¶3 41 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×ÓÓÅÏȼ¶3 42 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ 43 NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ 44 45 //USART ³õʼ»¯ÉèÖà 46 USART_InitStructure.USART_BaudRate = bound;//´®¿Ú²¨ÌØÂÊ 47 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö³¤Îª8λÊý¾Ý¸ñʽ 48 USART_InitStructure.USART_StopBits = USART_StopBits_1;//Ò»¸öֹͣλ 49 USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæżУÑéλ 50 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎÞÓ²¼þÊý¾ÝÁ÷¿ØÖÆ 51 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ÊÕ·¢Ä£Ê½ 52 53 USART_Init(USART1, &USART_InitStructure); //³õʼ»¯´®¿Ú1 54 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//¿ªÆô´®¿Ú½ÓÊÜÖÐ¶Ï 55 USART_Cmd(USART1, ENABLE); //ʹÄÜ´®¿Ú1 56 57 } 58 59 void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò 60 { 61 u8 Res; 62 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //½ÓÊÕÖжÏ(½ÓÊÕµ½µÄÊý¾Ý±ØÐëÊÇ0x0d 0x0a½áβ) 63 { 64 Res =USART_ReceiveData(USART1); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý 65 66 if((USART_RX_STA&0x8000)==0)//½ÓÊÕδÍê³É 67 { 68 if(USART_RX_STA&0x4000)//½ÓÊÕµ½ÁË0x0d 69 { 70 if(Res!=0x0a)USART_RX_STA=0;//½ÓÊÕ´íÎó,ÖØпªÊ¼ 71 else USART_RX_STA|=0x8000; //½ÓÊÕÍê³ÉÁË 72 } 73 else //»¹Ã»ÊÕµ½0X0D 74 { 75 if(Res==0x0d)USART_RX_STA|=0x4000; 76 else 77 { 78 USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; 79 USART_RX_STA++; 80 if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//½ÓÊÕÊý¾Ý´íÎó,ÖØпªÊ¼½ÓÊÕ 81 } 82 } 83 } 84 }