[STM32F103]串口UART配置

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      } 

猜你喜欢

转载自www.cnblogs.com/zhaohu/p/9975019.html