• [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      } 
  • 相关阅读:
    CentOS 下安装apt-get
    Centos 6.5升级到Git2.1.2的步骤
    JAVA常识积累
    Android网络编程概述
    解读ClassLoader
    android ndk调用OpenGL 实现纹理贴图Texture
    android Bind机制(二)
    Android Binder机制原理(史上最强理解,没有之一)(转)
    NDK常见问题
    根因分析初探:一种报警聚类算法在业务系统的落地实施
  • 原文地址:https://www.cnblogs.com/zhaohu/p/9975019.html
Copyright © 2020-2023  润新知